跳转到主要内容

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

当您初次登录到 developerWorks 时,将会为您创建一份概要信息。您在 developerWorks 概要信息中选择公开的信息将公开显示给其他人,但您可以随时修改这些信息的显示状态。您的姓名(除非选择隐藏)和昵称将和您在 developerWorks 发布的内容一同显示。

所有提交的信息确保安全。

  • 关闭 [x]

当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

所有提交的信息确保安全。

  • 关闭 [x]

使用 Spring Framework 设计和开发 SCA 组件,第 2 部分: 使用 Apache Tuscany 的高级技巧

组合多种应用程序上下文

Ramkumar Ramalingam, 软件开发人员, EMC
Ramkumar Ramalingam
Ramkumar Ramalingam 在印度班加罗尔的 IBM India Software Labs 担任高级软件工程师。他是 Apache Tuscany 的提交者,以及 Apache Tuscany 项目管理委员会的成员。他还是 OASIS SCA Java Specification Community 的一名成员。

简介: 在 “使用 Spring Framework 设计和开发 SCA 组件” 系列文章中,学习如何有效结合服务组件架构(Service Component Architecture,SCA)与 Spring Framework 来创建分布式服务应用程序。本文将探讨 Apache Tuscany 运行时所支持的高级特性。了解如何结合多种应用程序上下文实现 SCA 组件。我们将通过一个例子向您展示用来在 Spring bean 类中显式声明 SCA 服务、引用和属性的所有 SCA 注释。

查看本系列更多内容

发布日期: 2010 年 2 月 04 日
级别: 初级 其他语言版本: 英文
访问情况 : 1443 次浏览
评论: 


简介

本系列的 使用 Spring Framework 设计和开发 SCA 组件,第 1 部分:三剑客:Spring、SCA 和 Apache Tuscany 概述了综合使用 SCA 和 Spring 的益处。您了解了如何作为一种 SCA 服务公开 Spring bean 以及如何在 Spring 应用程序内访问 SCA 服务和属性。

本文将探讨 Apache Tuscany 运行时支持的一些高级特性。了解如何将多种应用程序上下文综合起来用作 SCA 组件的一个实现。SCA 注释可用来在 Spring bean 类内显式声明 SCA 服务、引用和属性。下载 计算器示例的源代码。

本文中的示例使用了 Apache Tuscany SCA Java™ 技术运行时 V1.5.1。要运行这个示例应用程序,需要下载 Apache Tuscany SCA Java 实现 的二进制发行版。


为 SCA 组件使用多种应用程序上下文

使用 Spring Framework 设计和开发 SCA 组件,第 1 部分:三剑客:Spring、SCA 和 Apache Tuscany,您了解了一个 Spring 应用程序可被定义为 SCA 复合集(即 SCDL)内的一个 SCA 组件,其格式如清单 1 所示。


清单 1. 具有一个 Spring 组件的 SCA 复合集
				
<composite xmlns="http://www.osoa.org/xmlns/sca/1.0"
      xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.0"
      targetNamespace="http://calc"
      xmlns:c="http://calc"
      name="Calculator">

    <component name="CalculatorServiceComponent">
             <implementation.spring location="targetURI"/>
    </component>

</composite>
            

<implementation.spring> 元素的 location 属性可将目标 URI 指定为指向一个归档文件(JAR)、一个目录或直接指向一个 Spring 应用程序上下文文件。在任何情况下,在使用 <implementation.spring> 组件的 location 属性时,Apache Tuscany 只允许一个应用程序上下文作为目标应用程序上下文,用作 SCA 组件的实现。

Apache Tuscany 允许使用多种应用程序上下文来实现 SCA 组件,方法是在这个目标应用程序上下文(由此 SCA 复合集文件内的 <implementation.spring> 元素的 location 属性标识)中定义一个 ClassPathXmlApplicationContext(如 清单 3 所示)bean。清单 2 给出了一个示例。


清单 2. 具有一个 Spring 组件的 SCA 复合集
				
