使用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
使用google autoservice 自动生成java spi 描述文件的更多相关文章
- 分享:根据webservice WSDL地址自动生成java调用代码及JAR包
分享:根据webservice WSDL地址自动生成java调用代码及JAR包使用步骤:一.安装java 并配置JAVA_HOME 及 path二.安装ANT 并配置ANT_HOME三.解压WsdlT ...
- Android AIDL自动生成Java文件测试
/******************************************************************************** * Android AIDL自动生成 ...
- wsdl自动生成Java代码,根据wsdl生成Java代码
wsdl自动生成Java代码,根据wsdl生成Java代码 >>>>>>>>>>>>>>>>>&g ...
- 使用maven根据JSON文件自动生成Java POJO类(Java Bean)源文件
根据JSON文件自动生成Java POJO类(Java Bean)源文件 本文介绍使用程序jsonschema2pojo来自动生成Java的POJO类源文件,本文主要使用maven,其他构建工具请参考 ...
- mybatis自动生成java代码
SSM框架没有DB+Record模式,写起来特别费劲,只能用下面的方法勉强凑合. 上图中,*.jar为下载的,src为新建的空白目录,.xml配置如下. <?xml version=" ...
- Mysql逆向工程效率神器之使用IDE自动生成Java实体类
Mysql逆向工程效率神器之使用IDE自动生成Java实体类 简介:实战使用IDE根据Mysql自动生成java pojo实体类 1.IDEA连接数据库 菜单View→Tool Windows→Dat ...
- mybatis怎样自动生成java类,配置文件?
其实没有什么东西是可以自动生成的,只不过是别人已经写好了,你调用罢了. 所以想要mybatis自动生成java类,配置文件等,就必须要一些配置和一些jar包.当然这些配置也很简单. 为了有个初步的认识 ...
- 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_2-6.Mysql逆向工程效率神器之使用IDE自动生成Java实体类
笔记 6.Mysql逆向工程效率神器之使用IDE自动生成Java实体类 简介:实战使用IDE根据Mysql自动生成java pojo实体类 1.IDEA连接数 ...
- Eclipse+Axis自动生成Web Service WSDL文件
JDK版本:1.5.0_22 Eclipse版本:Helios Service Release 2(3.6.2) 首先创建一个web工程,创建过程如下: 如果选择Apache Tomcat v5.5, ...
随机推荐
- 百度前端技术学院task14源代码
刚开始理解错误,以为是读取对象,结果后面才发现是二维数组. 另外对于数组排序,创建新的节点啊,输入到doM中啊,都不是很熟悉. <!DOCTYPE html> <html> & ...
- Python 中拼音库 PyPinyin 的用法【华为云技术分享】
[摘要] 最近碰到了一个问题,项目中很多文件都是接手过来的中文命名的一些素材,结果在部署的时候文件名全都乱码了,导致项目无法正常运行. 后来请教了一位大佬怎么解决文件名乱码的问题,他说这个需要正面解决 ...
- opencv imshow plt imshow
opencv官方文档上写的,https://docs.opencv.org/master/dc/d2e/tutorial_py_image_display.html Color image loade ...
- 批量修改Ms SqlServer 的default(默认值)
原文:批量修改Ms SqlServer 的default(默认值) --1.取得数据库所有表的默认值: select t3.name as 表名,t1.name as 字段名,t2.text as 默 ...
- windows10结束进程
.net winfrom 程序关于结束进程触发事件 在任务管理器中有进程.详细信息栏 在进程栏对应用程序结束任务,会触发应用程序窗体的FormClosed事件 在详细信息栏对应用程序结束任务,不会触发 ...
- https相关知识总结
从园子里看到很多讲解不错的文章,将链接放到这里,备忘 浅析数字证书:https://www.cnblogs.com/hyddd/archive/2009/01/07/1371292.html
- HeRaNO's NOIP CSP Round Day 2 T2 PESTC
对于我这种菜鸡来说还是挺有迷惑性的. 在考场发现答案问的是跟最值有关的数量,想到二分,结果果然具有单调性,考虑二份答案+验证 其实什么反转什么的,可以不用去管他,对于长度小于二分答案mid的道路,不去 ...
- 英语aeroides海蓝宝石aeroides单词
海蓝宝石(aeroides,Aquamarine)是一种含铍.铝的硅酸盐,与祖母绿.乌兰孖努以及碧玺等统称为彩色宝石.海蓝宝石的颜色为天蓝色至海蓝色或带绿的蓝色,它的颜色形成主要是由于含微量的二价铁离 ...
- linux系统crontab
一.cron 简介 在LINUX中,周期执行的任务一般由cron这个守护进程来处理[ps -ef|grep cron].cron读取一个或多个配置文件,这些配置文件中包含了命令行及其调用时间. cro ...
- Android Scroller解析
作用 这个类封装了滚动操作,如帮我们处理手指抬起来时候的滑动操作.与ViewGroup的scrollTo(),scrollBy()的生硬式移动,Scroller提供了一个更加柔和的移动效果.Scrol ...