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

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

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

    談笑有鴻儒,往來無白丁

    在恰當的時間、地點以恰當的方式表達給恰當的人...  閱讀的時候請注意分類,佛曰我日里面是談笑文章,其他是各個分類的文章,積極的熱情投入到寫博的隊伍中來,支持blogjava做大做強!向dudu站長致敬>> > 我的微博敬請收聽
    作者:Bruce A Tate (Spring: A Developer’s Notebook的作者之一)

    翻譯:Kelvincheng


    版權聲明:可以任意轉載,轉載時請務必以超鏈接形式標明文章原始出處和作者信息及本聲明
    英文原文地址:
    http://www.onjava.com/pub/a/onjava/2005/05/11/spring.html
    中文地址:
    http://www.matrix.org.cn/resource/article/43/43666_Spring.html
    關鍵詞: Spring Hibernate POJO Dependency Injection



    約摸15年前的6月的一個酷熱的早上,我爬入一艘舊玻璃鋼制小艇。這小艇十分老,船身碎片刺入我的手指,它的槳幾乎是傳統whitewate槳的兩倍長。我似乎在游泳而不是在劃船,但是無所謂。15年后,我依然為此著迷。

    約兩年前,我試了試Spring Project,這個被Hibernate站點顯著提到的東西。感覺就像那舊艇,十分適合我。為企業應用核心部分的發展,Spring深深地融入了我的編程當中,所以我將其作為我的第4本java書 Spring:A Developer’s Notebook的主題。在這篇文章中我會告訴你原因。

    1.Spring提供更好的平衡
    在河中,我學會更多地利用我的腰部和背部的肌肉來劃船,因為我的手臂肌肉無法堅持整天劃船。我變得更有效率,更平衡地利用自己的肌肉。通過spring,我可以在每行代碼中做更多的事。通過spring你會發現更多其優勢,其中最重要的是在對象持久化上。這是一個來自hibernate訪問數據對象的函數。

    public List getReservations( ) {
    return getHibernateTemplate( ).find("from Reservation");
    }


    注意那些你沒看到的東西。這里沒有任何事務處理。Spring允許你建立配置代碼去處理它。你不一定要通過關閉session來管理資源。你不一定寫你自己的配置。你不一定在這個層次上管理異常,因為這些異常是未經檢查的。你可以自由地在最適當的位置去管理他們。沒用spring的hibernate方法的代碼會是這樣的:

    public List getBikesOldWay( ) throws Exception {
    List bikes = null;
    Session s = null;
    try {
    s = mySessionFactory.openSession( );
    bikes = s.find("from Bike");
    }catch (Exception ex) {
    //handle exception gracefully
    }finally {
    s.close( );
    }
    return bikes;
    }


    Spring給我更多優勢,讓我編程更快,更易維護程序。

    2.Spring支持POJO編程
    在EJB 2.x徹底失敗之后,我們都在尋找更多方式避免在每個bean中加入笨重的模型去表達企業服務。當然。我們需要事務,安全,持久化,有時還需要遠程調用。用EJB時,我不得不去學龐大的API以及通過新的工具和部署過程來工作。結果我變成容器(container)提供的服務的奴隸。而在用Spring 時,我可以選擇我自己的服務和持久化框架。我在POJOs上編程并通過配置文件添加企業服務。
    在Sping:A Developer’s notebook這本書中,我建立了一個RentaBike的程序。我用我的POJOhibRentaBike取代了session bean 或者entity bean,它充當了我的數據訪問對象。我還在別處添加了服務。Spring配置文件是一個XML文件,被稱為上下文。它含有在容器中的所有bean以及這些bean的屬性,還有這些bean需要的服務。讓我們來看看下面的例子。

    Target:

    <bean id="rentaBikeTarget" class="com.springbook.HibRentABike">
    <property name="storeName">
    <value>Bruce's Bikes</value>
    </property>
    <property name="sessionFactory">
    <ref local="sessionFactory"/>
    </property>
    <property name="transactionManager">
    <ref local="transactionManager"/>
    </property>
    </bean>



    Interceptor:

    <bean name="transactionInterceptor"
    class="org.springframework.transaction.interceptor.TransactionInterceptor">
    <property name="transactionManager">
    <ref local="transactionManager"/>
    </property>
    <property name="transactionAttributeSource">
    <value>
    com.springbook.RentABike.transferReservation=
    PROPAGATION_REQUIRED,-ReservationTransferException
    com.springbook.RentABike.save*=PROPAGATION_REQUIRED
    com.springbook.RentABike.*=PROPAGATION_REQUIRED,readOnly
    </value>
    </property>
    </bean>



    proxy:

    <bean id="rentaBike" class="org.springframework.aop.framework.ProxyFactoryBean">
    <property name="proxyInterfaces">
    <value>com.springbook.RentABike</value>
    </property>
    <property name="interceptorNames">
    <value>transactionInterceptor,rentaBikeTarget</value>
    </property>
    </bean>



    注意這3個不同的bean: The Proxy , The target, and The interceptors. The proxy將調用POJO,以及POJO需要的任何服務。Interceptors包含粘合各調用服務的代碼,他們也說明了如何去對待The target中的每個方法。所有需要訪問RantaBike的人調用The proxy,這個開始事務訪問The target(The POJO)的事務攔截器。Thet target做自己的事返回給事務攔截器(提交事務的對象),返回到proxy和proxy的調用者。

    image
    Figure 1. POJO programming in action

    你在POJO外建立了你的程序,配置了它,Spring會隱藏其他的東西。我是一個POJO編程者。

    3.依賴注入有助易測性
    Spring 通過叫依賴注入(Dependency Injection)的設計模式來提高你的易測性。當一個消費者(consumer)依賴一個從屬物(我們會叫它一個服務),你會為consumer建立一個屬性。Spring將會建立這個consumer和服務,以及設置這個consumer的屬性為服務的值。換種說法,Spring在上下文中管理 beans的生命周期,解決依賴性。這是個不通過spring的依賴注入的例子。首先是消費者(consumer),被作為程序的基本模樣。

    public class CommandLineView {

    private RentABike rentaBike;

    public CommandLineView( ) {rentaBike = new ArrayListRentABike("Bruce's Bikes"); }

    public void setRentABike(RentABike rentABike){

    this.rentABike = rentABike;

    }

    public void printAllBikes( ) {
    System.out.println(rentaBike.toString( ));
    Iterator iter = rentaBike.getBikes().iterator( );
    while(iter.hasNext( )) {
    Bike bike = (Bike)iter.next( );
    System.out.println(bike.toString( ));
    }
    }

    public static final void main(String[] args) {
    CommandLineView clv = new CommandLineView( );
    clv.printAllBikes( );
    }



    接著是service這個模型。這是個簡單的通過數組表的實現,其依賴于在這個模型(RentaBike)。

    interface RentABike {
    List getBikes( );
    Bike getBike(String serialNo);
    }

    public class ArrayListRentABike implements RentABike {
    private String storeName;
    final List bikes = new ArrayList();
    public ArrayListRentABike(String storeName) {
    this.storeName = storeName;
    bikes.add(new Bike("Shimano", "Roadmaster", 20, "11111", 15, "Fair"));
    bikes.add(new Bike("Cannondale", "F2000 XTR", 18, "22222",12,"Excellent"));
    bikes.add(new Bike("Trek","6000", 19, "33333", 12.4, "Fair"));
    }

    public String toString() { return "RentABike: " + storeName; }
    public List getBikes() { return bikes; }
    public Bike getBike(String serialNo) {
    Iterator iter = bikes.iterator();
    while(iter.hasNext()) {
    Bike bike = (Bike)iter.next();
    if(serialNo.equals(bike.getSerialNo())) return bike;
    }
    return null;
    }
    }



    這是裝配程序。粗體的代碼就是依賴注入。裝配程序演示了服務和消費者,通過設置rentaBike的屬性解決了依賴性。

    public class RentABikeAssembler {
    public static final void main(String[] args) {
    CommandLineView clv = new CommandLineView( );
    RentABike rentaBike = new ArrayListRentABike("Bruce's Bikes");
    clv.setRentaBike(rentaBike);
    clv.printAllBikes( );
    }
    }



    當然,Spring將最終符合裝配的法則。如果你將服務隱藏到接口程序中,那樣你將可以向容器注入接口程序(interface)的任何實現(implementation)。
    依賴注入(Dependency injection)讓你編寫一個生產依賴和一個測試依賴。例如這個例子建立一個stub 對象,它讓測試這個程序更輕松。(要更多地了解stubs和mocks,請看“Mocks Aren’t Stubs.”).
    你已經看到RentaBike的Hibernate實現,以及其數組表版本。我也許不想在完全Hibernates實現的代碼運行我的所有用戶界面測試。而我更愿意簡單地通過數組表實現接口。
    依賴注入讓我聯合成品版(通過HibRentaBike),開發版(通過ArrayListRentaBike列表)和測試版(通過mock對象)。當我用java編程的時候,我必須有依賴注入去取得這些mocks進入那些難以進入的位置。

    4.控制轉入簡化JDBC
    JDBC程序是丑陋的,冗長的和乏味的。一個好的抽象層可以改進它,Spring讓你通過查詢語句和匿名的inner class來定制默認JDBC方法來去除那大部分苦力工作。這是一個簡單的JDBC的例子。

    JdbcTemplate template = new JdbcTemplate(dataSource);
    final List names = new LinkedList();

    template.query("SELECT USER.NAME FROM USER",
    new RowCallbackHandler() {
    public void processRow(ResultSet rs) throws SQLException {
    names.add(rs.getString(1));
    }
    }
    );



    想想這個例子,查詢如一個默認JDBC方法的方法。Spring會為結果集中的每一行執行在匿名inner class里的processRow方法的。你在上下文中設置了數據源。而不需要擔心開或者關的狀態,或者連接,配置數據源,或者管理事務。你不需要說明一個外部的結果集,或者在更低的層次上管理異常,因為spring將你的SQLException折疊放入一個共同的未檢查的異常集。其他語言例如 Ruby和smalltalk經常通過代碼塊使用控制轉入,但是在java中不經常使用。Spring簡化了艱巨的任務。

    5.Spring的社區興旺
    雖然一些開源項目不需要變得相當活躍而使其變得有用。例如Juit做已定目標的工作。如果你喜歡編程模型的話,它有你需要的所有基本東西。而輕量級容器如Spring需要一個充滿活力的社區。Spring是你可以找到的最活躍的社區之一,你可以擁有許多好處。

    服務(Service):通過Spring你可以找到數百種不同的服務,從安全到系統管理,到工作流。在持久化上,你可以插入JDO,Hibernate,Top Link,JDBC或者OJB.
    支持和教育(Support and education)::許多獨立顧問提供Spring服務,你可以在全世界得到出色的培訓。

    增強(Enhancements):Spring一年放出數個主要的發行版。在框架內的出色的測試和清晰的(Factored 擴展)意味著每個發行版都是質量優良的。Spring以及取得正在進行中的Hbernate 3的支持,提供了一個全新的web流程框架。這所有都在最新的發行版中。
    商業上支持(Commercial support):像我這樣的作者寫Spring的書?,F在,你可以找到5本關于Spring的書,以及許多含有部分Spring內容的書。許多產品商也支持Spring。許多開源框架例如Geronimo和Hibernate具有對Spring的特殊支持。
    Spring社區讓人們用這個框架變得更加容易。我可以雇用Spring開發人員,培訓他們。我可以閱讀一些書籍來補充我的知識,取得一些幫助我做那些我需要做的所有事情。我沒有找到為另一個容器的社區來得如此親近。

    資料:
    如果你想讀得更多,則有許多你可以取得地方:
    Martinfowler.com 有一些關于stubs and mocks 及 dependency injection.的文章。
    這里有Spring的框架。
    我的第一本書,Better, Faster, Lighter Java, 總結了輕量(lightweight)開發方法。
    本文源于Spring: A Developer's Notebook 及其代碼。 這是一本程序員注解的書,因此請注意勘誤表,當然,可以使用范例代碼簡化工作。
    還有這本O'Reilly出版的書:Hibernate: A Developer's Notebook.

    作者簡介:
    Bruce A. Tate是劃艇和山地自行車愛好者,是兩個孩子的父親。在他的業余時間,他在得克薩斯州的奧斯丁當獨立顧問。他是4本書的作者,其中包括暢銷的 Bitter Java以及O’Reilly最近發行的Better,Faster,Lighter Java。
    posted on 2006-11-08 17:07 壞男孩 閱讀(410) 評論(0)  編輯  收藏 所屬分類: java命令學習
    主站蜘蛛池模板: 免费成人午夜视频| 野花香高清在线观看视频播放免费| 亚洲Av无码乱码在线播放| 91香蕉成人免费网站| 三年片免费高清版 | 久久亚洲国产欧洲精品一| 又黄又爽一线毛片免费观看| 日本精品人妻无码免费大全| 国产成人精品免费视频大全麻豆| 免费视频成人片在线观看| 免费不卡在线观看AV| 无码精品A∨在线观看免费| 亚洲精品国产免费| 97在线观看永久免费视频| 女人18毛片a级毛片免费视频| 久久精品网站免费观看| 免费真实播放国产乱子伦| 亚洲区小说区图片区QVOD| 亚洲午夜电影在线观看| 亚洲色大网站WWW永久网站| 狠狠综合亚洲综合亚洲色| 国产一区二区三区免费观在线| 无码国产精品一区二区免费模式| 一二三四影视在线看片免费 | 亚洲人成网站色7799| 一级毛片在线播放免费| 免费福利在线播放| 久久精品亚洲男人的天堂| 四虎亚洲精品高清在线观看| 成人免费一区二区三区| 成年女人色毛片免费看| 久久亚洲欧洲国产综合| 99亚洲乱人伦aⅴ精品| 亚洲人成在线免费观看| 亚洲精品午夜无码专区| 国产综合激情在线亚洲第一页| 97av免费视频| 亚洲动漫精品无码av天堂| 又长又大又粗又硬3p免费视频| 久久久久久精品免费免费自慰| 五月天网站亚洲小说|