注入 log min ces stat static zhong lee
SPI 全称为 (Service Provider Interface) , 是 JDK 内置的一种服务提供发现机制。 目前有不少框架用它来做服务的扩展发现, 简单来说,它就是一种动态替换发现的机制, 举个例子来说, 有个接口,想运行时动态的给它添加实现,你只需要添加一个实现。
具体是在 JAR 包的 "src/META-INF/services/" 目录下建立一个文件,文件名是接口的全限定名,文件的内容可以有多行,每行都是该接口对应的具体实现类的全限定名.
比如你想扩展一些框架,如 spring 的一些功能,就是要实现它接口,然后自己配置了。
先定义接口:
- package com.ming.spi.service;
- /**
- * 定义一个dog的接口
- * @author ming
- *
- */
- public interface DogService {
- void sleep();
- }
然后定义两个实现:
- package com.ming.spi.service.imp;
- import com.ming.spi.service.DogService;
- public classBlackDogServiceImplimplements DogService{
- @Override
- public void sleep() {
- System.out.println("黑色dog。。。汪汪叫,不睡觉...");
- }
- }
- package com.ming.spi.service.imp;
- import com.ming.spi.service.DogService;
- public classWhilteDogServiceImplimplements DogService{
- @Override
- public void sleep() {
- System.out.println("白色dog。。。呼呼大睡觉...");
- }
- }
最后是一个测试代码:
- package com.ming.spi.service;
- import java.util.ServiceLoader;
- public class Test {
- public static voidmain(String[] args)throws Exception {
- ServiceLoaderloaders = ServiceLoader.load(DogService.class);
- for (DogService d : loaders) {
- d.sleep();
- }
- }
- }
然后是 src/META-INF/services/com.ming.spi.service.DogService 文件中的代码:
- com.ming.spi.service.imp.BlackDogServiceImpl
- com.ming.spi.service.imp.WhilteDogServiceImpl
最后运行结果就是你需要的两个实现。
最后总结一下:
java 的 spi 运行流程是运用 java.util.ServiceLoader 这个类的 load 方法去在 src/META-INF/services / 寻找对应的全路径接口名称的文件,然后在文件中找到对应的实现方法并注入实现,然后你可以运用了
参考: http://www.cnblogs.com/zhongkaiuu/articles/5040971.html
用得越多不知道的东西越多...... 慢慢酱油中...
java 的 spi 的简单应用
来源: http://www.bubuko.com/infodetail-2013339.html