<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    月蝕傳說

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

    SCA程序設(shè)計——本地服務(wù)的定義以及使用

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

    1.?????? SCA 簡介

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

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

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

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

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

    下面介紹一下如何定義本地服務(wù),以及如何去調(diào)用本地服務(wù)。

    2 .簡單的本地服務(wù)

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

    @Service 標記是放在實現(xiàn)類上使用的,當標記上后, SCA 容器就會認為這個實現(xiàn)類為服務(wù)的實現(xiàn)。而服務(wù)的描述則是通過 @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值就表明了該服務(wù)接口即為TestService接口,而TestServiceImpl就是這個服務(wù)的實現(xiàn)。通過上面簡單的定義,一個簡單的本地服務(wù)就算是做好了。

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

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

    ?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 類的靜態(tài)方法去獲得這個 ModuleContext ,模塊上下文實例就可以去通過服務(wù)名定位這個服務(wù)。

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

    3 .多個服務(wù)接口

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

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

    @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 個服務(wù): TesrService1 TestService2

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

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

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

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

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

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

    ?

    如果我們在定義服務(wù)的時候,出現(xiàn)了服務(wù)定義和服務(wù)實現(xiàn)不一致,那就會出現(xiàn)異常。

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

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

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

    ??

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

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

    ???????}?

    ??

    }
    ?

    ?

    ?以下調(diào)用方式會出現(xiàn)異常:

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

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


    4
    .通過配置文件來生命服務(wù)以及實現(xiàn)

    SCA 中可以根據(jù)配置文件來對服務(wù)進行描述。

    描述服務(wù)接口的是一個后綴名為 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 指明了服務(wù)的名稱以及服務(wù)對應(yīng)的接口類:

    第一個服務(wù)為 TestService3 ,對應(yīng)得是一個 Java 接口,接口類得全路徑是 org.uxteam.sca.example3.TestService3

    第二個服務(wù)為 TestService4 ,對應(yīng)的是一個 Java 接口,類路徑為 org.uxteam.sca.example3.TestService4

    ?

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

    componentType 文件只是描述了服務(wù)接口,但是服務(wù)實現(xiàn)并沒有給出。

    其實服務(wù)實現(xiàn)的描述是在 .module 文件中給出的。

    .module 文件指明在 componentType 文件中給出的服務(wù)接口的實現(xiàn)類,如下:

    <? 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 >
    ?


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

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

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

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

    ?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
    .結(jié)束語

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

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


    評論

    # re: SCA程序設(shè)計——本地服務(wù)的定義以及使用  回復(fù)  更多評論   

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

    # re: SCA程序設(shè)計——本地服務(wù)的定義以及使用  回復(fù)  更多評論   

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

    # re: SCA程序設(shè)計——本地服務(wù)的定義以及使用  回復(fù)  更多評論   

    2006-08-15 11:29 by guangqing
    針對你公開多個服務(wù)的情況,我寫了一個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程序設(shè)計——本地服務(wù)的定義以及使用  回復(fù)  更多評論   

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


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

    # re: SCA程序設(shè)計——本地服務(wù)的定義以及使用  回復(fù)  更多評論   

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

    你定義的那個服務(wù)在我實現(xiàn)的容器中應(yīng)該沒什么問題吧,不過我傳上去的例子中,對定義重復(fù)的服務(wù)沒有檢測

    # re: SCA程序設(shè)計——本地服務(wù)的定義以及使用  回復(fù)  更多評論   

    2006-09-11 17:21 by aju
    恕我淺薄,我沒有看出它的優(yōu)勢所在,
    這種實現(xiàn)根ioc有什么實質(zhì)性的區(qū)別嗎?

    # re: SCA程序設(shè)計——本地服務(wù)的定義以及使用  回復(fù)  更多評論   

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

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

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

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

    # re: SCA程序設(shè)計——本地服務(wù)的定義以及使用  回復(fù)  更多評論   

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

    # re: SCA程序設(shè)計——本地服務(wù)的定義以及使用  回復(fù)  更多評論   

    2006-09-12 08:38 by aju
    那就期待摟主的文章了
    主站蜘蛛池模板: 在线永久免费观看黄网站| 亚洲av午夜电影在线观看 | 国产午夜免费福利红片| 在线成人a毛片免费播放| 亚洲一级黄色视频| 亚洲人成电影在线观看网| 成人免费观看男女羞羞视频| 久久国产精品免费看| 69av免费视频| 亚洲精品成人网久久久久久| 99亚洲精品高清一二区| 在线观看亚洲网站| 日韩免费精品视频| 国产亚洲3p无码一区二区| 亚洲成人网在线播放| www.av在线免费观看| 国产91免费在线观看| 亚洲国产无套无码av电影| 亚洲丰满熟女一区二区哦| 99re在线精品视频免费| 国产午夜亚洲精品理论片不卡| 午夜精品免费在线观看| 黄网站色在线视频免费观看| AV在线播放日韩亚洲欧| 日韩欧美亚洲国产精品字幕久久久| 久久久久久亚洲Av无码精品专口 | 今天免费中文字幕视频| 美女被免费视频网站a国产| 亚洲成人黄色网址| 亚洲一级免费视频| 亚洲自偷精品视频自拍| 一级毛片免费毛片一级毛片免费| 国产偷伦视频免费观看| 日韩精品成人亚洲专区| 亚洲色精品三区二区一区| 免费观看a级毛片| 阿v免费在线观看| 国产L精品国产亚洲区久久 | 免费看无码自慰一区二区| 亚洲三级在线观看| 亚洲免费日韩无码系列 |