google-auto之自动生成组件化文件


一 简介

google的开源框架auto是一个自动生成java相关代码的解析工具
在这里插入图片描述
通过AutoFactory和AutoService等的相关模块,我们能够实现代码以及对应配置的自动生成。
相关的API文档参考:readme.md文档:https://github.com/google/auto/blob/master/README.md

二 代码
使用AutoService(官方文档)

在这里插入图片描述
官方文档中,写了这么一段简短的话关于AutoService这个模块开发的意义,在我们的java开发中,我们一般是通过java.util.ServiceLoad,也就是SPI技术来动态的加载项目中扩展出来的接口的实现类,但是,在一般的情况下,我们可能会去遗忘掉一些动态描述符的修改,导致无法加载,使用@AutoService能够为开发者动态的生成此类的元数据描述
例如:

package foo.bar;

import javax.annotation.processing.Processor;

@AutoService(Processor.class)
final class MyProcessor implements Processor {
  // …
}

使用AutoService会自动的生成META-INF./services/javax.annotation.processing.Processor 文件,并且文件中内容就是你动态注入进去的类

foo.bar.MyProcessor

如果你使用Processor(javax.annotation.processing.Processor),并且你的元数据文件被包含在了一个jar包中,同时这个jar包是在javac(java编译)的classpath路径下时,javac会自动的执行通过该方式注入进去的Processor的实现类,以实现对于该项目内的相关数据的扩展。在一般的情况下,你可以生成一般的SPI文件,使用ServiceLoader去加载这些扩展的SPI文件。(这个其实就是auto核心使用)

使用

首先创建一个util-interface模块,里面定义一个接口Pay,Pay的接口中我们定义一个简单的pay()方法:
在这里插入图片描述
创建一个util-interface-a模块,同时引入util-interface模块,实现Pay接口

/**
 * @author zhoucg
 * @date 2019-11-04 15:45
 */
@AutoService(Pay.class)
public class AliPay implements Pay{
    @Override
    public void pay() {
		System.out.println("支付宝支付");
    }
}

创建一个util-interface-b模块,引入util-interface模块,实现Pay接口

/**
 * @author zhoucg
 * @date 2019-11-04 15:52
 */
@AutoService(Pay.class)
public class WechatPay implements Pay{
    @Override
    public void pay() {
        System.out.println("微信支付");
    }
}

其中,util-interface-a和util-interface-b模块需要引入auto-service包

<dependency>
            <groupId>com.google.auto.service</groupId>
            <artifactId>auto-service</artifactId>
            <version>${auto-service.version}</version>
            <optional>true</optional>
        </dependency>

并且,build引入plugin(这个是官方文档中要求引入的,我 没有深究,发现不引入就会报错,编译)

<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <annotationProcessorPaths>
                        <path>
                            <groupId>com.google.auto.service</groupId>
                            <artifactId>auto-service</artifactId>
                            <version>${google-auto-service.version}</version>
                        </path>
                    </annotationProcessorPaths>
                </configuration>
            </plugin>
        </plugins>
    </build>

最后,创建一个util-interface-combin模块,引入util-interface-a和util-interface-b模块,编写SpiTest

public class SpiTest {
    public static void main(String[] args) {
        ServiceLoader<Pay> load = ServiceLoader.load(Pay.class);
        for(Pay pay : load) {
            pay.pay();
        }
    }
}

最后,编译执行SpiTest。

com.zcswl.spi.SpiTest
支付宝支付
微信支付

Process finished with exit code 0

关于google-auto模块service源码的研究,可以参考:
使用Google开源库AutoService进行组件化开发

三 扩展

github中有一个人是依据google-auto扩展出了一个代码自动生成器(个人认为很不错):
添加链接描述
在这里插入图片描述
引入该包之后,能够根据模块中注入的@Configuration,@Component等注解自动生成自动装配的文件META-INF/spring.factories,同时能够生成spring-devtools.properties文件,(实际上就是节省了你写入spring boot自动装配的文件)
实际的原理就是就是和service一致,包目录下注入了Processor类型的SPI扩展实现类,在编译的时候执行对应的扩展方法,同时写入文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值