<composite xmlns="http://www.osoa.org/xmlns/sca/1.0"
      xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.0"
      targetNamespace="http://calc"
      xmlns:c="http://calc"
      name="Calculator">

    <component name="CalculatorServiceComponent">
             <implementation.spring location="beanRefContext.xml"/>
    </component>
</composite>
            


清单 3. beanRefContext.xml
				
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:sca="http://www.springframework.org/schema/sca"
       xsi:schemaLocation="
				http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/sca 
       http://www.osoa.org/xmlns/sca/1.0/spring-sca.xsd">

     <bean class=” org.springframework.context.support.ClassPathXmlApplicationContext”>
	 <constructor-arg> 
                   <list> 
                          <value>context1.xml</value> 
                          <value>context2.xml</value> 
                          <value>context3.xml</value> 
                  </list> 
         </constructor-arg>
     </bean>
</beans>

这个 Apache Tuscany 运行时的意图是将具有一个 bean 定义(以 ClassPathXmlApplicationContext 作为 bean 类)的所有目标应用程序上下文视为一个具有多种应用程序上下文的场景。这个 Tuscany 运行时之后将会为由 ClassPathXmlApplicationContext bean 的 constructor 参数标识的这列应用程序上下文文件创建一个组合的应用程序上下文实例。

清单 2 的例子中,被作为 CalculatorServiceComponent 的一个实现定义的目标应用程序上下文是 beanRefContext.xml。在一个典型的场景中(在单个应用程序上下文场景)中,Tuscany 运行时将会为 beanRefContext.xml 创建一个应用程序上下文实例并将其用作 CalculatorServiceComponent 的一个实现实例。

清单 3 内,beanRefContext.xml 只定义了一个 bean 定义(以 ClassPathXmlApplicationContext 作为 bean 类)。这个场景被 Tuscany 运行时视为是一个包含多种应用程序上下文的场景。由 ClassPathXmlApplicationContext bean 定义的 constructor 参数标识的这列应用程序上下文文件(context1.xml、context2.xml 和 context3.xml)被综合起来创建一个应用程序上下文实例,以用作 CalculatorServiceComponent 的一个实现实例。图 1 展示了一个例子。

对于一个包含多个上下文的场景,由 ClassPathXmlApplicationContext bean 定义的 constructor 参数标识的每个应用程序上下文文件都可具备其自己的 SCA 服务、引用和属性(以显式或隐式的方式声明)。


图 1. 具备 ClassPathXmlApplicationContext 的 SCA 运行时
具备 ClassPathXmlApplicationContext 的 SCA 运行时的屏幕截图

对于一个单应用程序上下文的场景,正如在 使用 Spring Framework 设计和开发 SCA 组件,第 1 部分:三剑客:Spring、SCA 和 Apache Tuscany 中所讨论的,Tuscany 运行时会尝试:

  • 内省这个目标应用程序上下文定义文件以决定所声明的 SCA 服务、引用和属性。
  • 使用适当的 Spring beans 为在这个目标应用程序上下文内声明的所有 SCA 引用和属性创建一个 SCAParentApplicationContext

之后,将 SCAParentApplicationContext 声明为父上下文,使用 org.springframework.context.support.GenericApplicationContext 创建这个目标应用程序上下文的实例。

在一个含多种应用程序上下文的场景中,如 图 1 所示,Tuscany 运行时会尝试:

  • 内省由 ClassPathXmlApplicationContext bean(在目标应用程序上下文中定义)的 constructor 参数标识的这列应用程序上下文文件(context1.xml、context2.xml 和 context3.xml)来决定所声明的 SCA 服务、引用和属性。
  • 用适当的 Spring bean 为已标识的这列应用程序上下文文件内声明的所有 SCA 引用和属性创建一个 SCAParentApplicationContext

之后,通过将 SCAParentApplicationContext 声明为其父上下文,为这列应用程序上下文文件创建一个 org.springframework.context.support.ClassPathXmlApplicationContext 实例。

