spring - 自定义注解

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

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将在运行期也保留注释,因此可以通过反射机制读取注解的信息。

一、注解类源码

/**
 * 方法访问角色注解
 */  

@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>
时间: 2024-11-05 13:27:53

spring - 自定义注解的相关文章

Spring自定义注解实现Controller获取想要的数据

最近看组内一个哥们写了一个HandlerAdapter,能自动获取Http请求里面的Cookie并组装成一个Model来直接使用.觉得很牛逼.因此自己做了一个,特来分享. 原理: 利用org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter. 在DispatcherServlet里面定义了: private List<HandlerAdapter> handlerAdapters; 用于

创建spring自定义注解进行自动装配

1.创建自定义注解 1 import org.springframework.beans.factory.annotation.Qualifier; 2 import java.lang.annotation.ElementType; 3 import java.lang.annotation.Retention; 4 import java.lang.annotation.RetentionPolicy; 5 import java.lang.annotation.Target; 6 7 8

Spring自定义注解扫描的实现

目标:实现自定义spring自动扫描注解.主要为后期实现分布式服务框架自动注解提供技术支持 技术分析:通过配置组件扫描标签使spring解析标签. 1. JewelScanBeanDefaultParser.java public class JewelScanBeanDefaultParser implements BeanDefinitionParser { private static final String RESOURCE_PATTERN = "/**/*.class";

深入Spring 自定义注解加载和使用

前言 在工作中经常使用Spring的相关框架,免不了去看一下Spring的实现方法,了解一下Spring内部的处理逻辑.特别是开发Web应用时,我们会频繁的定义@Controller,@Service等JavaBean组件,通过注解,Spring自动扫描加载了这些组件,并提供相关的服务.Spring是如何读取注解信息,并注入到bean容器中的,本文就是通过嵌入Spring的Bean加载,来描述Spring的实现方法.完整的例子都在Github上了. 自定义注解 先看一个最简单的例子,在使用Spr

【转】spring 自定义注解(annotation)与 aop获取注解

首先我们先介绍Java自定义注解. 在开发过程中,我们实现接口的时候,会出现@Override,有时还会提示写@SuppressWarnings.其实这个就是Java特有的特性,注解. 注解就是某种注解类型的一种实例,我们可以把它用在某个类上进行标注.下面这张图解释注解都是什么? 上图可以看出注解大体分为三种:元注解,标记注解,一般注解: 这一块其他的我就不多做介绍,我们这里主要说一下如何定义自己的注解,在这之前我们必须了解标准元注解和相关定义注解的语法.元注解的作用就是负责注解其他注解.Jav

SpringMVC拦截器+Spring自定义注解实现权限验证

设计思路 主要针对需要登录后操作的接口进行校验.接入层在对外暴露接口后,网页.APP.第三方等等途径进行访问接口.用户请求首先会被SpringMVC拦截器拦截到,在拦截器里第一步就是需要校验用户的登录身份(由于是分布式系统这里采用的是userId+accessToken方式来校验),登录校验通过之后再进行用户权限校验,此时会自动拦截@AuthValidate注解的method(核心),如果权限校验失败则抛出权限不足异常,否则校验通过之后再执行具体接口并返回结果. 1.自定义注解 1 packag

使用Spring自定义注解生产Http接口描述信息

最近在做一个手机后台项目,使用的是SpringMVC,开发的接口是HTTP接口.在接口写完后需要在网页中吧接口的名称测试地址等信息添加到网页中,感觉这样很麻烦还容易漏.于是就写了一个自定义注解通过注解的方式将接口的描述信息加入到接口中,通过注解描述接口信息并且生产接口测试地址 先看使用方法及最终效果 @ResponseBody @RequestMapping("/getBusWaiting") @AppInterface(value="获取候车信息",group=&

spring --自定义注解(配合@Aspect)

1:首先,声明自定义注解 @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD}) public @interface DtTransactional { /* * Whether need to rollback */ public boolean includeLocalTransaction() default true; public boolean confirmMethodExist() default tru

aspectj 与 spring 自定义注解

** * ErrorCode: * * @author yangzhenlong * @since 2016/7/21 */ @Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited public @interface ErrorException { int code() default 0;//参数 } 复制代码 Aspect拦截注解类 复制代码 /** * ErrorEx