技术开发 频道

SCA软件架构设计理念分析

    在DefaultProvideFactoryExtensionPoint类中有获取ProvideFactory的方法:

public ProviderFactory getProviderFactory(Class<?> modelType) {
    
//
    loadProviderFactories();
    Class
<?>[] classes = modelType.getInterfaces();
    
for (Class<?> c : classes) {
    ProviderFactory factory
= providerFactories.get(c);
    
if (factory != null) {
    
return factory;
    }
    }
    
return providerFactories.get(modelType);
    }
    

    和插件式设计模式类似,loadProviderFactories();也是调用ServiceConfigUtil 类的getServiceNames方法到META-INF/services/目录下的文件,本例子找的文件是“org.apache.tuscany.sca.provide.ImplementationProviderFactory”,文件的主要内容是:

    org.apache.tuscany.sca.implementation.spring.SpringImplementationProviderFactory;

    model=org.apache.tuscany.sca.implementation.spring.SpringImplementation

    org.apache.tuscany.sca.implementation.resource.provider.ResourceImplementationProviderFactory;

    model=org.apache.tuscany.sca.implementation.resource.ResourceImplementation

    org.apache.tuscany.sca.implementation.osgi.invocation.OSGiImplementationProviderFactory;

    model=org.apache.tuscany.sca.implementation.osgi.OSGiImplementationInterface


    最后保存到类DefaultProviderFactoryExtensionPoint的HashMap<Class<?>, ProviderFactory>中如下图所示 

    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>中。这样只有使用时才去加载这些类。

0
相关文章