在我们日常开发中,经常使用Enable注解来开启某些功能。例如

  1. EnableDiscoveryClient
  2. EnableFeignClients
  3. @EnableAuthorizationServer
  4. ....

我们发现这些注解都是用来开启某些功能的,其实如果我们换句话来说可能更好理解,就是用来加载某些配置的。

那么我们来自定义一个Enable注解,首先我们需要对注解有一定的了解,下面是我摘抄的网上的一段说明。

01) @interface

使用 @interface 定义注解时,意味着它实现了 java.lang.annotation.Annotation 接口,即该注解就是一个Annotation。

定义 Annotation 时,@interface 是必须的。

注意:它和我们通常的 implemented 实现接口的方法不同。Annotation 接口的实现细节都由编译器完成。通过 @interface 定义注解后,该注解不能继承其他的注解或接口。

(02) @Documented

类和方法的 Annotation 在缺省情况下是不出现在 javadoc 中的。如果使用 @Documented 修饰该 Annotation,则表示它可以出现在 javadoc 中。

定义 Annotation 时,@Documented 可有可无;若没有定义,则 Annotation 不会出现在 javadoc 中。

(03) @Target(ElementType.TYPE)

前面我们说过,ElementType 是 Annotation 的类型属性。而 @Target 的作用,就是来指定 Annotation 的类型属性。

@Target(ElementType.TYPE) 的意思就是指定该 Annotation 的类型是 ElementType.TYPE。这就意味着,MyAnnotation1 是来修饰"类、接口(包括注释类型)或枚举声明"的注解。

定义 Annotation 时,@Target 可有可无。若有 @Target,则该 Annotation 只能用于它所指定的地方;若没有 @Target,则该 Annotation 可以用于任何地方。

(04) @Retention(RetentionPolicy.RUNTIME)

前面我们说过,RetentionPolicy 是 Annotation 的策略属性,而 @Retention 的作用,就是指定 Annotation 的策略属性。

@Retention(RetentionPolicy.RUNTIME) 的意思就是指定该 Annotation 的策略是 RetentionPolicy.RUNTIME。这就意味着,编译器会将该 Annotation 信息保留在 .class 文件中,并且能被虚拟机读取。

定义 Annotation 时,@Retention 可有可无。若没有 @Retention,则默认是 RetentionPolicy.CLASS。

下面我们说了怎么自定义一个Enable注解,其实Enable的方式有很多种。

我们先介绍最简单的一种,直接引入:

/*** 开启天润外呼* @author clark*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Import(TRCallConfig.class)
public @interface EnableTRCall {
}

引入配置类

/*** 天润外呼配置类* @author clark*/
@EnableConfigurationProperties({ TRCallProperties.class})
public class TRCallConfig {@Autowiredprivate TRCallProperties trCallProperties;/*** 实例化天润外呼业务* @return*/@Bean("trCallService")CallService trCallService(){TRCallServiceImpl trCallService = new TRCallServiceImpl();trCallService.setTrCallProperties(trCallProperties);return trCallService;}
}

那么这样我们就实现了一个自定义的Eable注解了,当然这是比较简单的。

下面我们来说下第二种,根据参数加载不同的配置类的方法。

/*** 全局开启外呼注解:与单个开启等价* @author clark*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Import(CallConfigurationSelector.class)
public @interface EnableCall {/*** 开启类型* @return*/String[] type();}
/*** 配置加载* @author clark*/
public class CallConfigurationSelector  implements ImportSelector{/*** 解析type参数,动态加载配置类* @param annotationMetadata* @return*/@Overridepublic String[] selectImports(AnnotationMetadata annotationMetadata) {//获取注解的属性集合AnnotationAttributes attributes =AnnotationAttributes.fromMap(annotationMetadata.getAnnotationAttributes(EnableCall.class.getName(), false));//设置typeString[] types = attributes.getStringArray("type");if(types==null||types.length==0){throw new IllegalStateException("type is required");}List<String> results = new ArrayList<>();//处理类型for(String type : types) {CallType callType = CallType.valueOf(type);switch (callType) {case CDR:results.add(CDRCallConfig.class.getName());break;case TKY:results.add(TKYCallConfig.class.getName());break;case TR:results.add(TRCallConfig.class.getName());break;case ZC:results.add(ZCCallConfig.class.getName());break;default:throw new IllegalStateException("no type is matching");}}return results.toArray(new String[results.size()]);}}

对于Import能引入的类型,我们可以参考源码进行查看。

Spring 自定义Enable注解以及Enable注解扩展相关推荐

  1. Spring自定义注解驱动开发使用及源码分析

    目录 前言 注解驱动开发使用 需求 代码实现 测试效果 源码分析 BeanDefinitionRegistryPostProcessor接口 解析BeanDefinition 处理Bean上配置的注解 ...

