yangzongzhuan / RuoYi

:tada: (RuoYi)官方仓库 基于SpringBoot的权限管理系统 易读易懂、界面简洁美观。 核心技术采用Spring、MyBatis、Shiro没有任何其它重度依赖。直接运行即可用
http://ruoyi.vip
MIT License
6.37k stars 1.89k forks source link

匿名接口注解——匿名注解解析方式优化 #239

Open LeoTan2004 opened 6 months ago

LeoTan2004 commented 6 months ago

SpringAOP获取注解的方式

RequestMapping base = AnnotationUtils.getAnnotation(beanClass, RequestMapping.class);

这种方式能不仅能够获取直接使用在这个类上面的注解,也可以获取该类上的注解的元注解。 我们以RequestMappingPostMapping为例(简化后)

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {
    String[] value() default {};
}
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@RequestMapping(method = RequestMethod.POST)
public @interface PostMapping {
    @AliasFor(annotation = RequestMapping.class)
    String[] value() default {};
}

测试用例

import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.PostMapping;

@PostMapping("test")
class PostController{

}

public class Test{
    public static void main(String[] args) {
        RequestMapping base = 
            AnnotationUtils.getAnnotation(PostController.class, RequestMapping.class);
        // 这里不仅base不会为空,而且PostMapping中的值还会传递给RequestMapping
        System.out.println(base.value());
    }
}
LeoTan2004 commented 6 months ago

使用SpringAOP提供的方式获取注解,就相当于注解获得了继承和多态的特性,这也给之后的扩展提供了更大的空间。