国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
使用 Spring Framework 設(shè)計和開發(fā) SCA 組件,第 1 部分: 三劍客:Spring、SCA 和 Apache Tuscany

使用 Spring Framework 設(shè)計和開發(fā) SCA 組件,第 1 部分: 三劍客:Spring、SCA 和 Apache Tuscany



級 別: 初級

Ramkumar Ramalingam, 軟件開發(fā)人員, IBM

2009 年 11 月 19 日

在 “使用 Spring Framework 設(shè)計和開發(fā) SCA 組件” 系列文章中,學(xué)習(xí)如何有效結(jié)合服務(wù)組件架構(gòu)(Service Component Architecture,SCA)與 Spring Framework 來創(chuàng)建分布式服務(wù)應(yīng)用程序。第一篇文章將概述 SCA 與 Spring 兩者相結(jié)合的優(yōu)勢。學(xué)習(xí)如何使用 Spring Framework 來設(shè)計和開發(fā) SCA 組件,如何將 Spring beans 公開為 SCA 服務(wù),以及如何在 Spring 應(yīng)用程序中訪問 SCA 服務(wù)和屬性。本文中的示例將使用 Apache Tuscany SCA Java™ 技術(shù)運行時。

簡介

在 Open SOA (OSOA) 項目發(fā)布標(biāo)題為 “強大的組合:SCA、OSGi 和 Spring” 的白皮書之后,這三種技術(shù)的結(jié)合引起了人們的一些關(guān)注。Spring Dynamic Module 就是這種基礎(chǔ)架構(gòu)的一種商業(yè)實現(xiàn),它結(jié)合了 Spring 和 OGSi。Spring beans 可以作為服務(wù)組件架構(gòu)(SCA)的組件實現(xiàn)使用。Apache Tuscany 的 Java 實現(xiàn)建立在 Apache 的 OSGi 框架 (Felix) 的基礎(chǔ)之上。

在本系列中,學(xué)習(xí)如何使用 Spring Framework 和 Apache Tuscany SCA Java 運行時來設(shè)計和開發(fā) SCA 組件。示例和代碼片段將幫助您理解 SCA 與 Spring 兩者結(jié)合所帶來的好處。您還將了解如何結(jié)合 SCA 與 Spring 來創(chuàng)建分布式服務(wù)應(yīng)用程序。

本文將介紹使用 Spring 開發(fā) SCA 組件時需要掌握的一些基本設(shè)計原則。您將探索如何將 Spring beans 公開為 SCA 服務(wù),以及如何在 Spring 應(yīng)用程序中訪問 SCA 服務(wù)和屬性。

第 2 部分將深入討論一些高級特性,比如說通過 SCA 處理多種應(yīng)用程序上下文以及在 Spring beans 中使用 SCA 注釋。

下載 示例源代碼。此示例需要在 Apache Tuscany 運行時中運行,但其側(cè)重點并不是展示如何開發(fā) SCA 組件。本文將重點討論如何將 Spring 應(yīng)用程序作為 SCA 組件的一種實現(xiàn)技術(shù)來使用。

程序

本文將討論以下程序。

SCA
提供了一個編程模型,用于創(chuàng)建基于面向服務(wù)架構(gòu)(Service-Oriented Architecture ,SOA)的應(yīng)用程序和解決方案。SCA 所依托的理念是將業(yè)務(wù)功能作為一系列服務(wù)提供,從而創(chuàng)建能滿足特定業(yè)務(wù)需求的解決方案。這些復(fù)合集可以包含為已有系統(tǒng)中的應(yīng)用程序和業(yè)務(wù)功能創(chuàng)建的新服 務(wù),以及作為復(fù)合應(yīng)用的一部分重用的應(yīng)用程序。SCA 提供了:
  • 一個用于服務(wù)復(fù)合以及服務(wù)組件創(chuàng)建的模型,包括在 SCA 復(fù)合集中重用已有應(yīng)用程序。
  • 靈活的復(fù)合、重用、技術(shù)和部署選擇,這使它成為了構(gòu)建異構(gòu)分布式系統(tǒng)的理想環(huán)境。
  • 支持多種實現(xiàn)語言和通信機制。
  • 簡化的組件編程模型,用于使用各種技術(shù)(比如說 Enterprise JavaBeans、Java POJOs、Spring beans、BPEL Process、COBOL、C++ 和 PHP 等)來實現(xiàn)業(yè)務(wù)服務(wù)。
