使用google autoservice 自动生成java spi 描述文件

spi 是一种服务发现的标准,对于开发中我们通常需要编写 META-INF/services 文件夹中定义的类。
google auto 中的autoservice 可以帮助我们生成对应的配置,很方便

环境准备

  • 项目结构
├── pom.xml
└── src
    ├── main
    │ ├── java
    │ │ └── com
    │ │ └── dalong
    │ │ ├── spi
    │ │ │ └── TranslationService.java
    │ │ └── spimpl
    │ │ ├── BingTranslationServiceProvider.java
    │ │ └── GoogleTranslationServiceProvider.java
    │ └── resources
    └── test
        └── java
            └── com
                └── dalong
                    └── SPITestClass.java

  • 代码说明
    约定:
    spi中的TranslationService.java 为接口定义
    BingTranslationServiceProvider.java 以及GoogleTranslationServiceProvider.java 为接口的实现
    pom.xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <encoding>UTF-8</encoding>
        <java.version>1.8</java.version>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <auto-service.version>1.0-rc6</auto-service.version>
    </properties>
    <groupId>com.dalong.appdemo</groupId>
    <artifactId>first</artifactId>
    <version>1.0-SNAPSHOT</version>
?
<dependencies>
    <dependency>
        <groupId>com.google.auto.service</groupId>
        <artifactId>auto-service-annotations</artifactId>
        <version>${auto-service.version}</version>
        <optional>true</optional>
        <scope>compile</scope>
    </dependency>
        <dependency>
            <groupId>com.google.auto.service</groupId>
            <artifactId>auto-service</artifactId>
            <version>${auto-service.version}</version>
            <optional>true</optional>
            <scope>compile</scope>
        </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.8</version>
        <scope>test</scope>
    </dependency>
?
</dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-site-plugin</artifactId>
                <version>3.7</version>
                <dependencies>
                    <dependency>
                        <groupId>org.apache.maven.doxia</groupId>
                        <artifactId>doxia-site-renderer</artifactId>
                        <version>1.8</version>
                    </dependency>
                </dependencies>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <annotationProcessorPaths>
                        <path>
                            <groupId>com.google.auto.service</groupId>
                            <artifactId>auto-service</artifactId>
                            <version>${auto-service.version}</version>
                        </path>
                    </annotationProcessorPaths>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

接口定义:
TranslationService.java

package com.dalong.spi;
?
import java.util.Locale;
?
public interface TranslationService {
    String translate(String message, Locale from, Locale to);
}

实现:
BingTranslationServiceProvider.java 以及GoogleTranslationServiceProvider.java

package com.dalong.spimpl;
?
import com.dalong.spi.TranslationService;
import com.google.auto.service.AutoService;
?
import java.util.Locale;
@AutoService(TranslationService.class)
public class BingTranslationServiceProvider implements TranslationService {
    @Override
    public String translate(String message, Locale from, Locale to) {
        return "bing";
    }
}
?package com.dalong.spimpl;
?
import com.dalong.spi.TranslationService;
import com.google.auto.service.AutoService;
?
import java.util.Locale;
@AutoService(TranslationService.class)
public class GoogleTranslationServiceProvider implements TranslationService {
    @Override
    public String translate(String message, Locale from, Locale to) {
        return "google";
    }
}
?

打包构建

mvn  clean  package

效果

测试

  • 代码
package com.dalong;
?
import com.dalong.spi.TranslationService;
import com.sun.prism.shader.AlphaOne_Color_AlphaTest_Loader;
import org.junit.Test;
?
import java.util.Locale;
import java.util.ServiceLoader;
import java.util.function.Consumer;
import java.util.stream.StreamSupport;
?
import static org.junit.Assert.assertEquals;
?
public class SPITestClass {
    @Test
    public void myTestForSPI(){
        ServiceLoader<TranslationService> loader = ServiceLoader.load(TranslationService.class);
        long count = StreamSupport.stream(loader.spliterator(), false).count();
?
        loader.forEach(new Consumer<TranslationService>() {
            @Override
            public void accept(TranslationService translationService) {
                Locale localeFrom = new Locale("en");
                Locale localeFo = new Locale("zh");
                String message = translationService.translate("app", localeFrom,localeFo);
                System.out.println(message);
            }
        });
        assertEquals(2, count);
    }
}

说明

基于spi 我们可以开发比较灵活的模块系统,同时可以方便的进行模块的插拔处理

参考资料

