`

Spring自定义注解

 
阅读更多
java自定义注解 http://my.oschina.net/OkSerIous/blog/402718
深入理解Java:注解(Annotation)自定义注解入门 http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html

http://chenjumin.iteye.com/blog/454459

Pattern属性符: (.) 符合任何单一字符  (+)符合前一个字符一次或多次  (*)符合前一个字符零次或多次.

本自定义注解的作用:用于控制类方法的调用,只有拥有某个角色时才能调用。

java内置注解
     1、@Target 表示该注解用于什么地方,可能的 ElemenetType 参数包括: 
            ElemenetType.CONSTRUCTOR   构造器声明 
            ElemenetType.FIELD   域声明(包括 enum 实例) 
            ElemenetType.LOCAL_VARIABLE   局部变量声明 
            ElemenetType.METHOD   方法声明 
            ElemenetType.PACKAGE   包声明 
            ElemenetType.PARAMETER   参数声明 
            ElemenetType.TYPE   类,接口(包括注解类型)或enum声明
   
     2、@Retention 表示在什么级别保存该注解信息。可选的 RetentionPolicy 参数包括: 
           RetentionPolicy.SOURCE   注解将被编译器丢弃 
           RetentionPolicy.CLASS   注解在class文件中可用,但会被VM丢弃 
           RetentionPolicy.RUNTIME   VM将在运行期也保留注释,因此可以通过反射机制读取注解的信息。



Spring自定义注解
一、注解类源码
/** 
 * 方法访问角色注解 
 */  
  
@Target(ElementType.METHOD)  
@Retention(RetentionPolicy.RUNTIME)  
@Documented  
@Inherited  
public @interface VisitorRole {  
    String value();  
}  


二、Person类的源码。该类使用了自定义注解。
@Component("person")   //此处通过注解的方式定义受管Bean  
public class Person {  
    private String userId = "cjm";  
    private String userName = "jumin.chen";  
      
    @VisitorRole("ADMIN")   //自定义注解的使用。只有具有ADMIN角色才能调用本方法。  
    public String say(){  
        return "I'm " + userName;  
    }  
}
 

三、通过环绕通知对方法进行拦截,只有当角色匹配时,才能执行方法。
/** 
 * 环绕通知:在类方法调用前,先判断角色是否匹配。 
 */  
@Component("visitorRoleAdvice")  
public class VisitorRoleAdvice implements MethodInterceptor {  
    public Object invoke(MethodInvocation invocation) throws Throwable {  
        if(invocation.getMethod().isAnnotationPresent(VisitorRole.class)){ //有指定注解  
            String role = null;  
            Annotation annotation = invocation.getMethod().getAnnotation(VisitorRole.class); //获取指定注解  
            if(annotation!=null){  
                role = ((VisitorRole)annotation).value(); //从注解中获取角色  
            }  
              
            if("ADMIN".equals(role)){  
                return invocation.proceed();  //角色匹配,继续执行方法  
            }else{  
                System.out.println("没有角色权限!");  
                return null;  
            }  
              
        }else{ //类方法没有自定义注解,直接执行该方法  
            return invocation.proceed();  
        }  
    }  
}  

 
四、Spring配置
<!-- 声明通过注解定义bean,同时也通过注解自动注入 -->  
<context:component-scan base-package="com.cjm" annotation-config="true"/>  
  
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>    
  
<bean id="nameMatchMethodPointcutAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">    
    <property name="advice" ref="visitorRoleAdvice"/>    
    <property name="mappedNames">    
        <list>    
            <value>say</value>    
        </list>    
    </property>    
</bean>
 

注意:
1.监视annotationTest和save开头的方法。
	<bean id="nameMatchMethodPointcutAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">      
	    <property name="advice" ref="myAnnotationAdvice"/>      
	    <property name="mappedNames">      
	        <list>      
	            <value>annotationTest*</value>
                    <value>save*</value>
	        </list>      
	    </property>
	</bean>

2.监视所有com开头的方法,包括com.XXX.XXX......()方法。
Pattern属性符:
(.) 符合任何单一字符  (+)符合前一个字符一次或多次  (*)符合前一个字符零次或多次
	<bean id="regexpMethodPointcutAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">      
	    <property name="advice" ref="myAnnotationAdvice"/>      
	    <property name="patterns" value="com.+">      
	    </property>
	</bean>



spring 拦截器 spring自定义注解,访问HttpServletRequest等方式 http://blog.csdn.net/zhuyangxing/article/details/18796091
最近项目里加上了用户权限,有些操作需要登录,有些操作不需要,之前做项目做权限,喜欢使用过滤器,但在此使用过滤器比较死板,如果用的话,就必须在配置文件里加上所有方法,而且 不好使用通配符。所以想了想,之前在人人用过的一种比较简单灵活的权限判断,是采用Spring 的 methhodInterceptor拦截器完成的,并且是基于注解的。
现在自己写了一套。大概是用法是这样的:
 @LoginRequired  
 @RequestMapping(value = "/comment")  
 public void comment(HttpServletRequest req, HttpServletResponse res) {  
    // doSomething,,,,,,,,  
}  

我是在Spring mvc 的controller层的方法上拦截的,注意上面的@LoginRequired 是我自定义的注解。这样的话,该方法被拦截后,如果有该 注解,则表明该 方法需要用户登录后才能执行某种操作,于是乎,我们可以判断request里的session或者Cookie是否包含用户已经登录的身份,然后判断是否执行该方法;如果没有,则执行另一种操作。
-------------------------------------------------------------------------
下面是自定义注解的代码:
package com.qunar.wireless.ugc.controllor.web;  
  
import java.lang.annotation.ElementType;  
import java.lang.annotation.Retention;  
import java.lang.annotation.RetentionPolicy;  
import java.lang.annotation.Target;  
  
@Target(ElementType.METHOD)  
@Retention(RetentionPolicy.RUNTIME)  
public @interface LoginRequired  {  
     
}  

-----------------------------------------------------------------------------
下面是自定义的方法拦截器,继续自aop的MethodInterceptor
import javax.servlet.http.HttpServletRequest;  
import org.aopalliance.intercept.MethodInterceptor;  
import org.aopalliance.intercept.MethodInvocation;  
import com.qunar.wireless.ugc.controllor.web.LoginRequired;  
  
  
/** 
 * @author tao.zhang 
 * @create-time 2012-2-31 
 */  
public class LoginRequiredInterceptor1 implements MethodInterceptor {  
  
  
    @Override  
    public Object invoke(MethodInvocation mi) throws Throwable {  
              
        Object[] ars = mi.getArguments();  
            
        for(Object o :ars){  
            if(o instanceof HttpServletRequest){  
               System.out.println("------------this is a HttpServletRequest Parameter------------ ");  
            }  
        }  
        // 判断该方法是否加了@LoginRequired 注解  
        if(mi.getMethod().isAnnotationPresent(LoginRequired.class)){  
             System.out.println("----------this method is added @LoginRequired-------------------------");  
        }  
       //执行被拦截的方法,切记,如果此方法不调用,则被拦截的方法不会被执行。  
        return mi.proceed();  
    }  
}  

------------------------------------------------------------------------
配置文件:
<bean id="springMethodInterceptor" class="com.qunar.wireless.ugc.interceptor.LoginRequiredInterceptor1" ></bean>  
    <aop:config>  
                 <!--切入点-->  
                 <aop:pointcut id="loginPoint"  
                 expression="execution(public * com.qunar.wireless.ugc.controllor.web.*.*(..)) "/>   
                 <!--在该切入点使用自定义拦截器-->  
                 <aop:advisor pointcut-ref="loginPoint" advice-ref="springMethodInterceptor"/>  
      </aop:config>  
分享到:
评论

相关推荐

    spring自定义注解样例

    总结来说,Spring自定义注解和AOP的结合使用,让我们能够灵活地在代码中插入跨切面的关注点,如日志记录、事务管理、性能监控等,而不必在每个方法中手动添加这些代码。这不仅提高了代码的整洁度,也使得系统更加...

    Spring 自定义注解的解析

    总的来说,Spring自定义注解的解析是一个强大且灵活的工具,可以帮助我们实现更精细化的代码组织和控制。结合`@ComponentScan`,我们可以轻松地在Spring环境中管理和利用自定义注解,进一步提升代码的可读性和可维护...

    spring自定义注解+Aspect使用1

    Spring 自定义注解和 Aspect 的使用 在本文中,我们将学习如何在 Spring 项目中使用自定义注解和 Aspect 来实现日志记录功能。我们将从头开始,创建一个简单的 Spring Boot 项目,然后使用自定义注解和 Aspect 来...

    Spring 自定义注解注入properties文件的值jar包

    Spring 自定义注解注入properties文件的值jar包,下面为使用方法 在xml配置文件中,这样加载properties文件 ...

    浅谈Spring自定义注解从入门到精通

    浅谈Spring自定义注解从入门到精通 在业务开发过程中,我们经常会遇到形形色色的注解,但是框架自有的注解并不是总能满足复杂的业务需求。这时,我们可以自定义注解来满足我们的需求。根据注解使用的位置,文章将...

    spring aop 自定义注解保存操作日志到mysql数据库 源码

    3、对spring aop认识模糊的,不清楚如何实现Java 自定义注解的 4、想看spring aop 注解实现记录系统日志并入库等 二、能学到什么 1、收获可用源码 2、能够清楚的知道如何用spring aop实现自定义注解以及注解的逻辑...

    自定义注解得使用,模拟spring通过注解方式创建bean实例

    本篇将深入探讨如何自定义注解并模拟Spring通过注解方式创建bean实例。 首先,了解注解(Annotation)在Java中的角色。注解是一种元数据,它提供了在源代码中添加信息的方式,这些信息可以被编译器或运行时环境读取...

    详解使用Spring AOP和自定义注解进行参数检查

    使用Spring AOP和自定义注解进行参数检查 了解使用Spring AOP和自定义注解进行参数检查的技术细节。通过自定义注解和spring AOP,我们可以实现参数的校验,提高代码的可读性和可维护性。 自定义注解 在本篇文章中...

    使用SpringBoot通过自定义注解+AOP+全局异常处理实现参数统一非空校验源码

    使用SpringBoot通过自定义注解+AOP+全局异常处理实现参数统一非空校验

    spring中自定义注解(annotation)与AOP中获取注解

    在Spring框架中,自定义注解(Annotation)和AOP(面向切面编程)的结合使用,极大地增强了代码的可读性和可维护性。本文将深入探讨如何在Spring中创建自定义注解以及如何在AOP中有效地获取并利用这些注解。 首先,...

    spring自定义注解实现拦截器的实现方法

    在Spring框架中,自定义注解结合AOP(面向切面编程)是实现业务逻辑与非业务逻辑分离的一种有效方式。通过自定义注解,可以针对不同的业务场景灵活地添加功能,比如权限控制、日志记录、事务管理等。本文将详细讨论...

    丛林探险之Spring自定义注解加载Bean

    这个机制在实际开发中有着广泛的应用,比如在微服务框架如Dubbo中,通过自定义注解可以方便地将服务提供者和服务消费者自动注册到Spring容器,简化配置,提高代码可读性和可维护性。通过理解和掌握这一机制,开发者...

    Spring java注解,元注解和自定义注解

    ### Spring Java注解、元注解与自定义注解详解 #### 一、Java注解简介 在深入了解Spring框架中的注解应用之前,我们首先需要对Java注解有一个基本的认识。Java注解(Annotation)是一种元数据,可以为程序代码添加...

    Java自定义注解与spring BeanPostProcessor详解

    Java自定义注解和Spring的BeanPostProcessor是Java企业级开发中的两个重要概念,它们在构建灵活、可扩展的应用程序中发挥着关键作用。本文将深入探讨这两个话题,并结合源码分析,帮助开发者更好地理解和应用。 ...

    java 自定义注解验证

    Java 自定义注解验证是Java开发中的一个重要特性,它允许开发者创建自己的元数据,以便在编译时或运行时对代码进行验证和处理。自定义注解为代码提供了额外的信息,使得程序更具可读性、可维护性和灵活性。在本案例...

    java(spring boot)自定义注解

    在这个特定的场景中,我们探讨的是如何在Spring Boot应用中自定义注解,以及如何利用这个注解进行系统监控的开发。 首先,让我们理解什么是自定义注解。在Java中,注解(Annotation)是一种元数据,它提供了向...

    使用Java自定义注解模拟实现SpringBoot相关注解.zip

    本教程将探讨如何使用Java自定义注解来模拟实现这些SpringBoot相关的注解功能。 首先,我们来看`@Autowired`注解。`@Autowired`是Spring框架中的一个关键注解,用于自动装配bean。当我们想在类中注入某个依赖时,而...

    自定义注解结合Hutool对SpringBoot接口返回数据进行脱敏

    自定义注解结合Hutool对SpringBoot接口返回数据进行脱敏 自定义注解结合Hutool对SpringBoot接口返回数据进行脱敏 自定义注解结合Hutool对SpringBoot接口返回数据进行脱敏 自定义注解结合Hutool对SpringBoot接口返回...

    自定义注解实现伪动态传参的小demo

    在这个“自定义注解实现伪动态传参的小demo”中,我们将探讨如何创建一个自定义注解,以允许在注解中传递类似于动态参数的数据。 首先,自定义注解的定义通常以`@interface`关键字开始,我们可以定义一些元素(也...

    实现生成自定义注解的实体类

    在服务端开发中,如Spring框架,自定义注解可以用于简化配置,增强功能。例如,可以创建一个用于事务管理的注解: ```java @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @...

Global site tag (gtag.js) - Google Analytics