谈谈spring-boot自动生成spring-configuration-metadata.json原理

JDK6提供了一个可以在编译阶断对代码进行额外补充操作的一个功能

该功能有以下几个步骤: 首先需要继承javax.annotation.processing.AbstractProcessor类。

@SupportedAnnotationTypes({"*"})
public class MyProcessor extends AbstractProcessor {

    @Override
    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
        System.out.println("start process");
        annotations.forEach(s->{
            System.out.println(s);
            Set<? extends Element> set = roundEnv.getElementsAnnotatedWith(s);
            set.forEach(System.out::println);
        });
        return true;
    }

    @Override
    public Set<String> getSupportedAnnotationTypes() {
        return super.getSupportedAnnotationTypes();
    }
}

然后在class下添加META-INF/services目录,里面添加一个javax.annotation.processing.Processor文件,类容为上面的实现类: com.github.liuax.mybatis.batch.autoconfigure.MyProcessor 注意编译时需要传参:<compilerArgument>-proc:none</compilerArgument>。理由:是因为编译该工程时,该处理类还未编译。 新建一个工程,依赖上面打包好的JAR包。运行编译可以看到效果:

[INFO] Compiling 3 source files to Z:\ideaProject\mybatis-batch-parent\mybatis-batch-starter\target\classes
start process
javax.xml.ws.ServiceMode
test.Test2
javax.annotation.Generated
test.Test1
test.Test3
start process
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS

再来看看spring-boot是怎么生成元素据提示信息的

需要依赖一个JAR包,该JAR包含一个继承javax.annotation.processing.AbstractProcesso的实现类。

        <!-- @ConfigurationProperties annotation processing (metadata for IDEs) -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <version>2.0.1.RELEASE</version>
            <optional>true</optional>
        </dependency>

打开原码结构看一下:

转载于:https://my.oschina.net/u/3217171/blog/3044920

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值