https://github.com/google/auto/tree/master/service
https://www.jianshu.com/p/46b42f7f593c

原文地址:https://www.cnblogs.com/rongfengliang/p/11695684.html

时间: 2024-07-30 16:24:49

使用google autoservice 自动生成java spi 描述文件的相关文章

mybatis怎样自动生成java类,配置文件?

其实没有什么东西是可以自动生成的,只不过是别人已经写好了,你调用罢了. 所以想要mybatis自动生成java类,配置文件等,就必须要一些配置和一些jar包.当然这些配置也很简单. 为了有个初步的认识,首先我列出了所需要的文件: 其中标红的比较重要.好了,让我们开始吧 1.首先需要在数据库建好表,随便建几个就好. 2.下载mybatis-generator-core包 下载地址:http://search.maven.org/ 然后搜索mybatis-generator-core下载即可 3.下

Android AIDL自动生成Java文件测试

/******************************************************************************** * Android AIDL自动生成Java文件测试 * 说明: * 知道有aidl这东西已经挺久了,但是一直没有花时间来系统了解一下其工作机制,现在 * 花点时间一点一点验证一下其功能. * * 2016-5-8 深圳 南山平山村 曾剑锋 ***********************************************

自动生成Mybatis的Mapper文件

自动生成Mybatis的Mapper文件 工作中使用mybatis时我们需要根据数据表字段创建pojo类.mapper文件以及dao类,并且需要配置它们之间的依赖关系,这样的工作很琐碎和重复,mybatis官方也发现了这个问题,因此给我们提供了mybatis generator工具来帮我们自动创建pojo类.mapper文件以及dao类并且会帮我们配置好它们的依赖关系. 实际上,最非常流行MyBatis-Plus中内置了代码生成器:采用代码或者 Maven 插件可快速生成 Mapper . Mo

sublime打开文件时自动生成并打开.dump文件

GBK Encoding Support 没有安装前打开ASNI格式编码文件会乱码,安装成功重启则可以打开正常 关于.dump文件生成的解释: 当打开一个非utf-8格式且包含汉字的文件时,sublime text 2会自动生成一个dump文件,文件修改过程中,不会修改原文件,只有按"保存"了才会将dump的数据更新到原文件里,关闭当前编辑的dump文件则会自动删除dump文件. 但是有时候 GBK Encoding Support 插件也会出些bug,就想这样,生成.dump文件后自

自动生成项目的Makefile文件

自动生成项目的Makefile文件 理论基础 跟我一起写 Makefile:   http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=408225 例解 autoconf 和 automake 生成 Makefile 文件:   http://www.ibm.com/developerworks/cn/linux/l-makefile/index.html 步骤 写好Makefile.am 运行 autoscan , 自动创建两个文件: a

织梦栏目在动态或者伪静态下仍然自动生成空的栏目文件夹

1.打开 /include/arc.listview.class.php 搜索 CreateDir(MfTypedir($this->Fields['typedir'])); 有3处地方都要改成 if($this->TypeLink->TypeInfos['isdefault']!=-1) { CreateDir(MfTypedir($this->Fields['typedir'])); } 2.打开 /dede/catalog_add.php 搜索 if($ispart != 2

【转发】自动生成Sqlalchemy的models文件

原文来源:https://blog.csdn.net/caoxing81/article/details/46639023 自动生成Sqlalchemy的models文件的包早用过了,今天维护一个较老的工程,有个字段类型做了改动,调了得10几分钟才搞定.记录下自动生成models文件的python包sqlacodegen    sqlacodegen已经加入pypi,只需要使用pip install sqlacodegen就可以安装了安装后即可运行命令生成models.py文件了    假设数据

mybatis自动生成java代码

SSM框架没有DB+Record模式,写起来特别费劲,只能用下面的方法勉强凑合. 上图中,*.jar为下载的,src为新建的空白目录,.xml配置如下. <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"

自动生成 java 测试 mock 对象框架 DataFactory-01-入门使用教程

项目简介 Data-Factory 用于根据对象,随机自动生成初始化信息,避免了手动创建对象的繁琐,便于测试. 特性 8 大基本类型的支持 String.Date.金额,日期等常见类型的支持 java8 常见时间类的支持 支持 String 和 Number 类型的注解定义 添加 @DataFactory 注解支持 支持 Regex 正则表达式 变更日志 变更日志 核心类讲解 DataUtil 工具类 提供线程安全的方法: /** * 构建结果 * @param clazz 类型 * @retu