首页天道酬勤java性能优化实践,java策略设计模式

java性能优化实践,java策略设计模式

张世龙 05-04 04:52 71次浏览

什么是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工程
引入依赖

<dependencies> <dependency> <groupId>cn.tx.spi</groupId> <artifactId>service-common</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>cn.tx.spi</groupId> <artifactId>ali-pay</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <!--<dependency> <groupId>cn.tx.spi</groupId> <artifactId>wx-pay</artifactId> <version>1.0-SNAPSHOT</version> </dependency>--> </dependencies>

创建测试类

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中切换依赖

<dependencies> <dependency> <groupId>cn.tx.spi</groupId> <artifactId>service-common</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <!--<dependency> <groupId>cn.tx.spi</groupId> <artifactId>ali-pay</artifactId> <version>1.0-SNAPSHOT</version> </dependency>--> <dependency> <groupId>cn.tx.spi</groupId> <artifactId>wx-pay</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies>

再次执行测试:我们可以看到我们引入的wx-pay就能得到WxpayService的实现类实例

如果两种支付的依赖都引入

<dependencies> <dependency> <groupId>cn.tx.spi</groupId> <artifactId>service-common</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>cn.tx.spi</groupId> <artifactId>ali-pay</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>cn.tx.spi</groupId> <artifactId>wx-pay</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies>

测试结果

使用Java SPI机制的优势是实现解耦,使得第三方服务模块的装配控制的逻辑与调用者的业务代码分离,而不是耦合在一起。应用程序可以根据实际业务情况启用框架扩展或替换框架组件。
Springboot的原理即是使用期原理来做的自动配置。
源码获取和更多内容可以加Q群264572737

直接群中找到我即可。

centos7安装nodejs,卸载nodejs