扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:李俊杰 来源:Csdn博客 2007年12月26日
关键字:
在本页阅读全文(共6页)
在ProvideFactory接口中定义了Class<M> getModelType()方法,在SpringImplementationProvideFactory中实现为:
public Class<SpringImplementation> getModelType() |
其中的ModelType就对应于的model的值 ,即META-INF/services/目录下的是“org.apache.tuscany.sca.provide.ImplementationProviderFactory”文件下每行数据中的model属性的值(org.apache.tuscany.sca.implementation.spring.SpringImplementation)。
在ImplementationProviderFactory<M extends Implementation>中定义了factory方法createImplementationProvider(…),在SpringImplementationProvideFactory中实现为:
public ImplementationProvider createImplementationProvider (RuntimeComponent component, SpringImplementation implementation) implementation, proxyService, propertyFactory); |
在DefaultProvideFactoryExtensionPoint类中有获取ProvideFactory的方法:
|
和插件式设计模式类似,loadProviderFactories();也是调用ServiceConfigUtil 类的getServiceNames方法到META-INF/services/目录下的文件,本例子找的文件是“org.apache.tuscany.sca.provide.ImplementationProviderFactory”,文件的主要内容是:
|
最后保存到类DefaultProviderFactoryExtensionPoint的HashMap<Class<?>, ProviderFactory>中如下图所示:
图6 |
ServiceConfigUtil是按行读文件,由于每行比较长,在本文书写时不方便,就折为两行,但还能够分清是否是一行的。读后把每行数据都保存在List<String>中,ServiceConfigUtil的parseServiceDeclaration方法是解析字符串,每行字符使用“;”隔开,前者为Factory名称,后者为属性名称及数值,多个属性用“,”分割,读完后分别存储Map<String, String> attributes,key分别为“class”,“model”。
在这儿并没有把相关的factory,直接用model,factory对象直接放入到HashMap<Class<?>, ProviderFactory>中,而是在Factory外封装了延迟加载类(LazyBindingProviderFactory, LazyImplementationProviderFactory都是DefaultProvideFactoryExtensionPoint的内部类)作为value值放入HashMap<Class<?>, ProviderFactory>中。这样只有使用时才去加载这些类。
Factory调用及代理模式实现的延迟加载功能
下面来看调用是多么简单,providerFactories就是我们图示的HashMap,下面的implementationProvider是那个延迟加载的类LazyImplementationProviderFactor的对象:
|
LazyImplementationProviderFactor调用createImplementationProvider方法如下,其中getFactory()是要加载该延迟加载类封装的实际的的ProviderFactor。
public ImplementationProvider createImplementationProvider(RuntimeComponent component, Implementation Implementation) { |
另外除了延迟加载的原理,还存在代理模式的应用,如下图所示,这儿调用的是LazyImplementationProvicerFactory,然后通过它来调用实际的ImplementationProvicerFactory的实现类来创建ImplementationProvider。
图7 |
且看它这时才加载( ImplementationProviderFactory getFactory() ),这正是延迟加载的含义。
if (factory == null) { (Class<ImplementationProviderFactory>)Class.forName(className, true, classLoader); factoryClass.getConstructor(ExtensionPointRegistry.class); |
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者