免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

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

開通VIP
輕量級開發(fā)的成功秘訣,第 2 部分: 如何減輕容器
減輕多余負(fù)擔(dān),同時保持企業(yè)架構(gòu)依然健壯業(yè)務(wù)需要重量級架構(gòu)(比如 Enterprise Java™Beans (EJB)技術(shù))提供的企業(yè)服務(wù),但這種架構(gòu)對于解決日常問題可能過于復(fù)雜。本文介紹輕量級容器,并解釋它們?nèi)绾翁峁M足您業(yè)務(wù)需要的服務(wù),而無需將您束縛在一個指定的編程模型之上。
我是一名狂熱的山地車手。許多山地車手非常偏愛核心設(shè)備 —— 巨獸(behemoth),這是一種全懸掛系統(tǒng)(擁有前后兩個巨大的減震器)—— 簡直到了無以復(fù)加的地步。我在德克薩斯州奧斯汀附近的丘陵地區(qū)騎車,那里的環(huán)境要求我必須有一輛懸掛式山地車,但巨獸有些地方并不適合。我不可能帶著多余的負(fù)重攀巖。我必須有一輛輕便的山地車。
Java 行業(yè)經(jīng)歷了類似的情況。EJB 技術(shù)提供了核心的企業(yè)服務(wù)。如果您曾對一個復(fù)雜的、基于組件的模型編程,您會將業(yè)務(wù)組件放入一個容器中,該容器提供諸如事務(wù)、遠(yuǎn)程控制、安全和持久性之類的服務(wù)。
然而,這里存在一些開銷。重量級架構(gòu)對于解決許多問題都過于復(fù)雜。例如,實體 bean 會讓您為每個實體編寫 7 個文件。因此 EJB 技術(shù)就不值得用來解決日常問題。如今,許多業(yè)務(wù)仍然需要企業(yè)服務(wù),但它們正在尋找達(dá)到該目標(biāo)的新方向。它們使用輕量級容器。實際上,最新的 EJB V3.0 標(biāo)準(zhǔn)就使用了輕量級容器模型。
大多數(shù)容器 API(如 EJB API)強迫您編寫一些接口或一個組件模型。將您的組件放入該容器后,容器會為您處理一些事情。EJB 容器提供企業(yè)服務(wù)。Servlet 容器(例如 Apache Jakarta Tomcat)實現(xiàn)了 Servlet API,使您可以將動態(tài)內(nèi)容建立到服務(wù)器頁面中,該頁面隨后會被發(fā)送到 Web 瀏覽器。
傳統(tǒng)容器強迫使用指定的編程模型,輕量級容器則不是。它們使用普通 Java 對象(plain old Java object,POJO)。容器然后將 POJO 綁在一起,并將服務(wù)與它們相關(guān)聯(lián)。輕量級容器的共同特征包括:
基于 POJO 的編程 —— 輕量級容器不具侵犯性。它不強迫執(zhí)行任何 API。 生命周期管理 —— 輕量級容器管理放入其中的對象的生命周期。最低限度下,它們實例化并銷毀對象。 依賴性解析 —— 輕量級容器提供了一個普通的依賴性解析策略。多數(shù)容器現(xiàn)在支持稱為依賴注入的策略。還有一些支持 Java 2 平臺企業(yè)版(J2EE)風(fēng)格的策略,稱之為服務(wù)定位。 一致的配置 —— 輕量級容器是一個便于提供一致配置服務(wù)的位置。 服務(wù)關(guān)聯(lián) —— 輕量級容器提供一種將服務(wù)與容器中的對象相關(guān)聯(lián)的方法。
輕量級容器有許多勝于其他容器架構(gòu)的優(yōu)點。例如,您可以使用一個更加簡單、基于 POJO 的編程模型。使用 POJO 編程,應(yīng)用程序會更加易于測試。您的對象也可以在容器外運行 —— 例如,在一個測試用例中。通過依賴注入,輕量級容器減少了組件間的依賴性。它們也保護(hù)了您在代碼上花費的心血,因為您可以在容器間移動應(yīng)用程序的大部分。
革新浪潮引發(fā)了輕量級容器運動。依賴性管理在這場運動中吹響了第一聲號角。早期輕量級容器,比如 Apache 的 Avalon,使用服務(wù)定位策略來管理依賴性?,F(xiàn)代大多數(shù)容器使用依賴注入管理依賴性。
然而,解析依賴性還只是問題的一部分。您還需要可以將服務(wù)與容器中的 POJO 相關(guān)聯(lián)。EJB 容器使用代碼生成處理該問題?,F(xiàn)代容器使用面向方面編程(AOP)和攔截。
在 Java 技術(shù)中,依賴注入正迅速地改變我們構(gòu)建應(yīng)用程序的方式。這種概念相對簡單:一個消費者(類似下面的 Consumer 類)需要一個服務(wù)。您為指向該服務(wù)(類似下面的 Speaker 類)的消費者添加一個屬性。清單 1 展示了此概念的示例。
class Speaker { void speak(String words) { System.out.println(words); } } class Consumer { Speaker mySpeaker; void saySomething() { mySpeaker.speak("something"); } }
請注意 Consumer 類。它沒有實例化 Speaker 類。有了依賴注入,該工作就由稱之為 Container 類(參閱清單 2)的第三方來處理。
class Container { public static void main(String[] args) { Speaker speaker=new Speaker(); Consumer consumer=new Consumer(); consumer.speaker = speaker; consumer.saySomething(); } }
Container 類實例化了 Speaker 和 Consumer 類。然后 Container 類將 speaker 屬性設(shè)置為新的 Speaker 類。最后一步表示依賴注入。
讓我們稍微對該段代碼進(jìn)行重構(gòu)。構(gòu)建一個稱為 Speaker 的接口和兩個不同的實現(xiàn):一個 Canadian speaker 和一個 Californian speaker。因此,您現(xiàn)在擁有了 Speaker 接口:
interface Speaker { void speak(String words); }
CanadianSpeaker 和 CalifornianSpeaker:
class CanadianSpeaker implements Speaker { public void speak(String words) { System.out.println(words + ", ay?"); } } class CalifornianSpeaker implements Speaker { public void speak(String words) { System.out.println("Like, " + words); } }
還有容器中的單行更改:
... Speaker speaker=new CalifornianSpeaker();
注意,您現(xiàn)在可以在 speaker 的兩個實現(xiàn)之間變化,而惟一需要改變的代碼就是容器。更關(guān)鍵的是,您可以輕松地注入模擬對象來替代真正的 Speaker 實現(xiàn),并且無需影響其他的代碼基就可以進(jìn)行測試。
當(dāng)然,最終目標(biāo)是用專門定制的容器來替代這個手寫容器。例如,使用 Spring 容器。在本例中,替換的是您的 Container 類,并且您可以使用類似清單 3 中代碼的簡單 XML 文件。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean id="mySpeaker" class="CanadianSpeaker"> </bean> <bean id="consumer" class="Consumer"> <property name="speaker"><ref local= "mySpeaker"/></property> </bean> </beans> </code>
現(xiàn)在,您可以下載上下文,獲取 Consumer bean,然后像下面這樣運行它:
ApplicationContext ac = new FileSystemXmlApplicationContext("context.xml"); Consumer c=(HelloWorld)ac.getBean("consumer"); c.saySomething();
Spring 容器與您的容器完成相同的事情。它實例化 beans,并通過設(shè)置屬性而將它們綁在一起。注意,兩部分代碼是完全去耦的;接口和容器確保了這一點。您可以使用依賴注入來滿足進(jìn)行企業(yè)級開發(fā)(例如,數(shù)據(jù)源或事務(wù)管理器)所遇到的許多依賴性。
您也會看到,應(yīng)用程序的固有層次之間自然地相互依賴。您可能擁有一個由控制器調(diào)用的 Web 用戶界面(UI)視圖,它調(diào)用外觀層,外觀層調(diào)用數(shù)據(jù)訪問對象,數(shù)據(jù)訪問對象調(diào)用對象關(guān)系映射,對象關(guān)系映射調(diào)用數(shù)據(jù)庫。這些關(guān)系就是依賴性。如果能將它們解耦,會更加易于編碼、測試和維護(hù)。
依賴注入讓您將應(yīng)用程序的主要層次編織到一起,從而,這使您產(chǎn)生一個具有視圖、模型和控制器層的松散耦合應(yīng)用程序。但是,輕量級容器解決了另一個問題。您經(jīng)常具有一些會影響到應(yīng)用程序許多部分的關(guān)注點,比如日志記錄、遠(yuǎn)程控制或安全性。EJB 通過使用代碼生成和容器/組件接口解決了該問題。我們有能力做到更好。
您可以在合適的位置編寫自己的橫切關(guān)注點(crosscutting concern),然后使用稱為攔截(interceptor)的技術(shù)將關(guān)注點綁定到需要它的方法上。比如說,一個調(diào)用者想要調(diào)用稱為 speak() 的方法。使用攔截策略(參閱圖 1),您使用 speak() 方法在目標(biāo)對象前創(chuàng)建了一個代理。該代理應(yīng)有一個 speak() 方法,該方法與原始目標(biāo)對象擁有相同的接口。當(dāng)調(diào)用者調(diào)用代理時,您可以在調(diào)用真實方法前,輕松添加您需要的任何定制特性。
通過使用攔截,您可以更加高效地添加類似安全、聲明性事務(wù)和遠(yuǎn)程控制這些自定義服務(wù)到 POJO 方法。需要附加說明的是:調(diào)用代碼和被調(diào)用方法都不需要變更。而且,類似 Spring 的容器都預(yù)裝了攔截來執(zhí)行這些任務(wù)和其他任務(wù)。
AOP 更進(jìn)了一步。使用 AOP,您能夠立即快速指定所有需要給定服務(wù)的方法,通常是使用正則表達(dá)式來做到這一點。AOP 程序員稱這一套方法為切點(point cut)。例如,您可能想將將聲明性事務(wù)與外觀中的所有方法相關(guān)聯(lián)。對于以 insert 或 update 單詞開始的方法,您可能想要完整的事務(wù)傳播,而對其他方法,您想要輕量級的只讀傳播。(EJB 規(guī)范定義了事務(wù)傳播的類型。您只需知道,完整的事務(wù)傳播的開銷要大于只讀傳播,但是它也更加安全,并且對于某些類型的更新是必需的。)
在正確的位置得到正確的事務(wù)行為,無需修改調(diào)用者或目標(biāo)方法中的任何代碼。清單 4 展示了部分 Spring 上下文,它為這樣的應(yīng)用程序指定了切點。
<property name="transactionAttributes"> <props> <prop key="insert*">PROPAGATION_REQUIRED</prop> <prop key="update*">PROPAGATION_REQUIRED</prop> <prop key="*">PROPAGATION_REQUIRED,readOnly</prop> </props> </property>
您可以想像得到,許多人都在努力構(gòu)建輕量級容器。輕量級容器空間圍繞一些參與者,比如 Spring、Pico、HiveMind 和 EJB 技術(shù),正迅速發(fā)展壯大。
處于領(lǐng)先地位的是 Spring Framework。Spring 使用 XML 配置并且依賴于 setter 進(jìn)行依賴注入。它也使用構(gòu)造函數(shù)和工廠方法,但您會看到的大多數(shù)示例和 Spring 代碼基本身還是使用 setter。
Spring 通過使用膠水代碼添加大量的 bean,從而超越了輕量級容器。使用 bean 和 代碼,您可以插入數(shù)百種讓您使用 J2EE API 的不同組件,從 JDO 到 Hibernate 的持久性引擎,工作流引擎,視圖技術(shù),等等。Spring 正在快速成熟,并將在可預(yù)見的未來成為一個參與者。
Pico 容器是最小的可用容器。它與 Spring 的主要區(qū)別之處是在風(fēng)格上面。Pico 程序員首先依靠構(gòu)造函數(shù)進(jìn)行注入。Pico 不使用 XML,而是使用 Java 代碼來注冊容器中的 bean。類似 Spring,Pico 也支持 setter 注入,但主要使用構(gòu)造函數(shù)。Pico 也遠(yuǎn)不及 Spring 所支持的服務(wù)數(shù)量。它主要是一個依賴注入容器。不過,當(dāng)您不需要 Spring 提供的所有企業(yè)服務(wù)時,Pico 絕對是您的首選。
HiveMind 是最新的開放源碼輕量級容器。它比 Pico 擁有更多的支持模塊,但還是少于 Spring。盡管如此,HiveMind 使您可以使用 Spring 的一些 bean 和 服務(wù)。它能通過 setter 和構(gòu)造函數(shù)管理依賴性。HiveMind 的主要貢獻(xiàn)是以下兩個重要思想:
稱為模塊的封裝概念,松散地基于 Eclipse 插件模型,使您在粗粒度級別管理依賴性。 稱為 HiveDoc 的文檔工具讓您為容器中的模塊生成參考文檔,這非常類似于使用 Javadoc 為您的 Java 代碼生成文檔。
現(xiàn)在說 HiveMind 是否會產(chǎn)生大的影響還為時過早。
考慮您現(xiàn)在使用 EJB 所做的事情,例如聲明性事務(wù)、遠(yuǎn)程控制和安全性。如果您可以使用輕量級容器代替在 EJB 環(huán)境中所做的大多數(shù)事情,那為什么不使用輕量級容器呢?該問題迫使 EJB V3.0 專家組重新設(shè)計核心 EJB 架構(gòu)。EJB V3.0 將更有效地實現(xiàn)輕量級容器策略。當(dāng)前 EJB 架構(gòu)和最新的 EJB V3.0 間的主要區(qū)別是:容器將提供您使用的主要服務(wù),并且您可以使用 XML 來配置容器,但 EJB 技術(shù)也將嚴(yán)重地依賴配置的注釋。
一些優(yōu)秀的顧問已經(jīng)對 EJB 技術(shù)中注釋的過度使用引起了關(guān)注。我也保留我的意見,但 EJB 技術(shù)確實有了大麻煩。EJB 小組必須盡快發(fā)布補丁,否則輕量級容器可能會放棄使用 EJB 技術(shù)。客戶已經(jīng)可以使用 Spring 滿足絕大多數(shù)的需要。在 EJB 技術(shù)大量使用之時,時機可能過晚了。
現(xiàn)在,您已經(jīng)大概了解了輕量級容器。您了解了以下的基本設(shè)計理論:
構(gòu)建一個接受 POJO 的容器,而不是受限制的組件 使用依賴注入來松散、解析依賴性 使用攔截和 AOP,將服務(wù)與 POJO 相關(guān)聯(lián)
在接下來的文章中,我將詳盡地為您介紹主要的輕量級容器并說明何時使用它們。然后,我將比較完整地介紹 Spring(最流行的容器)。在本文開始的部分,我告訴您我需要在不犧牲自行車避震系統(tǒng)的前提下,減輕自行車的重量?,F(xiàn)在您知道了,如何在不犧牲企業(yè)服務(wù)的前提下減輕您的容器。
學(xué)習(xí)愉快!
您可以參閱本文在 developerWorks 全球站點上的英文原文。
Bruce A. Tate 和 Justin Gehtland 編寫的Spring: A Developer‘s Notebook 一書(O‘Reilly, 2005 年),可以幫您快速入門 Spring。
了解一些輕量級容器,包括Spring FrameworkPicoHiveMind。
閱讀Martin Fowler 關(guān)于依賴注入的文章,該文清楚地描述了依賴注入和服務(wù)定位。
閱讀 Bruce A. Tate 和 Justin Gehtland 編寫的Better, Faster, Lighter Java 一書(O‘Reilly, 2004 年),此書很好地概述了輕量級開發(fā)。
Rob Harrop 和 Jan Machacek 編寫的Pro Spring(Apress,2005 年)和 Craig Walls 和 Ryan Breidenbach 編寫的Spring in Action,提供了 Spring 的綜合知識。
Richard Hightower 撰寫的“無需容器的對象關(guān)系映射”(developerWorks,2004 年 4 月),為您展示了如何利用 Hibernate 使用 Spring 持久性。
閱讀 Mik Kersten 撰寫的“http://www-128.ibm.com/developerworks/cn/java/j-aopwork1/”(developerWorks, 2005 年 2 月),了解 AOP,這是一種提供更佳透明性的輕量級技術(shù)。
訪問developerWorks 的開放源碼專區(qū),獲取大量 how-to 信息、工具和項目更新,以幫助您使用開放源碼技術(shù)進(jìn)行開發(fā),并將它們與 IBM 產(chǎn)品一起使用。
使用IBM 試用軟件 改進(jìn)您的下一個開放源碼開發(fā)項目,這些軟件可以通過下載或購買 DVD 獲得。
在 Developer Bookstore 的開放源碼專區(qū),可以找到數(shù)百本開放源碼主題的打折書籍,包括許多EJB 書籍
通過參與developerWorks blog 加入 developerWorks 社區(qū)。
 
關(guān)于作者
Bruce Tate 居住在德克薩斯州的首府奧斯汀,他是一位父親,同時也是山地車手和皮艇手。他是 3 本最暢銷 Java 書籍的作者,其中包括榮獲 Jolt 大獎的 Better, Faster, Lighter Java 一書,最近又出版了 Spring: A Developer‘s Notebook 一書。他在 IBM 工作了 13 年,現(xiàn)在是 J2Life、LLC 的創(chuàng)始人兼顧問。他潛心研究基于 Java 和 Ruby 的輕量級開發(fā)策略和架構(gòu)。
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
輕量級容器的比較
JAVA輕量級組件和重量級組件的本質(zhì)區(qū)別
請問什么是struts,Spring,Hibernate?
Spring容器對Bean的管理
【翻譯】不使用Spring的5個理由
Java企業(yè)應(yīng)用系統(tǒng)框架的比較與選擇
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服