在目标应用程序上下文上使用 ClassPathXmlApplicationContext bean 定义来提供对含多种应用程序上下文的场景的支持,这个内容超出了 SCA Spring 组件实现规范 V1.0 的建议。

不同于目标应用程序上下文内的 ClassPathXmlApplicationContext bean 定义,在应用程序上下文的层次结构内标识的任何一个 ClassPathXmlApplicationContext bean 定义都将被 Spring 运行时视为一个常规的 ClassPathXmlApplicationContext bean 并被相应处理。


Spring beans 的 SCA 注释

Apache Tuscany 对 Spring beans 内的 SCA 注释的支持超出了由 OSOA 定义的 SCA Spring 组件实现规范 V1.0 的建议。

使用 Spring Framework 设计和开发 SCA 组件,第 1 部分:三剑客:Spring、SCA 和 Apache Tuscany 中,您了解到可以使用自定义 SCA 名称空间元素,比如 <sca:service><sca:reference><sca:property>,在 Spring 应用程序上下文文件内显式声明 SCA 服务、引用和属性。同样地,Apache Tuscany SCA 运行时允许您使用 SCA 注释在 Spring bean 类内显式地声明 SCA 服务、引用和属性。

下面介绍了用于在 Spring bean 类内显式地声明 SCA 服务、引用和属性的 SCA 注释。

org.osoa.sca.annotations.Service
用来控制哪些 Spring bean 可被公开为 SCA 服务。@Service 注释一般用在 Java 类上,用来指定由该实现提供的服务的接口。
org.osoa.sca.annotations.Reference
用来在由此复合集内可用的其他 SCA 组件提供的服务上声明一个 Spring bean 的依赖项。通过定义一个字段、一个 setter 方法参数或一个 constructor 参数(由此服务接口键入并由一个 @Reference 注释),可以使用引用注入访问服务。
org.osoa.sca.annotations.Property
用来在由 SCA 组件实现提供的可设置属性上声明一个 Spring 应用程序上下文的依赖项。@Property 注释被用来定义一个 SCA 属性。

如下这个示例展示了如何在 Spring bean 类中使用 SCA 注释。仍然使用在 使用 Spring Framework 设计和开发 SCA 组件,第 1 部分:三剑客:Spring、SCA 和 Apache Tuscany 内讨论的 CalculatorComponent 示例展示 SCA 注释的用法。

calculator.composite,如清单 4 所示,定义了 CalculatorComponent,它依赖于其他四个服务:AddComponentSubtractComponentMultiplyComponentDivideComponent


清单 4. calculator.composite
				
<composite xmlns="http://www.osoa.org/xmlns/sca/1.0"
      xmlns:t="http://tuscany.apache.org/xmlns/sca/1.0"
      targetNamespace="http://calc"
      xmlns:c="http://calc"
      name="Calculator">

    <service name="CalculatorService" promote=”CalculatorComponent">
        <interface.java interface="calculator.CalculatorService"/>
        <t:binding.rmi host="localhost" port="8099" serviceName="CalculatorRMIService"/>
    </service>

    <component name="CalculatorComponent">
        <implementation.spring location="META-INF/spring/calculator-context.xml"/>        
        <reference name="addService" target="AddComponent" />
        <reference name="subtractService" target="SubtractComponent" />
        <reference name="multiplyService" target="MultiplyComponent"/>
        <reference name="divideService" target="DivideComponent" />
        <property name="message">HelloWorld</property>
    </component>

    <component name="AddComponent">
        <t:implementation.script script="calculator/AddServiceImpl.js"/>
    </component>

    <component name="SubtractComponent">
        <implementation.java class="calculator.SubtractServiceImpl"/>
    </component>

    <component name="MultiplyComponent">
        <implementation.java class="calculator.MultiplyServiceImpl"/>        
    </component>

    <component name="DivideComponent">
        <t:implementation.script script="calculator/DivideServiceImpl.groovy"/>
    </component>
</composite>
            

