国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術(shù)文章
文章詳情頁

Java組件開發(fā):一個概念框架

瀏覽:4日期:2024-06-30 15:58:32
內(nèi)容: Java組件開發(fā)的一個概念框架作者:Palash Ghosh譯者:kelvincheng版權(quán)聲明:任何獲得Matrix授權(quán)的網(wǎng)站,轉(zhuǎn)載時請務(wù)必以超鏈接形式標(biāo)明文章原始出處和作者信息及本聲明作者:Palash Ghosh;kelvincheng原文地址:http://www.onjava.com/pub/a/onjava/2005/03/23/components.html中文地址:http://www.matrix.org.cn/resource/article/43/43899_Java_Component_Developmen.html關(guān)鍵詞: Java Component Development我先介紹幾個在構(gòu)建和設(shè)計解決方案來適應(yīng)商業(yè)活動中的持續(xù)變化時需要注意的商業(yè)場景:·公司需要將其文件倉庫從文檔文件轉(zhuǎn)成網(wǎng)絡(luò)文件。·公司需要更換其安全提供商。·因為經(jīng)濟情況的巨大的改變,保險公司必須擴展其保險流程政策到更大范圍。一樣?xùn)|西是很確定的,需求更改就像商業(yè)和技術(shù)一樣快速改變。但是對于所有改變,無論其大小,我們都需要拋棄原來整個系統(tǒng)重新開始么?這是不必要的—架構(gòu)和設(shè)計解決方案時加入少許考慮,好的策略以及最優(yōu)方法可以適應(yīng)現(xiàn)有的體系結(jié)構(gòu)的變更而不需要太多爭辯。在面向?qū)ο缶幊桃约胺植际綄ο蠹夹g(shù)中,組件是類和接口的集合,通過可重用的外部API來滿足需求(功能性的以及非功能性的)。組件應(yīng)該可以在分布式網(wǎng)絡(luò)環(huán)境運行來形成網(wǎng)絡(luò)程序。基于組件的設(shè)計和開發(fā)對于遵循面向?qū)ο蠓治雠c設(shè)計(OOAD)的方法學(xué)的專家并不是新的話題。本文的目的是根據(jù)java的最優(yōu)方法和最初開始一步一步地達到通用的概念模型來開發(fā)java組件。本文面向的讀者需要具有Java,UML以及Java/J2EE設(shè)計模式的知識。這篇文章主要描述的范圍是:·組件的基本性質(zhì)。·如何利用Java設(shè)計最優(yōu)方法(設(shè)計模式)來實現(xiàn)這些Java組件設(shè)計的基本性質(zhì),并且形成一個概念上的基本組件開發(fā)框架, 這個框架將來可以方便地用于任何組件開發(fā)中的。組件的基本性質(zhì)·為了讓其他組件可以與之相互作用,組件必須有服務(wù)接口(API)。·組件必須有合適的生命周期機制(start, stop, initialize等等)·組件必須可以配置。·組件只有一個實例在企業(yè)程序中運行。·配置的改變應(yīng)該是動態(tài)的(在運行中)。·組件必須有合適的第三方軟件融入的機制。·組件必須有合適的處理錯誤機制如何實現(xiàn)基本的組件性質(zhì)組件必須有服務(wù)接口(API)無論我們是在一個類還是幾個類中寫100行到1000行的代碼,最終勞動成果(類或者類的結(jié)合)提供一些基本的高級的服務(wù)。返回去想想,我們甚至可以在實現(xiàn)他們之前定義那些我們想要達到的基本的高級的服務(wù)。讓我們舉個來自保險界的例子,保險商在他每天做了以下的工作:·檢查保險申請。·收集并評估背景信息。·根據(jù)公司現(xiàn)有的規(guī)則計算保險金·從其他部門收集信息以及各種各樣的報告(醫(yī)學(xué)等等)。·準(zhǔn)備相關(guān)的政策。現(xiàn)在我們?nèi)绻雽懸粋€保險商的商業(yè)組件,我們必須有如圖1的服務(wù)接口以及其實現(xiàn):Figure 1. Underwriter service interfac當(dāng)其他組件請求保險商組件的服務(wù)時,并不需要考慮組件內(nèi)部的操作。封裝其商業(yè)邏輯讓組件更易維護及擴展。服務(wù)組件將有一個主要的服務(wù)實現(xiàn)類(服務(wù)接口的實現(xiàn))以及這個類使用助手類,這個類是組件的一部分,同時也可能使用其他的組件在產(chǎn)品開發(fā)中,我們也須有許多組件提供不同的服務(wù)。例如,在保險業(yè),我們有“索取流程組件,“投保人服務(wù)組件以及其他更多組件。所以我們必須有個機制來在企業(yè)解決方案中注冊這些服務(wù)組件,使其可以根據(jù)企業(yè)的特殊需要采用或者中止這些服務(wù)。下面是XML結(jié)構(gòu)的例子,它可以自動處理服務(wù)注冊的流程。 S001 UnderwriterService com.org.service.UnderWriterServiceImpl S002 PolicyHolderService com.org.service.PolicyHolderServiceImpl 組件應(yīng)該具有合適的生命周期機制組件也需要一個在它的生命周期內(nèi)置的,可見的,獨立的機制,所以它可以根據(jù)需要被開始和中止。ComponentControllerFactory(組件控制工廠)是singleton,因為其只需要一個實例。這個工廠負(fù)責(zé)根據(jù)配置內(nèi)容為不同的提供商創(chuàng)建類的實例。ComponentControllerFactory扮演雙重角色:首先其通過其init(),reload()等等方法來管理組件的生命周期(這就是為什么它是一個“工廠),圖2顯示其方法Figure 2. Component controller factory 組件的生命周期方法是:·doStart(): 開始組件():幫助其從XML配置文件中取得配置對象,負(fù)責(zé)創(chuàng)建適當(dāng)?shù)念惖膶嵗?middot;doStop():停止組件·reload():如果當(dāng)組件已經(jīng)開始但XML配置文件發(fā)生更改,這個方法將重新讀取XML配置文件并重啟逐漸。·getInstance():返回ComponentControllerFactory類的實例一個組件應(yīng)該是可配置的通常,每個組件有自己的可配置的不經(jīng)常改變的參數(shù)。例如,假設(shè)我們需要寫一個緩存組件,它需要每小時從數(shù)據(jù)庫取得半靜態(tài)的數(shù)據(jù)來刷新本身狀態(tài)。更新的時間應(yīng)該在配置文件中設(shè)置,那樣我們可以不更改源代碼來更改參數(shù)的值。下面是關(guān)于logger組件的XML配置文件的例子,專用于管理企業(yè)程序各個層次的logging。 Apache com.org.integration.adapter.Log4jAdapter true WebLogic com.org.integration.adapter.WebLogicAdapter false 在企業(yè)應(yīng)用中組件只有一個實例在運行一個組件應(yīng)該有且只有一個實例在運行,而Singleton設(shè)計模式是合適的選擇來保證在JVM中只有一個實例。但是當(dāng)這種模式在單一JVM情形下可行,但是在多JVM情形下就有問題。但是由于配置信息在組件開始時載入而不需要改變并處理所有靜態(tài)信息,用Singleton設(shè)計模式依然可行我們假設(shè)組件可以在單JVM情況下可行,ComponentControllerFactory將會如圖3那樣:Figure 3. Component controller factory in a single JVMSingleton控制工廠提供的方法是·getXXXService():方法返回在XML文件中定義的服務(wù)提供的實現(xiàn)類·getXXXAdapter():方法返回在XML文件中定義適配實現(xiàn)類配置文件的更改應(yīng)該是動態(tài)的如果組件是不可變的,每串代碼應(yīng)該有與singleton實例同樣的拷貝,但是如果它是不是不變得,我們需要改變時,配置文件需要動態(tài)改變。有兩種可能的情況但動態(tài)配置文件更改:·單一JVM情況·多JVM情況單一JVM情況如果程序在單一JVM中運行,事情就簡單得多了。我們已經(jīng)知道,SingletonControllerFactory通常在JVM中有一個實例,所以任何時候配置文件發(fā)生任何改變,將需要根據(jù)一些通知機制輪流載入java串行的配置對象來重新載入工廠對象。這是基于Observer-Observable模式并做兩件事:·通過XMLizer(單獨的組件)來讀取和處理XML配置文件并載入Java配置對象。·監(jiān)視XML配置文件可能發(fā)生的更改。圖4顯示ConfigManager的方法:Figure 4. ConfigManager ConfigManager類當(dāng)被Observable通知時扮演Observer角色,其更新方法將會被調(diào)用。Update()方法將會調(diào)用SingletonControllerFactory的reload()方法,所以新創(chuàng)建的java對象將會從其配置信息中重新載入。ConfigurationChangeNotifier扮演Observable的角色并在XML配置文件發(fā)生更改時啟動通知ConfigManger線程,并將指出其內(nèi)容上的改變。圖5顯示其關(guān)系:Figure 5. ConfigurationChangeNotifier多JVM情況在多JVM情況下,事情就不會變得這樣簡單。我們必須有·需要機制在運行時來動態(tài)載入更改的XML配置文件而不關(guān)閉整個企業(yè)程序。·需要機制保證在群中只有一個實例在運行。結(jié)合RMI利用JNDI是一種選擇來保證在集群環(huán)境中的多個節(jié)點中的特定的一個節(jié)點自由一個實例在運行。RMI服務(wù)需要編寫,同時RMI stub要在RMI服務(wù)之外創(chuàng)建。創(chuàng)建的RMI stub需要被綁定在程序服務(wù)器的JNDI樹上。這個對象將保持在container中,container可以讓對象在集群中都可以用到。為了處理這種情況,我們需要引入ConfigManager,它將會做一下任務(wù):·創(chuàng)建需要可以動態(tài)改變的XML配置文件。·創(chuàng)建來自XML文件的java串行文件。串行和非串行化將會在不同的組件中完成。·創(chuàng)建RMI服務(wù),注冊從RMI服務(wù)中創(chuàng)建的RMI stub,并通過RMI服務(wù)載入串行配置對象。·將RMI stub與集群環(huán)境中的JNDI樹的任何節(jié)點綁定。·創(chuàng)建通知系統(tǒng),其將重新綁定RMI服務(wù)并當(dāng)XML文件似乎發(fā)生變化時重新載入對象。圖6顯示RMI服務(wù)的接口以及其實現(xiàn):Figure 6. RMI service在多JVM情況下,ConfigManager如圖7:Figure 7. ConfigManager in a multiple-JVM scenarioConfigManagerMultipleJVM 類扮演Observer的角色。當(dāng)他被Observable通知時,其update方法將會被調(diào)用。通過update()方法,rebindRMIService()方法將會被調(diào)用,這樣新創(chuàng)建的對象(通過最新的配置信息)將會被重新載入。SingletonControllFactory將會為RMI服務(wù)扮演wrapper角色,返回合適的已配置的對象。這種方法的會產(chǎn)生問題,因為只有一個實例,所以只可以允許一個點的錯誤。ConfigManager組件需要更強壯來處理錯誤。但是同樣有其他的方法,通過MDB和JMS在群眾的不同節(jié)點同步緩存的配置對象。在這種情況下,并不需要RMI服務(wù)。下面是實現(xiàn)這種方法的步驟:·SingletonControllerFactory通過配置對象初始化并開始組件。·ConfigManager的Observer-Observable模型通過其通知機制來跟蹤XML配置文件的任何變更。當(dāng)發(fā)現(xiàn)更改時,他將公布消息到JMS topic。·運行在集群環(huán)境中的每個群中的MDB觸發(fā)其onMessage()方法,并載入更改的配置Java對象。 組件應(yīng)該有合適的第三方軟件整合機制如果組件依賴第三方軟件整合來建立服務(wù),第三方API不應(yīng)該直接在實現(xiàn)類中使用。最佳的策略是開發(fā)適配器并隔離第三方軟件調(diào)用和適配器的實現(xiàn)。圖8顯示調(diào)用logger組件的適配器的例子,演示了如何讓其更方便的適應(yīng)第三方APIs。Figure 8. Application logger interface利用adapter模式的優(yōu)點是更容易的和第三方軟件APIs合并。此外,當(dāng)這些APIs改變時,適配實現(xiàn)需要改變,而用此適配接口的服務(wù)將不需要改變。通過XML配置文件從不同的適配器中選擇是便利的,就如上面這節(jié)介紹的那樣。組件應(yīng)該有合適的錯誤處理機制每個組件應(yīng)該有自己的異常處理類,它可以幫助捕捉適當(dāng)?shù)漠惓!<僭O(shè)我們對于特定的即將使用的商業(yè)程序有單獨的組件來處理異常。這個特定組件異常類(Underwriter exception)將會使需要的服務(wù)脫離異常處理組件。Figure 9. Component exception handling這個異常處理類是特定用于Underwriter服務(wù)并擴展基于企業(yè)程序的異常類。其工作就是掩蓋在服務(wù)類中產(chǎn)生的異常并重新釋放他。結(jié)論總的來說,以下是整合的基本步驟:·作為程序開始過程的一部分,ConfigManager鍵通過XMLizer(用于XML-to-java對象轉(zhuǎn)換的單獨對象)來為不同的組件讀取XML配置文件,并通過程序服務(wù)器節(jié)點的JNDI tree來綁定Java配置對象。·作為程序開始過程的一部,配置對象將會被讀取,因此相關(guān)的provider/adapter/service需要被說明。·如果配置文件發(fā)生更改,ConfigManager將讀取更改后的XML文件并重新綁定配置對象。·組件將會重新載入配置對象并根據(jù)其最新更改來重新初始化。回到我們開始的地方,當(dāng)你計劃開發(fā)強壯的系統(tǒng)時組件框架將會有效地適應(yīng)商業(yè)和技術(shù)上的改變。概念框架的最佳部分是通過引入不同的即插即用的服務(wù)提供商的概念,完全將組件管理/生命周期進程與商業(yè)邏輯和不同的第三方APIs隔離。即使發(fā)生改變,除了更改/替代服務(wù)提供商,你也不需要擔(dān)心代碼的其他部分。這樣可以使程序更易維護,更易適應(yīng),和更強壯。作者:Palash Ghosh是有6年架構(gòu),設(shè)計和開發(fā)Java/J2EE解決方案專家經(jīng)驗的軟件架構(gòu)師。資源:·Matrix-中文Java開發(fā)者社區(qū):http://www.matrix.org.cn·Matrix Uml和OO討論區(qū):http://www.matrix.org.cn/topic.shtml?forumId=20 Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd
標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 成年网站视频在线观看 | 另类一区二区三区 | 欧美成在线视频 | 特级淫片欧美高清视频蜜桃 | 中文字幕亚洲精品 | 久久99国产精一区二区三区! | 亚洲欧美精品一区天堂久久 | 日本一级高清不卡视频在线 | 欧美视频自拍偷拍 | 亚洲香蕉久久一区二区三区四区 | 欧美亚洲日本一区二区三区浪人 | 爱逼综合网| 亚州免费一级毛片 | 日本午夜人成免费视频 | 日韩国产精品99久久久久久 | 久久香蕉国产线看免费 | 日本三级11k影院在线 | 亚洲人成综合在线播放 | 国内精品久久久久久影院8f | 一级aaaaa毛片免费视频 | 92精品国产成人观看免费 | 亚州成人 | 男女扒开双腿猛进入免费网站 | 亚洲午夜国产精品 | 亚洲天堂视频在线 | 欧美成人性色区 | 国产丶欧美丶日韩丶不卡影视 | 国产91香蕉视频 | 欧美一区欧美二区 | 韩国美女高清爽快一级毛片 | 亚洲国产欧美一区二区欧美 | 香蕉网影院在线观看免费 | 欧美综合自拍亚洲综合百度 | 久久国产精彩视频 | 欧美人成片免费看视频不卡 | 国产一级做a爰片在线 | 影院成人区精品一区二区婷婷丽春院影视 | 亚洲国产精品一区二区三区久久 | 成人精品视频 | a毛片视频 | 亚洲一级二级三级 |