有这样的一个应用场景,在某个JAR包内,有一个接口IA,然后有3个IA接口的具体实现类,分别是AIA,BIA,CIA。
SPI的全称是Service Provider Interface。
2.1、 commons-logging中的例子
这段代码的意思就是说使用SPI机制,在Jar包的"META-INF/services/"目录下查找一个文件名为"org.apache.commons.logging.LogFactory"的文件,在文件中可以配置默认要使用的LogFactory具体实现类的全限定名。
2.2、自己的例子
在META-INF/services/spi.IA文件中的内容如下:
那么如果在该JAR包内其他的类中使用接口IA的时候,硬编码IA对象对应的具体实现类,就会导致非常不灵活。这就是SPI机制产生的场景由来。
SPI的全称是Service Provider Interface。
简单来说,SPI机制提供了一个表达接口和其具体实现类之间的绑定关系的方案。具体是在JAR包的"META-INF/services/"目录下建立一个文件,文件名是接口的全限定名,文件的内容可以有多行,每行都是该接口对应的具体实现类的全限定名。
2.1、 commons-logging中的例子
在commons-logging:commons-logging:1.1包中有个LogFactory抽象类(全限定名是"org.apache.commons.logging.LogFactory"),在其中有个静态方法
public static LogFactory getFactory() throws LogConfigurationException
用于获取一个默认的LogFactory实例。
这段代码的意思就是说使用SPI机制,在Jar包的"META-INF/services/"目录下查找一个文件名为"org.apache.commons.logging.LogFactory"的文件,在文件中可以配置默认要使用的LogFactory具体实现类的全限定名。
2.2、自己的例子
现在有以下类层次结构
IA的内容如下:
AIA的内容如下:
BIA的内容如下:
CIA的内容如下:
Main的内容如下:
在META-INF/services/spi.IA文件中的内容如下:
运行spi.Main,可以发现输出结果如下:
参考文献:
[1]http://singleant.iteye.com/blog/1497259
[2]http://blog.csdn.NET/fenglibing/article/details/7083071