Spring Framework
通常稱作 Spring,它是一個嘗試通過解決企業(yè)應(yīng)用程序開發(fā)的復(fù)雜性來提高 J2EE 環(huán)境適用性的開源項目。Spring 的一個優(yōu)勢在于它的分層架構(gòu)。它允許您選擇所使用的組件,同時為 J2EE 應(yīng)用程序開發(fā)提供了一個緊密結(jié)合的框架。Spring 為簡單的 Java 對象提供了一個框架,從而使它們能夠通過包裝器類和 XML 配置來使用 J2EE 容器。Spring 的目標(biāo)是,通過提高開發(fā)生產(chǎn)力和運行時性能,讓項目從中獲得巨大的好處,并改善測試范圍和應(yīng)用程序質(zhì)量。人們經(jīng)常將 Spring 描述為一種輕量級的容器環(huán)境,但更加恰當(dāng)?shù)谋扔骰蛟S是 “能簡化開發(fā)的框架“。
Apache Tuscany
開源 Apache Tuscany 項目致力于實現(xiàn) SCA 規(guī)范(和一些其他的 SCA 規(guī)范,如 Service Data Objects 和 Data Access Service)。依照 Open Service-Oriented Architecture (OSOA) 和針對全球信息社會 (OASIS SCA Java) 規(guī)范的一些標(biāo)準(zhǔn),Apache Tuscany 為 SCA 運行時提供了一個全面的基礎(chǔ)架構(gòu)。本文中的示例將使用 Apache Tuscany V1.5,它是截止本文撰寫時的最新版本。要運行示例應(yīng)用程序,需要 下載 Apache Tuscany SCA Java 實現(xiàn)的二進制發(fā)行版。






SCA Assembly Model

SCA 的基本工件是組件,它是 SCA 的基本構(gòu)成單元。組件包含一個經(jīng)過配置的實現(xiàn)實例,其中,實現(xiàn)是提供業(yè)務(wù)功能的程序代碼。業(yè)務(wù)功能將由其他組件作為服務(wù)提供。實現(xiàn)有時需要依賴于其他組件 提供的服務(wù)。這些依賴關(guān)系被稱作 引用。

實現(xiàn)具有可設(shè)置的 屬性,它們是影響業(yè)務(wù)功能運轉(zhuǎn)的數(shù)據(jù)值。組件通過為屬性提供值以及將引用關(guān)聯(lián)到其他組件所提供的服務(wù)來配置 實現(xiàn)。多個組件可以使用和配置同一實現(xiàn),而每個組件可以采用不同的方式來配置實現(xiàn)。

SCA 支持:

  • 各種實現(xiàn)技術(shù),比如說 Java POJOs、EJBs、Spring beans、BPEL Process、COBOL 和 C++
  • 一些腳本語言,比如說 PHP 和 JavaScript
  • 一些聲明式語言,比如說 XQuery 和 SQL

SCA 在一種被稱作復(fù)合集(composites) 的集合中描述應(yīng)用程序的內(nèi)容和關(guān)聯(lián),如圖 1 所示。復(fù)合集可以包含組件、服務(wù)、引用、屬性聲明以及這些元素之間的關(guān)聯(lián)描述。復(fù)合集可以分組和鏈接采用不同實現(xiàn)技術(shù)構(gòu)建的組件,從而允許在各業(yè)務(wù)任務(wù)中 采用適當(dāng)?shù)募夹g(shù)。復(fù)合集將部署在 SCA 域中。


圖 1. SCA 復(fù)合圖


SCA Assembly Model 包含一系列工件,它們在復(fù)合集方面定義了 SCA 域的配置,其中包括服務(wù)組件以及描述組件之間的關(guān)聯(lián)的相關(guān)工件。有關(guān) SCA Assembly Model Specification 的更多詳細信息,請參閱 參考資料。







SCA 與 Spring 兩者相結(jié)合的優(yōu)勢

Spring Framework 與 SCA 采用許多相同的設(shè)計原則。SCA 將 Spring 視為其組件的一種實現(xiàn)技術(shù)。SCA Spring Component Implementation Specification 定義了如何采用這種方式來使用 Spring。

與 Spring bean 類似,SCA 組件可以包含到其他組件所提供的服務(wù)的引用,并且有一些屬性可供配置。與 Spring 形成對比的是,SCA 是一種跨語言的分布式組件架構(gòu),它支持多種組件通信機制。通過將 Spring beans 發(fā)布為可由其他組件訪問的服務(wù)并為 Spring beans 提供關(guān)聯(lián)到其他(可能為遠程)組件的服務(wù)的引用,SCA 可以擴展 Spring 組件的功能。

