dubbo SpiExtensionFactory的设计初衷

2017-11-18  本文已影响0人  阿甘java

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配置。

上一篇 下一篇

猜你喜欢

热点阅读