Java SPI 使用与注意
JAVA 注意 SPI 使用
2023-09-11 14:17:19 时间
Java SPI 示例
前面简单介绍了 SPI 机制的原理,本节通过一个示例演示 Java SPI 的使用方法。首先,我们定义一个接口,名称为 Robot。
public interface Robot { void sayHello(); }
接下来定义两个实现类,分别为 OptimusPrime 和 Bumblebee。
public class OptimusPrime implements Robot { @Override public void sayHello() { System.out.println("Hello, I am Optimus Prime."); } } public class Bumblebee implements Robot { @Override public void sayHello() { System.out.println("Hello, I am Bumblebee."); } }
接下来 META-INF/services 文件夹下创建一个文件,名称为 Robot 的全限定名 org.apache.spi.Robot。文件内容为实现类的全限定的类名,如下:
org.apache.spi.OptimusPrime
org.apache.spi.Bumblebee
做好所需的准备工作,接下来编写代码进行测试。
public class MainTSpi { public static void main(String[] args) { ServiceLoader<Robot> serviceLoader = ServiceLoader.load(Robot.class); System.out.println("Java SPI"); serviceLoader.forEach(Robot::sayHello); } }
扩展
这时我们 中途 增加一个interface 的实现时l
如:
public class RATCHET implements Robot{ @Override public void sayHello() { System.out.println("Hello, I am RATCHET."); } }
则通过以下代码进行接口更新:(更新的同时并不会运行,但是在下次调用的时候 将会执行新实现的接口,并且相同的只会执行一次)
/** * @description: * @author: Mr.Dai * @create: 2020-05-01 21:36 **/ public class MainTSpi { public static void main(String[] args) throws IOException { ServiceLoader<Robot> serviceLoader = ServiceLoader.load(Robot.class); System.out.println("Java SPI"); serviceLoader.forEach(Robot::sayHello); /** 这里假设重新写法配置文件 */ String path=System.getProperty("user.dir")+"\\java-important_question\\src\\main\\resources\\META-INF\\services\\com.dgwcode.spi.Robot"; BufferedWriter writer = new BufferedWriter(new FileWriter(path,true)); writer.write("\ncom.dgwcode.spi.RATCHET"); writer.close(); serviceLoader.reload(); serviceLoader.forEach(Robot::sayHello); } }
第一次运行
Java SPI
Hello, I am Optimus Prime.
Hello, I am Bumblebee.
Hello, I am Optimus Prime.
Hello, I am Bumblebee.
第二次运行
Java SPI
Hello, I am Optimus Prime.
Hello, I am Bumblebee.
Hello, I am RATCHET.
Hello, I am Optimus Prime.
Hello, I am Bumblebee.
Hello, I am RATCHET.
配置文件内容:
com.dgwcode.spi.OptimusPrime
com.dgwcode.spi.Bumblebee
com.dgwcode.spi.RATCHET
com.dgwcode.spi.RATCHET
相关文章
- 【JAVA】JSP操作数据库简单实例和mysql-connector-java-5.0.3-bin.jar项目配置方法
- 回归JAVA: java文件编译后,出现xx$1.class的原因
- Java项目(前端vue后台java微服务)在线考试系统(java+vue+springboot+mysql+maven)
- 今天面了个腾讯拿 38K 出来的大佬,让我见识到了 Java 面试八股文的天花板
- 【Java】java数据库连接池配置的几种方法
- Java开发环境的搭建以及使用eclipse从头一步步创建java项目
- Java之——利用Comparator接口对多个排序条件进行处理
- Java 并发工具包 java.util.concurrent 大全
- Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,java 判断请求是不是ajax请求
- Error running 'dt-assets-monitor [clean]': Cannot run program "C:Program Files (x86)Javajdk1.8.0_73binjava.exe" (in directory "E:codedt-assets-monitor")
- JAVA webservice配置xfire
- 在java中使用JMH(Java Microbenchmark Harness)做性能测试
- Java打印输出:java天龙八部私服
- (JAVA):学习面向对象时必须要注意的细节----重点第二部分
- JAVA_用Java来获取访问者真实的IP地址
- 『Java练习生的自我修养』java-se进阶⁵ • 常用IO流
- 『Java练习生的自我修养』java-se进阶¹ • 初识多线程
- 【蓝桥杯Java组】Java选手做填空题时不得不会的API
- Java提高篇(二七)-----TreeMap
- 简单的JAVA MVC框架模式--Java-servlet-JavaBean
- 【JAVA】浅谈java枚举类
- 【Java笔记】配置文件java.util.Properties类的使用
- 解决Java上传文件根据路径在浏览器访问不能在线浏览的问题
- 解决Java使用response下载文件报错,并总结可能出错的原因: java.io.IOException: 你的主机中的软件中止了一个已建立的连接。