dubbo SpiExtensionFactory的设计初衷
1.扩展未知类分为:spi 和spring
spi的扩展对象存储在SpiExtensionFactory
spring的扩展对象存储在 SpringExtensionFactory
2.SpringExtensionFactory的设计初衷:
a.设计的目的:方便开发者对扩展未知类的配置(可以用spi配置也可以spring bean实现)
b.SpringExtensionFactory在provider发布或consumer引用一个服务的时候,会把spring的容器托付给SpringExtensionFactory中去.具体代码为:ReferenceBean.setApplicationContext 和 ServiceBean.setApplicationContext
public void setApplicationContext(ApplicationContext applicationContext) {
this.applicationContext = applicationContext;SpringExtensionFactory.addApplicationContext(applicationContext);
}
c.当SpiExtensionFactory没有获取到对象的时候会遍历SpringExtensionFactory中的spring容器来获取要注入的对象. 具体代码:AdaptiveExtensionFactory.getExtension
publicT getExtension(Classtype, String name) {
for (ExtensionFactory factory : factories) {
T extension = factory.getExtension(type, name);
if (extension != null) {
return extension;
}
}
return null;
}
3.SpringExtensionFactory目前的作用?
SpringExtensionFactory前期的设计初衷非常好,但是后来执行偏离了,没有按这个初衷去落地。因为从这SpringExtensionFactory.getExtension代码(如下:)可以看出,是从ApplicationContext获取对象的。
publicT getExtension(Classtype, String name) {
for (ApplicationContext context : contexts) {
if (context.containsBean(name)) {
Object bean = context.getBean(name);
if (type.isInstance(bean)) {
return (T) bean;
}
}
}
return null;
}
但是目前这套系统没有配置spring对象的任何痕迹;甚至连配置自定义filter类,也无法实现spring bean配置,只能spi配置。