要將 SCA 與 Spring 相結(jié)合,一種有效的方法是使用 Spring 來構(gòu)建 “粗粒度” 的服務(wù)組件實現(xiàn),并引入到 SCA 中以便公開服務(wù)、關(guān)聯(lián)服務(wù)組件以及處理異構(gòu)和分布式系統(tǒng)。SCA 可以在使用 Spring 實現(xiàn)的應(yīng)用程序中添加一些有用的功能,比如說:

  • 對遠程組件以及多種協(xié)議的擴展支持
  • 支持使用不受 JVM 支持的各種編程語言來編寫組件
  • 支持 WS-Policy 針對安全性和事務(wù)等活動指定的策略

易于測試組件是 Spring 的一項優(yōu)異的特性。缺少 API 和注入技術(shù)導(dǎo)致您只能使用簡單的模擬對象進行測試。SCA 在服務(wù)方面對此進行了補充,因為關(guān)于服務(wù)組件的 SCA 復(fù)合集可以方便地切換到模擬配置以進行測試。







將 Spring 應(yīng)用程序定義為 SCA 組件

在 Apache Tuscany SCA 實現(xiàn)中,SCA 使用 Spring 作為其組件在 SCA 復(fù)合集中的實現(xiàn)技術(shù)??梢詫?Spring 應(yīng)用程序定義為 SCA 復(fù)合集中的 SCA 組件,即 SCDL,其格式如下所示。


清單 1. 包含一個 Spring 組件的 SCA 復(fù)合集
                        <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> 元素的位置屬性可以指定目標(biāo) URI 指向某個存檔文件 (.jar) 目標(biāo),或者 直接指向 Spring 應(yīng)用程序上下文。

以下列表給出了指定 <implementation.spring> 位置屬性的目標(biāo) URI 的可能方法。

指定 Spring 應(yīng)用程序上下文文件
<implementation.spring location="application-context.xml"/>                        

指定目錄
<implementation.spring location="./spring"/>                        

目標(biāo) URI 將資源指定為名稱為 spring 的目錄,其中包含所有與 Spring 相關(guān)的文件。META-INF/MANIFEST.MF 文件必須包含在 Spring 目錄中,它使用 Spring-Context ::= <path> 格式的 Spring-Context 頭部指定到上下文配置的路徑。其中,path 相對于 Spring 目錄。如果 MANIFEST 文件中沒有 MANIFEST.MF 文件或 Spring-Context 頭部,則默認行為是使用 Spring 目錄下的 META-INF/spring 目錄中的 application-context.xml 文件建立應(yīng)用程序上下文。
指定存檔文件
<implementation.spring location="spring.jar"/>                        

目標(biāo) URI 將資源指定為 spring.jar 存檔文件,其中包含與 Spring 相關(guān)的所有文件。META-INF/MANIFEST.MF 文件必須位于 spring.jar 存檔文件中,它使用 Spring-Context ::= <path>. 格式的 Spring-Context 頭部指定到上下文配置文件的路徑。其中,path 指向 spring.jar 存檔中的文件。如果 MANIFEST 文件中沒有 MANIFEST.MF 文件或 Spring-Context 頭部,則默認行為是使用目錄 spring.jar 存檔文件中 META-INF/spring 目錄下的 application-context.xml 文件建立應(yīng)用程序上下文。




基于 Spring 的 SCA 組件

組件實現(xiàn)的業(yè)務(wù)功能將由其他組件作為服務(wù) 提供。實現(xiàn)可以依賴其他組件提供的服務(wù);這些依賴關(guān)系被稱作引用。實 現(xiàn)可以有可設(shè)置的屬性,即影響業(yè)務(wù)功能運轉(zhuǎn)的數(shù)據(jù)值。下面的例子展示了如何將 Spring beans 提供為 SCA 服務(wù),以及如何在您的 Spring 應(yīng)用程序上下文中配置 SCA 引用和 SCA 屬性。

示例

我們以圖 2 中的 CalculatorComponent 為例。它需要依賴其他組件(AddComponent、SubtractComponentMultiplyComponentDivideComponent)來實現(xiàn)所需的功能。在本例中,CalculatorComponent 的業(yè)務(wù)功能是使用 Spring beans 實現(xiàn)的,AddComponent 是使用 JavaScript 實現(xiàn)的,SubtractComponentMultiplyComponent 是使用簡單 POJO 實現(xiàn)的,而 DivideComponent 是使用 Groovy 腳本實現(xiàn)的。


圖 2. 基于 Spring 的 CalculatorComponent


下一步是創(chuàng)建一個名稱為 calculator.composite 的 SCA 復(fù)合集(如清單 2 所示)來定義組件、服務(wù)、引用、屬性聲明以及這些元素之間的關(guān)聯(lián)描述。詳細信息請參見 下 載 小節(jié)。


