简介
今天我要讲解的是主角是 Annotation Processor
,她不是什么新技术 jdk 1.6
就存在了。 Annotation Processor是javac的一个工具,它用来在编译时扫描和处理注解。通过Annotation Processor可以获取到注解和被注解对象的相关信息,然后根据注解自动生成Java代码,省去了手动编写,提高了编码效率。
案例
大部分java 开发者每天也在使用她,比较著名的就是 Lombok
。
在项目中使用Lombok
可以减少很多重复代码的书写。比如说constructor/getter/setter/toString
等方法的编写。 如图:
感触最大的就是,添加或更改了 feild 属性,再也不用去生成 get set 了。
spring boot 中最典型的算 spring-boot-configuration-processor
了。他会在代码编译期间将我们的配置数据 spring-configuration-metadata.json 生成到 jar 包中。方便 idea 识别出来,并提供友好的提示。
如图:
spring 5 spring-context-indexer 浅析
生成 spring.components
文件
maven
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-indexer</artifactId>
<version>5.1.4.RELEASE</version>
<scope>optional</scope>
</dependency>
Gradle
annotationProcessor "org.springframework:spring-context-indexer:5.1.4.RELEASE"
项目编译完成时就会就会生成 META-INF/spring.components
文件到 jar 包中。如图:(spring.components文件)
spring.components
解析和加载
spring-context 中添加了一个
@Indexed
注解。spring ioc 基础注解
@Component
中组合了@Indexed
注解,org.springframework.context.index.CandidateComponentsIndexLoader
则用来加载spring.components
, 标注的这些类。
问题
swagger 目前暂时还有问题,直到现在还没修复,详见 issues:https://github.com/springfox/springfox/issues/2763
优势
将运行期间的类扫描提前到了编译期间,增加服务启动速度。
避免各种容器类扫描的差异性,提搞兼容性。
链接
Spring 5 - spring-context-indexer:https://github.com/spring-projects/spring-framework/tree/master/spring-context-indexer
启发
在 Spring 5 - spring-context-indexer 的启发下,我开发了 mica-auto。编译期间自动生成 Spring boot 的 spring-devtools.properties, 扫描 @Configuration,自动生成到 spring.factories 文件,同时将 FeignClient 信息也生成到 spring.factories 中,供 mica 中完成 Feign 自动化配置。
再也不用担心忘了更改 spring.factories 文件而导致服务启动出错。