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

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

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

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

组合逻辑:@SpringBootApplication组合@ComponentScanbasePackages和basePackageClasses@EnableAutoConfigurationexclude和excludeName

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

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

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

注意:该方式一只支持spring框架内的注解

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
		@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
		@Filter(type = FilterType.CUSTOM,
				classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {


	@AliasFor(annotation = EnableAutoConfiguration.class)
	Class<?>[] exclude() default {};


	@AliasFor(annotation = EnableAutoConfiguration.class)
	String[] excludeName() default {};


	@AliasFor(annotation = ComponentScan.class, attribute = "basePackages")
	String[] scanBasePackages() default {};


	@AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses")
	Class<?>[] scanBasePackageClasses() default {};

}

2.jdk原生注解,生成组合注解,使用@Repeatable

3.不是所有的注解都可以组合,特殊情况不可以生成组合注解,比如以下的情况就不可以组合

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

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

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface RequiresPermissions {


    String[] value();

    Logical logical() default Logical.AND; 

}

(2)新注解@ShiroRequiresPermissions

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

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

解决这种情况的话,需要自定义全新Shiro注解,按以下步骤开发

  1. 创建自定义的注解
  2. 资源管理器,继承AuthorizationAttributeSourceAdvisor,添加新注解支持
  3. AOP拦截器,继承AopAllianceAnnotationsAuthorizingMethodInterceptor
  4. 方法拦截器,继承AuthorizingAnnotationMethodInterceptor
  5. 权限处理器,继承AuthorizingAnnotationHandler,校验权限
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@RequiresPermissions(value = {})
public @interface ShiroRequiresPermissions {

    @AliasFor(annotation = RequiresPermissions.class, attribute = "value")
    String[] value();

    @AliasFor(annotation = RequiresPermissions.class, attribute = "logical")
    Logical logical() default Logical.AND;

    String remark() default "";
}

总结:注解组合需要分四步,1.自定义新注解 2.新注解写要引入的注解 3.使用@AliasFor或者@Repeatable建立新老注解的属性对应关系。4.注意特殊情况,并不是所有场景都可以实现组合注解,需要按需生成新注解。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值