在这个例子中,CalculatorComponent 是一个 Spring 应用程序,它定义了使用 Spring bean 的业务逻辑。创建一个名为 calculator-context.xml 的应用程序上下文文件,如清单 5 所示,它通过将所需的依赖项设置为 bean 属性定义了 CalculatorComponent 的业务逻辑。


清单 5. calculator-context.xml
				
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:sca="http://www.springframework.org/schema/sca"
       xsi:schemaLocation="
				http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/sca 
       http://www.osoa.org/xmlns/sca/1.0/spring-sca.xsd">

    <bean id="Calculator" class="calculator.CalculatorServiceImpl">        
        <property name="addService" ref="addService"/>
        <property name="subtractService" ref="subtractService"/>
        <property name="multiplyService" ref="multiplyService"/>
        <property name="divideService" ref="divideService"/>
    </bean>

</beans>
            

使用 Spring Framework 设计和开发 SCA 组件,第 1 部分:三剑客:Spring、SCA 和 Apache Tuscany,您了解到自定义 SCA 名称空间元素,比如 <sca:service><sca:reference><sca:property>,可用于在这个应用程序上下文文件内(参见清单 5)显式声明 SCA 服务、引用和属性。在本文中,您又了解了 SCA 注释是如何在 CalculatorServiceImpl bean 类内用作一种显式声明 SCA 服务、引用和属性的备选方式。清单 6 给出了一个示例。


清单 6. CalculatorServiceImpl.java
				
@Service(CalculatorService.class)
public
				class CalculatorServiceImpl implements CalculatorService {
    
    // setter injection
    public AddService addService;
    
    // field injection
    @Reference
    public SubtractService subtractService;
    
    // field injection (different reference and field name)
    @Reference(name="multiplyService")
    public MultiplyService multiply;  
    
    // setter injection (different reference and field name)
    public DivideService divide;  
    
    // setter injection
    public String message;

    @Reference
    public
				void setAddService(AddService addService) {
        this.addService = addService;
    }
    
    public AddService getAddService() {
        return addService;
    }

    public
				void setSubtractService(SubtractService subtractService) {
        this.subtractService = subtractService;
    }
    
    public SubtractService getSubtractService() {
        return subtractService;
    }    
    
    @Reference(name="divideService")
    public
				void setDivideService(DivideService divide) {
        this.divide = divide;
    }
    
    public DivideService getDivideService() {
        return divide;
    }
    
    public
				void setMultiplyService(MultiplyService multiply) {
        this.multiply = multiply;
    }
    
    public MultiplyService getMultiplyService() {
        return multiply;
    }
    
    @Property
    public
				void setMessage(String message) {
        this.message = message;
    }
    
    …
}
            

如上所示的 @Service 注释表明 CalculatorServiceImpl bean 被公开为一个服务并使用 CalculatorService 作为其服务接口。对于由这些 bean 公开的每个服务,在 SCA 复合集内都应该定义一个对等的 <service/> 元素(如 清单 4 所示)。

清单 6 内所示的 @Reference 注释,在由复合集内可用的其他 SCA 组件提供的服务上声明了这个 bean 类的依赖项。在本例中,Calculator bean 依赖于 SCA 服务 addServicesubtractServicemultiplyServicedivideService

CalculatorServiceImpl bean 内,addServicedivideService 上的依赖项是通过定义 setter 方法上的一个引用注入声明的,这些方法的参数由相应的服务接口 AddServiceDivideService 键入。subtractServicemultiplyService 上的依赖项是通过在由相应服务接口 SubtractServiceMultiplyService 键入的字段上定义一个引用注入声明的。

清单 6 所示的 @Property 注释通过在一个适当的 setter 方法上定义 @Property 注释,声明了由 SCA 组件提供的可设置属性上的依赖项。

建议

建议您独立使用 SCA 注释;不要与任何 Spring 本机注释相混淆。此外,还建议您使用 SCA 注释或自定义 SCA 名称空间元素(如第 1 部分内讨论的)来为 Spring 应用程序显式声明 SCA 服务、引用和属性。不要将它们混在一起。


