月蝕傳說

          浮躁讓人失去理智
          posts - 25, comments - 101, trackbacks - 0, articles - 0
            BlogJava :: 首頁 ::  :: 聯系 :: 聚合  :: 管理

          SCA程序設計——本地服務的定義以及使用

          Posted on 2006-08-11 14:23 Dart 閱讀(1828) 評論(9)  編輯  收藏 所屬分類: SCA

          1.?????? SCA 簡介

          2005 11 月, IBM BEA Oracle SAP 等國外著名企業聯合發布了 SCA 0.9 規范草稿。 SCA 是一種全新的、跟語言無關的編程模型,這種面向服務構件的編程模型可以大大簡化客戶的編程,提高應用的靈活性,將會對現有軟件開發方式產生顛覆性的影響。”上面段文字是摘自普元 SCA 中文論壇中對 SCA 的描述,大家可以通過上面簡短的文字對 SCA 有一個簡單的認識。

          SCA 全稱 Service Component Architecture (服務組件構架) , 它是一套遵循 SOA 思想的構架,通過模型描述來構建應用系統。 SCA 并不只是針對于一種語言,它是可以支持多種語言的( Java,C++,PHP…. ),目前 SCA 給出了 Java 以及 C++ 的實現規范。

          對于 Java 版本的 SCA ,可以通過配置文件以及 J2SE5.0 Annotation 功能來描述服務,或者是通過 XML 格式的配置文件來描述服務,并能使得 SCA 容器對其進行管理。

          以下文中所提到了 SCA 都是 Java 版本的 SCA

          SCA 中的服務可以分為本地、遠程服務,以及外部服務,服務具有自己的屬性、引用,并且通過一些表示,可以確定服務的生命周期。

          下面介紹一下如何定義本地服務,以及如何去調用本地服務。

          2 .簡單的本地服務

          SCA 中可以通過 J2SE5.0 Annotation 來對服務進行標記,利用 @Service 標簽,就可以定義一個服務,一般情況下,服務一般是一個接口類,服務實現是一個具體實現該接口的類,當然,我們也可以把一個具體的類定義為一個服務,服務實現即其本身。

          @Service 標記是放在實現類上使用的,當標記上后, SCA 容器就會認為這個實現類為服務的實現。而服務的描述則是通過 @Service 的值來指定的,請看下面代碼:

          @Service(TestService. class )
          public ? class ?TestServiceImpl? implements
          ?TestService?{

          ????
          public ? void
          ?invoke()?{
          ????????System.out.println(
          " invoke?method "
          );
          ????}

          ????
          public ? void
          ?print(String?printString)?{
          ????????System.out.println(
          " print? " ? +
          ?printString?);
          ????}

          }


          上面代碼的將 TestServiceImpl 上標記了 @Service 而@Service中的TestService.class值就表明了該服務接口即為TestService接口,而TestServiceImpl就是這個服務的實現。通過上面簡單的定義,一個簡單的本地服務就算是做好了。

          這是最簡單的本地服務例子, @Service 中的服務接口僅僅只有一個,如果我們想要去調用這個服務則需要啟動 SCA 容器,然后通過模型上下文去定位服務:

          ??????? ??????

          ?SCA?sca? = ? new ?UxTeamSCA();?

          ??????????????sca.start();?

          ??????????????TestService?service?
          = ?(TestService)CurrentModuleContext.getContext().locateService( " TestService "
          );?

          ??????????????service.invoke();?

          ??????????????service.print(
          " print?it "
          );?


          簡單說一下上面代碼。

          SCA OSOA 組織提供的 SCA 框架標準接口,它初始化后會將當前線程中的模塊上下文( ModuleContext ,也是 SCA 的一個標注接口)賦值,用戶可以通過 CurrentModuleContext 類的靜態方法去獲得這個 ModuleContext ,模塊上下文實例就可以去通過服務名定位這個服務。

          我們通過 Annotation 標記服務的時候是不能給出服務名的,這種標記方式會將服務接口名默認為服務名。
          ?

          3 .多個服務接口

          在上面我們使用的 @Service 的值只有一個,其實 @Service 可以定義多個服務接口,形式如下: @Service(interfaces={Interface1.class,Interfaces2.class.....}) ,這種描述方式可以一次性定義多個服務,當然了,服務實現也還只是一個而已。

          下面代碼展示了如果定義多個服務:

          @Service(interfaces = {TestService1. class ,TestService2. class })?

          public ? class ?TestServiceImpl1? implements
          ?TestService1?,?TestService2?{?

          ??

          ???????
          public ? void
          ?invoke()?{?

          ??????????????System.out.println(
          " example2?invoke?method "
          );?

          ???????}?

          ??

          ???????
          public ? void
          ?print(String?printString)?{?

          ??????????????System.out.println(
          " print? " ? +
          ?printString?);?

          ???????}?

          ??

          }?


          這種標記的話,
          SCA 容器就會識別出 2 個服務: TesrService1 TestService2

          ????????????

          ??ModuleContext?context? = ?CurrentModuleContext.getContext();?

          ??TestService1?service1?
          = ?(TestService1)?context.locateService( " TestService1 "
          );?

          ??????????????service1.print(
          " print?it "
          );?

          ? TestService2?service2?
          = ?(TestService2)?context.locateService( " TestService2 "
          );?

          ??????????????service2.invoke();?

          ?

          如果我們在定義服務的時候,出現了服務定義和服務實現不一致,那就會出現異常。

          注意:這里的異常并不是 SCA 標準中所提到的,因為 SCA 只給出了規范,很多廠商的實現都不太一樣,對于上述問題的處理可能也不一樣。在以后的章節文章中,還會出現一些這種情況,在 SCA 標準沒有明確指明的情況下,我都是以個人的實現來處理的,待 SCA 完善后再進行標準處理。對于上面情況,我在實現這個簡單的 SCA 容器時,將這個情況看成是異常:

          @Service(interfaces = {TestService1. class ,TestService2. class })?

          public ? class ?TestServiceImpl2? implements
          ?TestService1??{?

          ??

          ???????
          public ? void
          ?print(String?printString)?{?

          ??????????????System.out.println(
          " example2?print? " ? +
          ?printString?);?

          ???????}?

          ??

          }
          ?

          ?

          ?以下調用方式會出現異常:

          ????????TestService2?service3? = ?(TestService2)?context.locateService( " TestService2 " );?

          ??????????????service3.invoke();?


          4
          .通過配置文件來生命服務以及實現

          SCA 中可以根據配置文件來對服務進行描述。

          描述服務接口的是一個后綴名為 componentType XML 文件,下面我們給出一個簡單的例子:

          <? xml?version="1.0"?encoding="ASCII" ?> ?

          < componentType? xmlns ="http://www.osoa.org/xmlns/sca/0.9" >
          ?

          < service? name ="TestService3" >
          ?

          < interface .java?interface ="org.uxteam.sca.example3.TestService3" />
          ?

          </ service >
          ?

          < service? name ="TestService4" >
          ?

          < interface .java?interface ="org.uxteam.sca.example3.TestService4" />
          ?

          </ service >
          ?

          </ componentType >
          ?


          上面的這個
          XML 指明了服務的名稱以及服務對應的接口類:

          第一個服務為 TestService3 ,對應得是一個 Java 接口,接口類得全路徑是 org.uxteam.sca.example3.TestService3

          第二個服務為 TestService4 ,對應的是一個 Java 接口,類路徑為 org.uxteam.sca.example3.TestService4

          ?

          一般情況下,該“組件描述”文件是和實現類放在一個目錄下的,文件名同實現類文件名相同,只是后綴名改為 componentType

          componentType 文件只是描述了服務接口,但是服務實現并沒有給出。

          其實服務實現的描述是在 .module 文件中給出的。

          .module 文件指明在 componentType 文件中給出的服務接口的實現類,如下:

          <? xml?version="1.0"?encoding="ASCII" ?> ?

          < module? xmlns ="http://www.osoa.org/xmlns/sca/0.9"
          ?

          name
          ="scaexample" ? >
          ?

          < component? name ="TestService3" >
          ?

          < implementation .java?class ="org.uxteam.sca.example3.TestServiceImpl" />
          ?

          </ component >
          ?

          ??

          < component? name ="TestService4" >
          ?

          < implementation .java?class ="org.uxteam.sca.example3.TestServiceImpl" />
          ?

          </ component >
          ?

          </ module >
          ?


          這個文件中,將服務名和組件名對應了起來,比如第一個組件是
          TestService3 ,它是一個 Java 實現,并且類路徑是 org.uxteam.sca.example3.TestServiceImpl 。同理,第二個組件也如此。

          我在實現這個簡單的 SCA 容器時規定, module 文件必須放置在 bin 目錄下(當然,其他的 SCA 容器如何規定我就不得而知了)

          SCA 容器啟動得時候,會去解析這幾個文件,如果文件無誤,那 SCA 就會開始維護配置文件中定義得服務了。我們同樣可以去定位、調用這些服務:

          ?????????????

          ?SCA?sca? = ? new ?UxTeamSCA();?

          ????????????sca.start();?

          ????????????ModuleContext?context?
          =
          ?CurrentModuleContext.getContext();?

          ????????????TestService3?service?
          = ?(TestService3)context.locateService( " TestService3 "
          );?

          ????????????service.invoke();?

          ??????????????

          ???????????TestService4?service1?
          = ?(TestService4)context.locateService( " TestService4 "
          );?

          ???????????service1.execute();?


          5
          .結束語

          通過上面的介紹希望能讓網友們對 SCA 有一個比較清晰簡單的認識。而本人實現的 SCA 容器目前來說還很幼稚,我會隨著對該 SCA 文章的更新來完善我的 SCA 容器。我本人希望能借此文章拋磚引玉,各位達人請多多指點,有錯誤的地方還請大家指正。

          下一章節我們來講服務的屬性和引用?
          代碼第一部分下載
          代碼第二部分下載
          代碼第三部分下載


          評論

          # re: SCA程序設計——本地服務的定義以及使用  回復  更多評論   

          2006-08-14 11:26 by Long Long Ago
          原來那些gef的文章怎么沒有了

          # re: SCA程序設計——本地服務的定義以及使用  回復  更多評論   

          2006-08-15 11:12 by guangqing
          Apache tuscany是SCA/SDO的runtime的開源實現,樓主的容器可以參考下它啊

          # re: SCA程序設計——本地服務的定義以及使用  回復  更多評論   

          2006-08-15 11:29 by guangqing
          針對你公開多個服務的情況,我寫了一個component的impl,不知道你的容器會不會報錯
          @Service(TestService1.class)
          public class TestService3 implements TestService1 {

          private TestService2 testService2;

          public void setTestService2(TestService2 testService2) {
          this.testService2 = testService2;
          }

          public void print(String printString) {
          this.testService2.invoke();
          }

          }

          # re: SCA程序設計——本地服務的定義以及使用  回復  更多評論   

          2006-08-15 13:05 by Dart
          @guangqing


          Apache的那個項目我看了下,它有C++的實現,并且對于SCA0.9中和EJB,JCA,Spring之間好像都有整合,但是參考它的代碼話可能會很費時間,還是自己寫吧,呵呵

          # re: SCA程序設計——本地服務的定義以及使用  回復  更多評論   

          2006-08-15 13:06 by Dart
          @guangqing

          你定義的那個服務在我實現的容器中應該沒什么問題吧,不過我傳上去的例子中,對定義重復的服務沒有檢測

          # re: SCA程序設計——本地服務的定義以及使用  回復  更多評論   

          2006-09-11 17:21 by aju
          恕我淺薄,我沒有看出它的優勢所在,
          這種實現根ioc有什么實質性的區別嗎?

          # re: SCA程序設計——本地服務的定義以及使用  回復  更多評論   

          2006-09-11 17:48 by Dart
          回 aju:

          SCA是一套完整的SOA實現框架,目前版本是0.9,還在進一步完善當中,它是一個能讓“SOA落地”的框架。

          IoC依賴注入是從程序設計著眼,它將實現了和接口分開,實現了松耦合。同樣,SCA在某些實現采用這種方式(或者說是模式)——其實并不只是SCA框架,很多框架也都采用了IoC的思想。就是說,IoC在SCA中是被采用的技術思想之一。

          本人的幾篇隨筆里,只是講了SCA最基本的功能。本人的文筆較爛,再加上我對SCA的理解還不夠深入,無法讓讀者理解其真正的用途所在,在這里我自我檢討一下,過幾天我會寫一篇關于如何使用SCA(SOA)進行項目開發的短文,希望能講SCA出現的用意說明白。

          # re: SCA程序設計——本地服務的定義以及使用  回復  更多評論   

          2006-09-11 22:29 by guangqing
          說白了IoC其實就是用來管理程序之間的依賴關系
          SCA中component之間的依賴關系也是由容器通過配置文件在運行時注入
          也就是說IoC其實并不是SCA的一個很大的特點
          SCA宣稱它是SOA 的programming model
          也就是依照SCA規范,就可以很好的創建SOA的服務
          但從目前看
          SCA做的還不夠,目前的特點僅僅在于提出了一個組件模型,可以調用和提供服務,可以支持多種語言的實現,可以解決不同協議之間的消息傳輸等(貌似對解決遺留系統集成有不小的幫助),當然這都需要中間件的支持
          但依然是component oriented
          而不是service oriented

          # re: SCA程序設計——本地服務的定義以及使用  回復  更多評論   

          2006-09-12 08:38 by aju
          那就期待摟主的文章了
          主站蜘蛛池模板: 遂溪县| 长宁区| 大英县| 怀集县| 商城县| 西华县| 商都县| 万山特区| 澄江县| 西青区| 井研县| 贺兰县| 扎兰屯市| 弥渡县| 太白县| 闽侯县| 郓城县| 松溪县| 吉安市| 双桥区| 泽库县| 布尔津县| 霍州市| 化德县| 左贡县| 枣阳市| 安福县| 二手房| 禄丰县| 当涂县| 曲松县| 翼城县| 泸定县| 崇阳县| 循化| 诏安县| 永宁县| 怀柔区| 湖口县| 焉耆| 绵阳市|