APT 如何运用JAVA注解处理器( 二 )


@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配置文件,它实现机制也是采用APT
4、当我们制作好处理器后,我们可以将处理器打成jar,提供给项目用
示例
<dependency><groupId>${project.groupId}</groupId><artifactId>springboot-apt-framework</artifactId><version>${project.version}</version></dependency>在项目编译后,就会在target的MATA-INF底下看到lybgeek.components文件
APT 如何运用JAVA注解处理器

文章插图
 
文件内容如下
# 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注解处理器】


推荐阅读