java性能优化实践,java策略设计模式
什么是java的SPISPI应用场景java SPI规范案例代码编写案例工程,阅读Springboot一定会完成的java SPI思想
什么是java的SPI
SPI的全名Service Provider Interface是由Java提供的第三方实现或扩展的一组API,可用于启用框架扩展和组件替换。
Java SPI实际上是一种由“基于接口的编程策略模式配置文件”的组合实现的动态加载机制。
系统设计的每个抽象通常有多种实现方案。 面向对象的设计通常建议基于模块间接口的编程,而不是在模块之间对实现类进行硬编码。 如果代码包含具体的实现类,则在违反可插件原则且需要替换一个实现时,必须修改代码。 为了防止在模块组装时在程序中动态确定,需要服务发现机制。
Java SPI是一种查找某个接口的服务实现的机制。 类似于IOC的思想,就是将组装的控制权转移到程序之外。 该机制在模块化设计中尤为重要。 所以SPI的核心思想是解耦。
SPI APP应用程序的典型示例:
通过数据库驱动程序加载接口加载类
JDBC加载不同类型数据库的驱动程序
通过登录接口进行类加载
SLF4J加载不同提供程序的日志实现类
Spring
Spring经常使用SPI,如servlet3.0规范的ServletContainerInitializer实现,自动转换类型转换器SPI (转换器SPI,格式器SPI )
达布o
Dubbo也经常使用SPI来扩展框架,但封装了Java提供的本机SPI,以便用户可以进行扩展以实现过滤器界面
要在Java SPI规范中使用Java SPI,必须遵守以下规则:
1 .在服务提供商提供接口的具体实现后,在jar包的META-INF/services目录下创建名为“接口的完全限定名称”的文件。 内容是实现类的完全限定名;
2、有接口实现类的jar包放在主程序的classpath中
3、主程序通过java.util.ServiceLoder动态加载实现模块,扫描META-INF/services目录下的配置文件,找到实现类的完全限定名,将类放入Java
4、SPI实现类必须携带不带参数的结构方法;
案例代码编写案例工程1 .创建父工程
2 .创建服务-公共项目
此工程模块是定义PayService接口的其他项目的通用依赖模块
publicinterfacepayservice { public void pay (; 创建ali-pay项目
在pom.xml文件中输入dependenciesdependencygroupidcn.tx.SPI/groupidartifactidservice-common/artifactidversion 1.0-snapshot
publicclassalipayserviceimplementspayservice { public void pay () { System.out.println (“支付支付宝(Alipay )”); 在resources下创建META-INF.services包
cn.tx.service.PayService文件的内容如下: 指定由文件名指示的接口的实现类
创建cn.tx.impl.AliPay service4. wx-pay项目
在pom.xml文件中引入依赖关系
ependenciesdependencygroupidcn.tx.SPI/groupidartifactidservice-common/artifactidversion 1.0-snapshot/version/derdersion
publicclasswxpayserviceimplementspayservice { public void pay (} { system.out.println ('微信支付' } ); }在度假村
ces下创建META-INF.services包创建cn.tx.service.PayService文件内容如下:指定文件名所示的接口的实现类 cn.tx.impl.WxPayService
5.创建main-pay工程
引入依赖
创建测试类
public class Test { public static void main(String[] args) { ServiceLoader<PayService> services = ServiceLoader.load(PayService.class); for (PayService service : services) { service.pay(); } }}执行测试:我们可以看到我们引入的Ali-pay就能得到AlipayService的实现类实例
如果我在pom中切换依赖
再次执行测试:我们可以看到我们引入的wx-pay就能得到WxpayService的实现类实例
如果两种支付的依赖都引入
测试结果
使用Java SPI机制的优势是实现解耦,使得第三方服务模块的装配控制的逻辑与调用者的业务代码分离,而不是耦合在一起。应用程序可以根据实际业务情况启用框架扩展或替换框架组件。
Springboot的原理即是使用期原理来做的自动配置。
源码获取和更多内容可以加Q群264572737
直接群中找到我即可。