java注解通俗易懂系列教程四之组合自定义注解

柔情只为你懂 2023-06-27 06:20 22阅读 0赞

自定义注解初步会了之后,有时候会遇到1.注解只有一个属性,想增加属性。2.两个注解经常一起使用,合并两个注解为一个,写一个就行了省事。等等场景。

主要逻辑是:新定义一个注解,然后把原来的注解引入进来,新注解的属性和原来注解的属性绑定

1.组合多个注解到成为一个新注解:a,b注解合并成c注解,c拥有a,b的全部或者部分属性。以@SpringBootApplication为例

组合逻辑:@SpringBootApplication组合@ComponentScan的basePackages和basePackageClasses和@EnableAutoConfigurationexclude和excludeName

(1)需要在新注解@SpringBootApplication先加上想引入的注解@EnableAutoConfiguration

(2)其中使用注解@AliasFor来确定原来注解的属性和新注解属性的对应关系

@AliasFor的annotation指定引入注解是哪个,如果原来的注解属性和新注解的属性一致会自动匹配,如果原来的注解和新注解属性名不一致需要使用attribute指定原来注解的属性名是什么。

  1. @Target(ElementType.TYPE)
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. @Inherited
  5. @SpringBootConfiguration
  6. @EnableAutoConfiguration
  7. @ComponentScan(excludeFilters = {
  8. @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
  9. @Filter(type = FilterType.CUSTOM,
  10. classes = AutoConfigurationExcludeFilter.class) })
  11. public @interface SpringBootApplication {
  12. @AliasFor(annotation = EnableAutoConfiguration.class)
  13. Class<?>[] exclude() default {};
  14. @AliasFor(annotation = EnableAutoConfiguration.class)
  15. String[] excludeName() default {};
  16. @AliasFor(annotation = ComponentScan.class, attribute = "basePackages")
  17. String[] scanBasePackages() default {};
  18. @AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses")
  19. Class<?>[] scanBasePackageClasses() default {};
  20. }

2.原来注解没默认值,必须指定的情况需要注意

现在想用shiro的@RequiresPermissions注解新生成一个@ShiroRequiresPermissions注解

(1)原来的注解@RequiresPermissions 内容

  1. @Target({ElementType.TYPE, ElementType.METHOD})
  2. @Retention(RetentionPolicy.RUNTIME)
  3. public @interface RequiresPermissions {
  4. String[] value();
  5. Logical logical() default Logical.AND;
  6. }

(2)新注解@ShiroRequiresPermissions

引入原来的注解@RequiresPermissions(value = {}),没设置默认值,需要对value进行赋值。

需要注意如果这样写 @RequiresPermissions(value = “”)新注解上,新注解的value会一直使用这个值,即使你用新注解的时候填了value也是不会生效的。所以需要这样写@RequiresPermissions(value = {})

  1. @Target({ElementType.METHOD, ElementType.TYPE})
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. @RequiresPermissions(value = {})
  5. public @interface ShiroRequiresPermissions {
  6. @AliasFor(annotation = RequiresPermissions.class, attribute = "value")
  7. String[] value();
  8. @AliasFor(annotation = RequiresPermissions.class, attribute = "logical")
  9. Logical logical() default Logical.AND;
  10. String remark() default "";
  11. }

总结:注解组合需要分三步,1.自定义新注解 2.新注解写要引入的注解 3.使用@AliasFor建立新老注解的属性对应关系。

发表评论

表情:
评论列表 (有 0 条评论,22人围观)

还没有评论,来说两句吧...

相关阅读