什么javaspi
是Java提供的一套用来被第三方实现或者扩展的API,它可以用来启用框架扩展和替换组件。也就是说java提供了一套API,然后由供应商进行扩展。jdbc的驱动就是这样实现的。
java spi 约定
在META-INF/services/目录中创建以接口全限定名命名的文件该文件内容为Api具体实现类的全限定名
使用ServiceLoader类动态加载META-INF中的实现类
如SPI的实现类为Jar则需要放在主程序classPath中
Api具体实现类必须有一个不带参数的构造方法
案例 模仿jdbc驱动
架构方案
标准服务接口 :就相当于java提供的jdbc的接口工程
服务提供方 : 就相当于 oracle 和mysql 提供了自己的接口实现
调用方: 也就是我们项目中的dao层 使用jdbc的
标准服务接口
提供加载驱动的接口工程,新建一个jdbc-spi项目,用于制定接口规范,提供DriverManager接口
然后使用mvn install 命令进行把jdbc-spi项目生成jar包上传到maven的本地私服
服务提供方
oracle的服务提供
新建一个oracle项目,依赖jdbc-spi.jar并对其做实现
同时在resources资源目录下的META-INF.services目录下创建一个以接口全类名命名的文件,内容是实现类的全类名
mysql的服务提供
跟oracle的服务提供一样,需要对jdbc.spi工程中的接口进行实现,然后再resources文件夹下META-INF.services目录下创建一个以接口全类名命名的文件,内容是实现类的全类名
然后使用mvn install 命令进行把jdbc-spi项目生成jar包上传到maven的本地私服
调用方
需添加需要的提供方的jar包依赖
调用方代码的实现
目前的依赖使用的是mysql的驱动,执行结果为
当需要替换驱动的实现方式,由mysql替换成oracle,只需要替换服务提供方的jar就行了,调用方获取驱动的代码不需要修改
执行结果:
使用spi的好处
spi中标准接口服务只提供接口,没有提供实现类,接口实现类没有跟接口进行硬编码耦合在一起,所以扩展起来很方便。很好的进行了解耦功能。