Java的SPI实现解耦
概述
SPI的全称是服务提供接口,可以用其来启动框架的扩展和替换组件。
其本质是利用 接口实现+策略模式+配置文件来实现对实现类的动态加载。
在具体的使用中,存在一些约定:
(1)规定在 classPath 的 META-INF/services/ 下,创建该接口的全名称文件
(2)在该文件中,写入该接口实现类全称(路径+文件名),多个实现类的话,分行写。
(3)用的2时候,使用 java.util.ServiceLoader 的 load(Interface.class),获取到实现类,就可以使用了。
值得注意的是,接口实现类必须有一个不带参数的构造方法。
实现案例
在本应用中,存在两个模块,分别为A模块和B模块,这两个模块中,A模块是主模块,B是从模块,B模块是依赖A模块的。但是在目前有一个类,该类中实现在B模块中,A模块需要调用这个类的函数,而模块不能再依赖B模块,此时需要进行解耦。在本实现中,利用SPI的方式进行解耦实现。具体实现方案为:
(1)在A模块新建一个接口:MyLogAppender,具体实现为:
/**
* @author Huang gen(kenfeng)
* @description 自定义的appender接口
* @Since 2021/02/21
**/
public interface MyLogAppender {
/**
* 获取实现的appender
*
还没有评论,来说两句吧...