清單 2. 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">                        <component name="CalculatorComponent">                        <implementation.spring location="META-INF/spring/calculator-context.xml"/>                        <service name="CalculatorService">                        <interface.java interface="calculator.CalculatorService"/>                        <t:binding.rmi host="localhost" port="8099"                        serviceName="CalculatorRMIService"/>                        </service>                        <reference name="addService" target="AddComponent" />                        <reference name="subtractService" target="SubtractComponent" />                        <reference name="multiplyService" target="MultiplyComponent"/>                        <reference name="divideService" target="DivideComponent" />                        </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>                        

calculator.composite 使用 <reference> 元素定義 CalculatorComponent 與其他四個服務(wù)之間的依賴關(guān)系,比如說 AddComponent、SubtractComponent、MultiplyComponentDivideComponent。它們是使用不同技術(shù)實現(xiàn)的。AddComponent 提供 addService 實現(xiàn),用于返回兩數(shù)之和。同樣,SubtractComponent 提供 subtractService 實現(xiàn),用于返回兩數(shù)之差。MultiplyComponent 提供 multiplyService 實現(xiàn),用于返回兩數(shù)之積。DivideComponent 則提供 divideService 實現(xiàn)。

您可能注意到在 calculator.composite 中,AddComponent、SubtractComponent、MultiplyComponentDivideComponent 并未使用 <service> 元素明確公開任何服務(wù)(采用這種方式,本示例聲明為 CalculatorComponent 公開了 CalculatorService)。 這樣,當(dāng)您的 SCA 組件未使用 <service> 元素明確公開任何服務(wù)時,則 SCA 運行時默認會使用 binding.sca 綁定公開您的組件。同樣,在 CalculatorComponent 中,您不必為這些組件引用指定任何具體的綁定信息。SCA 運行時提供了默認的 binding.sca 綁定,用于關(guān)聯(lián)各組件。有關(guān) binding.sca 的詳細信息,請參閱 SCA Assembly Model Specification。

在本例中,CalculatorComponent 是一個 Spring 應(yīng)用程序,它使用 Spring beans 定義了業(yè)務(wù)邏輯。在您的 Spring 應(yīng)用程序上下文定義文件中聲明所需的 SCA 依賴關(guān)系非常重要。

創(chuàng)建一個名稱為 calculator-context.xml 的 Spring 應(yīng)用程序上下文定義文件。如清單 3 所示,通過聲明實現(xiàn)所需功能需要的 beans 以及它們的依賴關(guān)系,提供了 CalculatorComponent 的業(yè)務(wù)邏輯。


清單 3. 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="add" ref="addService"/>                        <property name="subtract" ref="subtractService"/>                        <property name="multiply" ref="multiplyService"/>                        <property name="divide" ref="divideService"/>                        </bean>                        </beans>                        

在 calculator-context.xml 中,calculator bean 通過將所需的依賴關(guān)系設(shè)置為屬性定義了 CalculatorComponent 的業(yè)務(wù)邏輯。對于 Spring bean 來說,每個屬性都是對要設(shè)置的值的實際定義,或容器中另一個 bean 的引用。在本例中,calculator bean 依賴于復(fù)合集中的組件所提供的各種 SCA 服務(wù),因此應(yīng)該將屬性設(shè)置為引用(設(shè)置 ref 屬性的值)calculator.composite 中定義的 SCA 引用。由于目標(biāo)是將 CalculatorComponent 公開為服務(wù),因此還應(yīng)聲明需要為 calculator.composite 中定義的 SCA 服務(wù)公開哪些 bean。

Spring 組件實現(xiàn)規(guī)范和 Apache Tuscany SCA 運行時允許您將 SCA 引用和屬性聲明為 bean 屬性。您還可以聲明被顯式或隱式地公開為 SCA 服務(wù)的 bean,如下所述。







聲明顯式 SCA 服務(wù)、引用和屬性

SCA Spring Component Implementation Specification 和 Apache Tuscany SCA 運行時允許您使用 Spring SCA 模式中的自定義 SCA 名稱空間元素在 Spring 應(yīng)用程序上下文文件中聲明 SCA 服務(wù)、引用和屬性。您可以使用自定義 SCA 名稱空間元素將 Spring beans 聲明為 SCA 服務(wù),并通過 SCA 組件定義指定到所獲取的 SCA 服務(wù)和屬性的引用。使用 Spring 應(yīng)用程序上下文文件中的 SCA 名稱空間元素被稱作 SCA 服務(wù)、引用和屬性的顯式聲明

