java mvc 新趋势——从运行期间类扫描到编译期间

简介

今天我要讲解的是主角是 Annotation Processor,她不是什么新技术 jdk 1.6 就存在了。 Annotation Processor是javac的一个工具,它用来在编译时扫描和处理注解。通过Annotation Processor可以获取到注解和被注解对象的相关信息,然后根据注解自动生成Java代码,省去了手动编写,提高了编码效率。

案例

大部分java 开发者每天也在使用她,比较著名的就是 Lombok

在项目中使用Lombok可以减少很多重复代码的书写。比如说constructor/getter/setter/toString等方法的编写。 如图:

lombok

感触最大的就是,添加或更改了 feild 属性,再也不用去生成 get set 了。

spring boot 中最典型的算 spring-boot-configuration-processor 了。他会在代码编译期间将我们的配置数据 spring-configuration-metadata.json 生成到 jar 包中。方便 idea 识别出来,并提供友好的提示。

如图:

 spring boot props

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.components 解析和加载

  1. spring-context 中添加了一个 @Indexed 注解。

  2. spring ioc 基础注解 @Component 中组合了@Indexed注解,

  3. org.springframework.context.index.CandidateComponentsIndexLoader 则用来加载 spring.components, 标注的这些类。

问题

swagger 目前暂时还有问题,直到现在还没修复,详见 issues:https://github.com/springfox/springfox/issues/2763

优势

  1. 将运行期间的类扫描提前到了编译期间,增加服务启动速度。

  2. 避免各种容器类扫描的差异性,提搞兼容性。

链接

Mica Auto: https://gitee.com/596392912/mica-auto

Spring 5 - spring-context-indexer:https://github.com/spring-projects/spring-framework/tree/master/spring-context-indexer

启发

在 Spring 5 - spring-context-indexer 的启发下,我开发了 mica-auto,JFinal-event 3.0中也预备使用编译期间注解扫描替换掉运行期间的扫描,对于这个技术希望 @JFinal 波总也能将其应用到 JFinal 中。 

评论区

Jieven

2019-01-25 21:48

为了死忠JFinal,所以坚决抵制Spring技术栈,不用Spring技术栈,因此丢掉了工作,MMP. 但我不后悔, 继续坚守JFinal全家桶.

Dreamlu

2019-01-25 21:56

@Jieven 哈哈哈,Spring 里面有很多东西还是可以吸取的

Jieven

2019-01-25 22:08

@Dreamlu 我都是偷偷把Spring的东西偷出来改个名字+JFinal-xxx 生态就是这么来的

Dreamlu

2019-01-25 22:15

@Jieven 我就不一样了,我是光明正大的抄,哈哈哈 JFinal-event 就是,从 Spring 3.x 抄袭 到 4.2.x

杜福忠

2019-01-25 22:37

楼上大佬互舔, 我们怎么办? 看啥!点赞+收藏啊!

JFinal

2019-01-26 10:58

感觉这个东东最大的好处还在于省代码,生成器生成的代码还是显得冗余

jfinal 为了省代码上的是生成器,目前用着还好,因为生成器除了生成 base model 中的 getter、setter 以外,还生成了 _MappingKit 之类的东东,而这些代码 Annotation Processor 还是无法满足需求

这个东东要达成的目标,终极方向还是要在 Java 语言中引入新的 feature,例如要生成 getter setter 方法的属性可以这么来:
accessor private String name;

加个 accessor 关键字来表明 name 字段具有 getter setter 方法

JFinal

2019-01-26 11:01

@Jieven @Dreamlu @杜福忠 关于 spring 系,我自己还没毕业的时候就开始用,用了三年多,后来开发 jfinal 时,spring 中东西一点都没用上,完全没有可参考之处

或许现在的 Spring 出了些有意思的创新,如果有需求那我也会毫不犹豫地将思想拿过来用。思想、知识的共享、借签才有了这个世界的快速发展

Dreamlu

2019-01-26 11:11

@JFinal 考虑下是否可以借助编译期间的 Annotation Processor,来增强 ioc 功能。

JFinal

2019-01-26 11:14

@Dreamlu jfinal 在理念上没有 IOC、DI, 只是为了省代码、提效率有一个 @Inject 功能

@Inject 这个功能怎么能用上 Annotation Processor,并且可以获得益处?

热门分享

扫码入社