本文概览:通过JDK 的spi在初始化对象时,加载一些对象。
1 介绍
1、使用的一个背景
在spring框架下面,我们可以通过ApplicationContextAware来获取到上下文,从而可以在对象初始化时可以通过这个上下文获取到bean对象。但是有时候在项目中,我们定义一个bean时,如果没有使用spring(即,没有使用@service注解),那么此时可以通过jdk 的spi来实现。
2、概念
SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制。
2 一个实例
2.1 配置文件
1、 文件内容
文件内容为类的全路径,具体如下:
1 2 3 |
# 遮盖日志敏感信息 spi.ProcessGo spi.ProcessHello |
2、文件位置
2.2 代码
1、定义接口
1 2 3 |
public interface SpiInterface { String process(String input); } |
2、实现接口的类
(1)实现类1
1 2 3 4 5 |
public class ProcessHello implements SpiInterface { public String process(String input) { return input + "hello"; } } |
(2)实现类2
1 2 3 4 5 |
public class ProcessGo implements SpiInterface { public String process(String input) { return input + "go"; } } |
3、使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
public class SpiTest { private List<SpiInterface> processors = Lists.newArrayList(); public SpiTest() { load(); } /** * 加载类 */ private void load() { ServiceLoader<SpiInterface> loaders = ServiceLoader.load(SpiInterface.class); for (SpiInterface spiInterface : loaders) { processors.add(spiInterface); } } /** * 使用加载的处理器来处理对象 */ public void process() { for (SpiInterface spiInterface : processors) { System.out.println(spiInterface.process("test--")); } } public static void main(String[] args) { SpiTest spiTest = new SpiTest(); spiTest.process(); } } |
3 参考文献
1、http://ivanzhangwb.github.io/blog/2012/06/01/java-spi/
(全文完)