dubbo spi机制与spring spi机制----spi机制(二)

从上一篇Java SPI 机制解析 可以知道 Java SPI 的一些劣势。Dubbo 的扩展点加载从 Java SPI 扩展点发现机制加强而来。

SPI实际上是“接口+策略模式+配置文件”实现的动态加载机制。在系统设计中,模块之间通常基于接口编程,不直接显示指定实现类。一旦代码里指定了实现类,就无法在不修改代码的情况下替换为另一种实现。为了达到动态可插拔的效果,java提供了SPI以实现服务发现。



Dubbo的SPI


相关定义

ExtensionLoader,是dubbo的SPI机制的查找服务实现的工具类,类似与Java的ServiceLoader,可做类比。dubbo约定扩展点配置文件放在classpath下的/META-INF/dubbo,/META-INF/dubbo/internal,/META-INF/services目录下,配置文件名为接口的全限定名,配置文件内容为配置名=扩展实现类的全限定名。

Demo走起~~~~~~~~~~~~~~

(1)接口和实现类

接口


实现类

(2)使用Dubbo SPI的方式通过接口找实现类方式

a- 定义约定好的文件夹 

META-INF/dubbo/internal

b- 定义接口文件 

com.jack.DistributedArchitecture

c- 配置实现类

springcloud=com.yjy.SpringCloudImpl

dubbo=com.yjy.DubboImpl

servicemesh=com.yjy.ServiceMeshImpl

(3)模板代码

ExtensionLoader extensionLoader =ExtensionLoader.getExtensionLoader(DistributedArchitecture.class);

DistributedArchitecture distributedArchitecture =extensionLoader.getExtension("xxx"); // key

distributedArchitecture.solve("家源技术");

源码走读

instance = createExtension(name, wrap);
getExtensionClasses().get(name)
loadExtensionClasses


loadResource(extensionClasses, classLoader, resourceURL, overridden, excludedPackages)
loadClass(extensionClasses, resourceURL, Class.forName(clazz, true, classLoader), name, overridden)
this.saveInExtensionClass(extensionClasses, clazz, n, overridden);


Dubbo SPI应用场景

dubbo的 Filter、Protocol、Cluster、LoadBalance 等都是通过 SPI 的方式进行拓展加载的。

Spring中的SPI机制

Spring中提供了SPI机制,我们只需要在 META-INF/spring.factories 中配置接口实现类名,即可通过服务发现机制,在运行时加载接口的实现类:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\

org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration

在 spring-boot-autoconfigure 模块下,SpringBoot默认就配置了很多接口的服务实现:

配置好 spring.factories 文件后,我们就可以通过 SpringFactoriesLoader 动态加载接口实现类了,代码如下:


模板代码


SpringFactoriesLoader API

org.springframework.core.io.support.SpringFactoriesLoader就是Spring框架中的“ServiceLoader”,该类提供了下列功能:

类静态成员常量 final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories"

此常量定义了该工具类要从每个jar包中提取的工厂类定义属性文件的相对路径。

类静态方法 List loadFactories(Class factoryClass, ClassLoader classLoader)

此方法会读取classpath上所有的jar包中的所有 META-INF/spring.factories 属性文件,找出其中定义的匹配类型 factoryClass 的工厂类,然后创建每个工厂类的对象/实例,并返回这些工厂类对象/实例的列表。

类静态方法 List loadFactoryNames(Class factoryClass, ClassLoader classLoader)

此方法会读取classpath上所有的jar包中的所有 META-INF/spring.factories 属性文件,找出其中定义的匹配类型 factoryClass 的工厂类,然后并返回这些工厂类的名字列表,注意是包含包名的全限定名。

SpringFactoriesLoader 源码


loadFactories


loadFactoryNames


SpringBoot2.7.0 自动配置将不推荐使用spring.factories

SpringBoot 2.7 中,不再推荐使用/META-INF/spring.factories文件作为自动配置类的配置文件,所以对于有自定义Starter的开发者来说,有时间要抓紧把这一变化改起来了,因为在SpringBoot 3开始将移除对/META-INF/spring.factories的支持。

如果您已经创建了自动配置,那么应该将注册从META-INF/spring.factories转移到一个名为META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports的新文件。每一行都包含自动配置的完全限定名。

你可能感兴趣的:(dubbo spi机制与spring spi机制----spi机制(二))