用于在應(yīng)用程序上下文文件中聲明 SCA 服務(wù)、引用和屬性的自定義 SCA 名稱空間將在下面詳細討論。

<sca:service>
允許您控制需要將哪些 Spring bean 公開為 SCA 服務(wù)。為您提供一種方式來控制將哪些 Spring bean 公開為 SCA 服務(wù)。SCA 運行時負責(zé)創(chuàng)建合適的服務(wù)器綁定,根據(jù) SCDL 配置將需要的策略應(yīng)用到這些服務(wù)上。
<sca:reference>
為您提供一種方式來聲明 Spring 應(yīng)用程序上下文對復(fù)合集中的其他 SCA 組件所提供的服務(wù)的依賴關(guān)系。該 SCA 運行時負責(zé)創(chuàng)建合適的引用綁定,根據(jù) SCDL 配置將需要的策略應(yīng)用到這些服務(wù)上。
<sca:property>
為您提供一種方式來聲明 Spring 應(yīng)用程序上下文對由 SCA 組件實現(xiàn)提供的可設(shè)置屬性的依賴關(guān)系。<sca:property> 元素的 name 屬性應(yīng)該在復(fù)合集中擁有一個與所含組件相匹配的 SCA 屬性。

在 calculator-context.xml(在 清 單 3)中使用自定義名稱空間元素聲明 SCA 服務(wù)、引用和屬性,如下所示。


清單 4. calculator-context.xml
                        <beans xmlns="http://www.springf                        ramework.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"                        > <sca:service                        name="CalculatorService" type="calculator.CalculatorService" target="Calculator"/>                        <bean id="Calculator" class="calculator.                        CalculatorServiceImpl">                        <property name=                        "add" ref="addService"/>                        <property name=                        "subtract" ref="subtractService"/>                        <property name=                        "multiply" ref="multiplyService"/>                        <property name=                        "divide" ref=                        "divideService"/>                        </bean>                        <sca:reference name=                        "addService" type=                        "calculator.AddService"/>                        <sca:reference name=                        "subtractService" type="calculator.SubtractService"/>                        <sca:reference name=                        "multiplyService" type="calculator.MultiplyService"/>                        <sca:reference name=                        "divideService" type=                        "calculator.DivideService"/>                        </beans> 

如清單 4 所示,<sca:service> 元素聲明提供 CalculatorService 作為來自目標(biāo) calculator bean 的 SCA 服務(wù)。必需的 name 屬性擁有的值應(yīng)該與在 calculator.composite 中為 CalculatorComponent 定義的 <service> 元素的名稱相同。必需的 type 屬性應(yīng)該將服務(wù)類型聲明為一個 Java 類的完全限定名。必需的 target 屬性應(yīng)該擁有應(yīng)用程序上下文中的一個 <bean/> 元素的名稱,該元素提供由此 <sca:service> 元素聲明的服務(wù)。

清單 4 中的 <sca:reference> 元素聲明此應(yīng)用程序上下文對由復(fù)合集中其他可用的 SCA 組件提供的服務(wù)的依賴關(guān)系。在本示例中,calculator bean 依賴于 SCA 服務(wù),比如 AddComponentSubtractComponent、MultiplyComponentDivideComponent。這些依賴關(guān)系使用 <sca:reference> 元素進行聲明。此元素的必需 name 屬性擁有的值應(yīng)該與在 calculator.composite 中為 CalculatorComponent 定義的 <reference> 元素的名稱相同。必需的 type 屬性應(yīng)該將服務(wù)的類型聲明為一個 Java 類的完全限定名。對于 calculator.composite 的 CalculatorComponent 中的每個 <reference> 元素,會在 Spring 應(yīng)用程序上下文中聲明一個等效的 <sca:reference> 元素。

類似地,<sca:property> 元素允許您聲明此應(yīng)用程序上下文對 calculator.composite 中的 CalculatorComponent 提供的 SCA 屬性的依賴關(guān)系。必需的 name 屬性擁有的值應(yīng)該與 calculator.composite 中為 CalculatorComponent 定義的 <property/> 元素名稱相同(如 清 單 2 中所示)。必需的 type 屬性應(yīng)該將屬性類型聲明為一個 Java 類的完全限定名。







聲明隱式的 SCA 服務(wù)、引用和屬性

