科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道SCA软件架构设计理念分析

SCA软件架构设计理念分析

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

SCA (Service Component Architecture) 是一个开发SOA(Service-Oriented Architecture)面向服务应用的简单模型规范,它描述用于使用SOA构建应用程序和系统的模型。本文仅仅涉及插件式设计模式及工厂模式的深化和发展。

作者:李俊杰 来源:Csdn博客 2007年12月26日

关键字:

  • 评论
  • 分享微博
  • 分享邮件

在本页阅读全文(共6页)

在ProvideFactory接口中定义了Class<M> getModelType()方法,在SpringImplementationProvideFactory中实现为:

public Class<SpringImplementation> getModelType() 
{
return SpringImplementation.class;
}

其中的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) 
{ return new SpringImplementationProvider(component,
implementation, proxyService, propertyFactory);
}

在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>中如下图所示:

图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的对象:

ImplementationProviderFactory    
providerFactory   =   (ImplementationProviderFactory)

providerFactories.getProviderFactory(implementation.getClass());

ImplementationProvider       
implementationProvider  =   providerFactory.createImplementationProvider

(component, implementation);

LazyImplementationProviderFactor调用createImplementationProvider方法如下,其中getFactory()是要加载该延迟加载类封装的实际的的ProviderFactor。

public ImplementationProvider createImplementationProvider(RuntimeComponent component, 
  Implementation Implementation) {
return getFactory().createImplementationProvider(component, Implementation);
}

另外除了延迟加载的原理,还存在代理模式的应用,如下图所示,这儿调用的是LazyImplementationProvicerFactory,然后通过它来调用实际的ImplementationProvicerFactory的实现类来创建ImplementationProvider。

图7

且看它这时才加载( ImplementationProviderFactory getFactory() ),这正是延迟加载的含义。

if (factory == null) {
try {
ClassLoader classLoader = ImplementationProviderFactory.class.getClassLoader();
Class<ImplementationProviderFactory> factoryClass =
     (Class<ImplementationProviderFactory>)Class.forName(className, true, classLoader);
Constructor<ImplementationProviderFactory> constructor =
     factoryClass.getConstructor(ExtensionPointRegistry.class);
factory = constructor.newInstance(registry);
} catch (Exception e) {
throw new IllegalStateException(e);
}
}
return factory;

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章