  2. spring -- 自定义注解

    我们直接通过代码解释自定义注解的使用及各个含义 package com.sysware.cloud.dts.annotation;import java.lang.annotation.*; @Ret ...

  3. Spring 自定义注解,配置简单日志注解

    java在jdk1.5中引入了注解,spring框架也正好把java注解发挥得淋漓尽致. 下面会讲解Spring中自定义注解的简单流程,其中会涉及到spring框架中的AOP(面向切面编程)相关概念. ...

  4. spring aop 自定义注解配合swagger注解保存操作日志到mysql数据库含(源码)

    spring aop 自定义注解保存操作日志到mysql数据库 一.思路 二.自定义注解 三.编写操作日志 四.编写操作日志切面\增强 五.使用 六.`注意` 一.思路 利用spring aop 对方 ...

  5. Spring自定义注解

    转载自:Spring自定义注解 前言 自定义注解在开发中是一把利器,经常会被使用到.在上一篇文章中有提到了自定义校验注解的用法. 然而最近接到这样一个需求,主要是针对某些接口的返回数据需要进行一个加密 ...

  6. Spring 自定义注解玩法大全,从入门到…

    在业务开发过程中我们会遇到形形色色的注解,但是框架自有的注解并不是总能满足复杂的业务需求,我们可以自定义注解来满足我们的需求. 根据注解使用的位置,文章将分成字段注解.方法.类注解来介绍自定义注解. ...

  7. spring学习12 -Spring 框架模块以及面试常见问题注解等

    以下为spring常见面试问题: 1.Spring 框架中都用到了哪些设计模式? Spring框架中使用到了大量的设计模式,下面列举了比较有代表性的: 代理模式-在AOP和remoting中被用的比较 ...

  8. spring controller 增加header字段forward_Spring 注解编程之模式注解

    上篇文章研究 Spring XML Schema 扩展进制,这段时候一直研究 Spring 注解编程的原理.原本以为有了之前研究基础,可以很快理解注解编程原理.没想到这个过程非常困难,注解编程源码难度 ...

  9. 死磕Spring源码-常见底层核心注解

    一:Spring框架功能整体介绍 二:根据Spring架构图可知,包含以上的模块儿.下面逐个模块儿进行解释. 1:IOC 和 DI(Inversion of Control I DependencyI ...

  10. @autowired注解_品Spring:对@Autowired和@Value注解的处理方法(文末附spring系列资源合集)...

    作者:编程新说李新杰 出自:微信公众号"编程新说" 原文:品Spring:对@Autowired和@Value注解的处理方法 在Spring中能够完成依赖注入的注解有JavaSE提 ...

最新文章

  1. matlab中的数值计算,MATLAB数值计算(中译本,最新修订)
  2. Jupyter Notebook 添加目录
  3. 在两个页面间翻转设置Animation动作的一些总结
  4. Linux下安装MongoDB3.2.5(自测)
  5. 谁是赢家_赢家的真正作品是股东
  6. ARP协议在同网段及跨网段下的工作原理
  7. mysql历史数据备份_Mysql存储过程历史表备份
  8. python基础编程练习题_Python随笔18:Python基础编程练习题1~2
  9. php去除html标签 空白,php使用strip_tags()去除html标签仍有空白的解决方法
  10. 平均值 oj 山东科技大学 c 语言作业
  11. Python画一个国旗
  12. CSS内联样式的使用,实战篇
  13. Pr cc 2019 v13.0 添加字幕文本不显示,输入字符后无选中框解决方案
  14. “霜降”,“农历”,“二十四节气”,英语怎么说?
  15. 左外连接Left-Outer-Join的基于SQL,MapReduce,sparkRDD,sparkDataFrame以及spark SQL的实现案例及对比
  16. 将Word文档中指定内容锁定
  17. Python从入门到实践
  18. 联想IdeaPad 310S重装系统过程
  19. 关于摆线绕轴旋转得到的旋转体体积
  20. (附源码)spring boot网上商品定制系统 毕业设计180915

热门文章

  1. 非985、211毕业,却选择了拒接百度Android开发岗offer?
  2. Spring整合JDBCTemplate实现数据库增删改查操作
  3. 用 SuperObject 解析淘宝上的 Json 数据 - 回复 macrolen 的问题
  4. adb shell读取返回值_android代码执行adb shell终端命令(linux命令)并返回执行结果...
  5. 中创 -- 中创中间件如何实现应用的自动部署
  6. linux服务器执行xshot,【Funtouch OS玩机宝典】:工程模式恢复模式入门指南
  7. 6个可以改变一生的宝藏APP,他坚持学习了3年,如今月薪涨到5万
  8. Python打造抖音情人节专属表白神器(女神不得不接受的那种哦)
  9. Ubuntu 18.04 分辨率设置
  10. UltraISO9。0 注册码