SCA Spring Component Implementation Specification 和 Apache Tuscany SCA 運行時支持直接在 Spring 應(yīng)用程序上下文文件中聲明 SCA 服務(wù)、引用和屬性,無需使用在 Spring SCA 模式中定義的任何自定義 SCA 名稱空間元素。在 Spring 應(yīng)用程序上下文文件中直接使用 SCA 引用和屬性(無需自定義 SCA 名稱空間)稱為 SCA 服務(wù)、引用和屬性的隱式聲明。清 單 3 中的 calculator-context.xml 是一個例子。

在 calculator.composite 文件中定義的具有 addService、subtractService、multiplyServicedivideService 等名稱的 SCA 引用(參見 清 單 2)可以直接用作 Spring 應(yīng)用程序上下文中的 bean 引用(如 清 單 3 所示)。calculator bean 屬性可以設(shè)置為使用 SCA 引用名直接引用(設(shè)置 ref 屬性的值)在 calculator.composite 中定義的 SCA 引用(清 單 2)。在這種情況下,bean 引用的類型將由 Tuscany 運行時從 bean 類定義中進行內(nèi)?。╥ntrospect),以驗證它并將它與在復(fù)合集中定義的 SCA 應(yīng)用類型相匹配。

類似地,在 SCA 復(fù)合集中定義的 SCA 屬性可以直接用作 Spring 應(yīng)用程序上下文中的 bean 引用。將 bean 屬性設(shè)置(設(shè)置 ref 屬性的值)為使用 SCA 屬性名稱引用在 calculator.composite 中定義的 SCA 屬性。

當(dāng)應(yīng)用程序上下文中沒有顯式的 <sca:service> 元素時,所有頂級的 bean 都將被公開為 SCA 服務(wù),使用 bean 名稱作為服務(wù)名稱。任何內(nèi)部 bean 或抽象 bean 都不會被用于隱式服務(wù)創(chuàng)建。當(dāng) Spring bean 實現(xiàn)類實現(xiàn)多個接口時,這些 bean 可以被公開為單個或多個服務(wù)。您使用顯式的 <sca:service> 元素,其中每個 <sca:service> 元素引用相同的 <bean> 元素,但 type 屬性僅使用由 bean 提供的接口之一。在隱式創(chuàng)建服務(wù)時,bean 被公開為單一服務(wù),方法是將 bean 類本身聲明為服務(wù)的一個接口。

盡管 Apache Tuscany SCA 運行時支持使用隱式 SCA 服務(wù)、引用和屬性,但也有一些場景不適合使用隱式聲明。

場景 1. 為集合使用隱式 SCA 引用和屬性

在 Spring 中,<list/>、<set/>、<map/><props/> 元素允許分別定義和設(shè)置 Java Collection 類型 List、SetMapProperties 的屬性和參數(shù)。清單 5 中的示例 bean 定義演示了在 Spring 的 <list/><set/><map/> 元素中使用隱式 SCA 引用和屬性的局限性。


清單 5. 集合的隱式 SCA 引用
                        <bean id="moreComplexObject" class="example.ComplexObject">                        <!-- results in a setSomeList(java.util.List) call -->                        <property name="someList">                        <list>                        <value>a list element followed by a reference</value>                        <ref bean="mySCAReference1" />                        </list>                        </property>                        <!-- results in a setSomeMap(java.util.Map) call -->                        <property name="someMap">                        <map>                        <entry>                        <key>                        <value>an entry</value>                        </key>                        <value>just some string</value>                        </entry>                        <entry>                        <key>                        <value>a ref</value>                        </key>                        <ref bean="mySCAReference2" />                        </entry>                        </map>                        </property>                        <!-- results in a setSomeSet(java.util.Set) call -->                        <property name="someSet">                        <set>                        <value>just some string</value>                        <ref bean="mySCAReference3" />                        </set>                        </property>                        </bean>                        

假設(shè)名為 someList 的 bean 屬性的 bean 實現(xiàn)被定義為清單 6 的內(nèi)容。List 被聲明為泛型,以接收其集合中任何類型的 Java 類。


清單 6. someList 屬性的 bean 實現(xiàn)
                        private                        List<?> someList;                        public List<?> getSomeList() {                        return someList;                        }                        public                        void setSomeList(List<?> someList) {                        this.someList = someList;                        }                        

在此場景中,Apache Tuscany 運行時無法內(nèi)省此集合所需的 SCA 引用對象的準(zhǔn)確類型(類型 mySCAReference1mySCAReference2mySCAReference3)。必需的 SCA 引用注入將失敗。當(dāng) someMapsomeSet 屬性被聲明為接受其集合中任何類型的 Java 類時,相同的規(guī)則也適用于它們。建議您總是顯式地使用 <sca:reference> 元素聲明 SCA 引用,并在這類場景中使用必需的 nametype 屬性。