为基于 Spring 的 SCA 组件使用 SCA 绑定

绑定 是为服务和引用所用的。引用使用绑定来描绘调用一个服务所需的访问机制,这个服务可以是由另一个 SCA 复合集提供的一个服务。服务使用绑定来描述客户机(可以是来自于另一个 SCA 复合集的客户机)用来调用服务的访问机制。

使用 Spring 作为其实现技术的组件无需在 Spring 配置内引入基于绑定的 SCA 元数据就可以连接 SCA 服务和引用。Spring 上下文对 SCA 环境知之不多。因而,这个 Spring bean 实现与之前示例内的保持相同,但是要在 SCA 复合集的级别选用不同的绑定。

Apache Tuscany 运行时支持各种绑定,比如 Web 服务、JMS、 HTTP、RMI、JSON RPC、EJB 和 ATOM。因这些绑定独立于 Spring 上下文,所以,所有受 SCA 支持的绑定均可被用于 Spring 实现。

请注意 Apache Tuscany 并不支持在一个基于 Spring 的 SCA 组件上的异步对话服务编程。


结束语

在本文中,您了解了多种应用程序上下文可被综合起来用作 SCA 组件的一个实现。这个 SCA 运行时为含多种应用程序上下文的场景创建了一个目标应用程序上下文实例。您还了解了如何使用 SCA 注释在 spring bean 类内显式声明 SCA 服务、引用和属性。

SCA 和 Spring 能够构成一个强大的组合。Spring 提供了基础设施来开发具有更高效率和运行时性能的组件,还改进了测试覆盖率和应用程序质量。SCA 提供了必要的基础设施来组装和建模基于 SOA 的组件,SCA 让您的组件能够公开服务,将服务组件连接在一起,以及处理异构的分布式系统。



下载

描述名字大小下载方法
Calculator 示例源代码os-springsca2-spring-example.zip15KBHTTP

关于下载方法的信息


参考资料

学习

获得产品和技术

讨论

关于作者

Ramkumar Ramalingam

Ramkumar Ramalingam 在印度班加罗尔的 IBM India Software Labs 担任高级软件工程师。他是 Apache Tuscany 的提交者,以及 Apache Tuscany 项目管理委员会的成员。他还是 OASIS SCA Java Specification Community 的一名成员。

关于报告滥用的帮助

报告滥用

谢谢! 此内容已经标识给管理员注意。


关于报告滥用的帮助

报告滥用

报告滥用提交失败。 请稍后重试。


developerWorks:登录


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 使用条款

 


当您初次登录到 developerWorks 时,将会为您创建一份概要信息。您在 developerWorks 概要信息中选择公开的信息将公开显示给其他人,但您可以随时修改这些信息的显示状态。您的姓名(除非选择隐藏)和昵称将和您在 developerWorks 发布的内容一同显示。

请选择您的昵称:

当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

(长度在 3 至 31 个字符之间)


单击提交则表示您同意developerWorks 的条款和条件。 使用条款.

 


为本文评分

评论

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Open source
ArticleID=466519
ArticleTitle=使用 Spring Framework 设计和开发 SCA 组件,第 2 部分: 使用 Apache Tuscany 的高级技巧
publish-date=02042010
author1-email=ramkumar_rj@in.ibm.com
author1-email-cc=

标签

Help
使用 搜索 文本框在 My developerWorks 中查找包含该标签的所有内容。

使用 滑动条 调节标签的数量。

热门标签 显示了特定专区最受欢迎的标签(例如 Java technology,Linux,WebSphere)。

我的标签 显示了特定专区您标记的标签(例如 Java technology,Linux,WebSphere)。

使用搜索文本框在 My developerWorks 中查找包含该标签的所有内容。热门标签 显示了特定专区最受欢迎的标签(例如 Java technology,Linux,WebSphere)。我的标签 显示了特定专区您标记的标签(例如 Java technology,Linux,WebSphere)。