@AutoService(Processor.class)@SupportedOptions("debug")public class AutoComponentProcessor extends AbstractComponentProcessor {/*** 元素辅助类*/private Elements elementUtils;private Set<String> componentClassNames = new ConcurrentSkipListSet<>();@Overridepublic synchronized void init(ProcessingEnvironment processingEnv) {super.init(processingEnv);elementUtils = processingEnv.getElementUtils();}@Overridepublic Set<String> getSupportedAnnotationTypes() {return Collections.singleton(AutoComponent.class.getName());}@Overrideprotected boolean processImpl(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {// 注解处理完成,创建配置文件if (roundEnv.processingOver()) {generateConfigFiles();} else {processAnnotations(annotations, roundEnv);}return false;}
3、注册处理器因为处理器是通过SPI机制实现,因此它的注册,其实就是在META-INF/services底下创建
javax.annotation.processing.Processor文件,文件内容为自定义的处理器类
com.Github.lybgeek.apt.process.AutoComponentProcessor
不过我们可以在项目的POM中引入GAV <dependency><groupId>com.google.auto.service</groupId><artifactId>auto-service</artifactId><version>1.0.1</version><scope>provided</scope></dependency>
或者<dependency><groupId>.NET.dreamlu</groupId><artifactId>mica-auto</artifactId><version>2.3.0</version><scope>provided</scope></dependency>
在process的处理器上,加上注解@AutoService(Processor.class)
就会在编译期自动生成spi配置文件,它实现机制也是采用APT4、当我们制作好处理器后,我们可以将处理器打成jar,提供给项目用示例
<dependency><groupId>${project.groupId}</groupId><artifactId>springboot-apt-framework</artifactId><version>${project.version}</version></dependency>
在项目编译后,就会在target的MATA-INF底下看到lybgeek.components文件文章插图
文件内容如下
# Generated by LYB-GEEK AT TIME : 2023-01-12T17:14:24.982com.github.lybgeek.test.service.EchoServicecom.github.lybgeek.test.service.HelloService
接下来就是解析lybgeek.components,并通过spring提供的扩展点和API进行bean注册,因为这块内容不属于APT的内容,本文就不再论述,对这部分感兴趣的朋友,可以通过文末提供的demo链接查看总结在未接触APT之前,我们可能会通过反射去解析注解并实现功能,接触APT之后,我们又多了额外一种比反射更能提升性能的实现实现 。不过任何东西都有其适用场景,APT主要还是用在编译期帮我们生成代码或者配置等,如果我们项目要使用APT生成的代码,有可能还是需要通过反射处理 。
我们耳熟能详的lombok、mapstruct、包括spring5.0之后提供的@Index都是通过APT来实现,文中的示例其实就是仿造spring index来实现,可以看成是spring index的简单版本
demo链接https://github.com/lyb-geek/springboot-learning/tree/master/springboot-apt
【APT 如何运用JAVA注解处理器】
推荐阅读
- 大型网络监控如何设置ip地址?如何选择交换机?
- 如何区分二层和三层交换机?
- 怎么在百度里面投放广告?如何在百度里推广自己的门店?
- 翡翠|龙哥说翡翠:你知道如何用灯光来区别翡翠的灰底和底色吗?
- 蜜蜡|天然蜜蜡的流动纹,如何辨别?
- 教师如何成为公务员?这两种方式都可行,但是难度相差很大
- 明前茶如何从贵如金,变成了明前茶要小心!
- 贾静雯|贾静雯现实中状态如何?录《浪姐4》被跟拍,48岁无修图让人看愣
- 很多人不知道微信的“拍一拍”,如何设置和使用?才更有趣又好玩
- |如何在职业规划中处理职业转型和发展的风险?