場景 2. 為構(gòu)造函數(shù)注入使用隱式 SCA 引用和屬性

Spring 中的構(gòu)造函數(shù)注入允許您通過類構(gòu)造函數(shù)注入依賴關(guān)系。為了減少潛在的歧義,Spring 建議只要在 bean 實現(xiàn)中定義了多個構(gòu)造函數(shù),就為 <constructor-arg> 元素適當(dāng)使用 indextype 屬性。

Tuscany 還建議為 <constructor-arg> 元素使用 indextype 屬性,為所有構(gòu)造函數(shù)注入場景顯式聲明相關(guān)的 SCA 引用,即使 bean 只有一個構(gòu)造函數(shù)。

例如,假設(shè)您想要使用構(gòu)造函數(shù)為 calculator bean 注入必需的依賴關(guān)系(必需的 SCA 引用)。您應(yīng)該像清單 7 所示的那樣定義 bean。在 Tuscany 中,不支持為構(gòu)造函數(shù)使用隱式 SCA 引用和屬性。


清單 7. 針對 calculator bean 的構(gòu)造函數(shù)注入
                        <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">                        <constructor-arg index="0" type="calculator.AddService" ref="addService"/>                        <constructor-arg index="1" type="alculator.SubtractService"                        ref="subtractService"/>                        <constructor-arg index="2" type="calculator.MultiplyService"                        ref="multiplyService"/>                        <constructor-arg index="3" type="calculator.DivideService" ref="divideService"/>                        </bean>                        <sca:reference name="addService" type="calculator.AddService"/>                        <sca:reference name="subtractService" type="calculator.SubtractService"/>                        <sca:reference name="multiplyService" type="calculator.MultiplyService"/>                        <sca:reference name="divideService" type="calculator.DivideService"/>                        </beans>                        







SCA 運行時中的應(yīng)用程序上下文創(chuàng)建

在 Spring 中,主要的模塊單元是應(yīng)用程序上下文,它包含一定數(shù)量的 bean(由 Spring 應(yīng)用程序上下文管理的對象)。應(yīng)用程序上下文可以在一個分層結(jié)構(gòu)中配置,在其中,子應(yīng)用程序上下文可以看到父應(yīng)用程序上下文中定義的 bean,但反之則不行。

默認情況下,Spring 容器在創(chuàng)建容器時驗證每個 bean 的配置,包括驗證 bean 引用是否實際引用了有效的 bean。對于包含對 SCA 引用和屬性的引用的 Spring 應(yīng)用程序上下文,為在 Spring 應(yīng)用程序上下文中使用的所有 SCA 引用和屬性創(chuàng)建有效 bean 是 SCA 運行時的職責(zé)。然后,Spring 容器可以驗證 bean 并成功加載應(yīng)用程序上下文。圖 3 給出了一個示例。


圖 3. 具有父上下文的 SCA 運行時


Tuscany 運行時使用 Spring Binary V2.5.5 加載和運行目標(biāo)應(yīng)用程序上下文,這些上下文在 <implementation.spring> 元素的 location 屬性中指定,而該元素在 calculator.composite 文件中定義(如 清 單 2 所示)。在加載目標(biāo)應(yīng)用程序上下文之前,Tuscany 運行時嘗試:

  • 內(nèi)省目標(biāo)應(yīng)用程序上下文定義文件,確定在 Spring 應(yīng)用程序上下文中聲明的 SCA 服務(wù)、引用和屬性。
  • 使用合適的 Spring bean,為在目標(biāo)應(yīng)用程序上下文中聲明的所有 SCA 引用屬性創(chuàng)建一個 SCAParentApplicationContext。

在上面的示例中,使用合適的 Spring bean 為在 calculator-context.xml 文件中聲明的所有 SCA 引用(比如 addService、subtractServicemultiplyServicedivideService)創(chuàng)建了一個 SCAParentApplicationContext(參 見 圖 3)。隨后,使用 org.springframework.context.support.GenericApplicationContext 創(chuàng)建目標(biāo)應(yīng)用程序上下文,將 SCAParentApplicationContext 聲明為它的父上下文。

Tuscany 運行時還提供了必要的基礎(chǔ)設(shè)施來創(chuàng)建合適的服務(wù)綁定,根據(jù) SCDL 配置,為使用 Spring bean 實現(xiàn)的這些服務(wù)提供必需的策略。





結(jié)束語

本文介紹了如何使用基于 Spring 的應(yīng)用程序設(shè)計和開發(fā) SCA 組件。您現(xiàn)在可以使用自定義 SCA 名稱空間元素,在 Spring 應(yīng)用程序上下文中顯式聲明 SCA 服務(wù)、引用和屬性,可以在 Spring 應(yīng)用程序上下文中直接聲明 SCA 引用和屬性。您了解了 SCA 運行時如何為 SCA 組件創(chuàng)建目標(biāo)應(yīng)用程序上下文。借助示例,本文簡短介紹了在應(yīng)用程序上下文中使用隱式 SCA 引用和屬性的局限性。

SCA 和 Spring 能夠構(gòu)成一個強大的組合。Spring 提供了基礎(chǔ)設(shè)施來開發(fā)具有更高效率和運行時性能的組件,還改進了測試覆蓋率和應(yīng)用程序質(zhì)量。SCA 提供了必要的基礎(chǔ)設(shè)施來組裝和建?;?SOA 的組件,支持組件公開服務(wù),將服務(wù)組件連接在一起,以及處理異構(gòu)的分布式系統(tǒng)。

敬請期待第 2 部分的推出,第 2 部分將介紹一些高級特性,比如使用 SCA 處理多種應(yīng)用程序上下文,在 Spring bean 中使用 SCA 注釋。






下載

描述 名字 大小 下載方法
Calculator 示例源代碼 os-springsca1-spring-example.zip 7KB HTTP
關(guān)于下載方法的信息


參考資料

學(xué)習(xí)
  • 查閱 Apache Tuscany 的相關(guān)信息,它是一個綜合性基礎(chǔ)設(shè)施,適用于基于 SCA 標(biāo)準(zhǔn)的 SOA 開發(fā)和管理。

  • 了 解 Spring Framework 的所有相關(guān)信息。

  • 了解關(guān)于 Open Service-Oriented Architecture (OSOA) 項目的更多信息。

  • 了解 OASIS SCA Java,一個開放 SCA 技術(shù)委員會。

  • Introducing SCA” 涵蓋了基礎(chǔ)知識、SCA 組件、策略以及如何將所有這些內(nèi)容融合在一起。

  • 白皮書 “Power Combination, SCA, OSGi and Spring” 說明了為什么 SCA、OSGi 和 Spring 應(yīng)該被當(dāng)作輔助性技術(shù),將 SCA 與 OSGi 和 Spring 組合在一起的不同可能性和方式,組合 SCA、OSGi 和 Spring 的優(yōu)勢,以及正在進行的組合嘗試。

  • Spring 動態(tài)模塊 簡化了構(gòu)建在 OSGi 框架中運行的 Spring 應(yīng)用程序的過程。

  • 閱讀 SCA Assembly Model Specification(關(guān)于 SCA 組合模型的 OSOA 規(guī)范)。

  • SCA Spring Component Implementation Specification 了解更多信息。

  • 了解 Spring SCA 模式,這是關(guān)于 SCA Spring Component Implementation 實現(xiàn)的 OSOA 規(guī)范的一部分,主要介紹在 Spring 中聲明 SCA 元素。

  • 要收聽針對軟件開發(fā)人員的有趣訪談和討論,請訪問 developerWorks 播客

  • 隨 時關(guān)注 developerWorks 技術(shù)活動網(wǎng)絡(luò)廣播。

  • 查閱最近將在全球舉辦的面向 IBM 開放源碼開發(fā)人員的研討會、交易展覽、網(wǎng)絡(luò)廣播和其他 活動。

  • 訪問 developerWorks 開源專區(qū),獲取廣泛的 how-to 信息、工具和項目更新,以幫助您用開源技術(shù)進行開發(fā),并與 IBM 產(chǎn)品結(jié)合使用,還可以訪問我們 最流行的文章和教程

  • 查看免費的 developerWorks 演示中心,觀看并了解 IBM 及開源技術(shù)和產(chǎn)品功能。


獲得產(chǎn)品和技術(shù)

討論


關(guān)于作者

Ramkumar Ramalingam 在印度班加羅爾的 IBM India Software Labs 擔(dān)任高級軟件工程師。他是 Apache Tuscany 的提交者,以及 Apache Tuscany 項目管理委員會的成員。他還是 OASIS SCA Java Specification Community 的一名成員。

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
SCA裝配模型規(guī)范V100之一
通過用 .NET 生成自定義窗體設(shè)計器來定制應(yīng)用程序
InfoQ: Spring2.5的新特性:第一部分
HTML5 組件: 實現(xiàn)標(biāo)準(zhǔn)組件
譯言網(wǎng) | JHotDraw讓你成為程序設(shè)計的畢加索
面向服務(wù)架構(gòu)(SOA)的汽車軟件實現(xiàn)和部署
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服