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

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

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

    隨筆 - 63  文章 - 0  trackbacks - 0
    <2009年4月>
    2930311234
    567891011
    12131415161718
    19202122232425
    262728293012
    3456789

    常用鏈接

    留言簿(2)

    隨筆分類

    隨筆檔案

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    Spring的模塊化是很強的,各個功能模塊都是獨立的,我們可以選擇的使用。這一章先從Spring的IoC開始。所謂IoC就是一個用XML來定義生成對象的模式,我們看看如果來使用的。

       數據模型

       1、如下圖所示有三個類,Human(人類)是接口,Chinese(中國人)是一個子類,American(美國人)是另外一個子類。

    源代碼如下:

    java 代碼
    1. package cn.com.chengang.spring;   
    2. public interface Human {   
    3. void eat();   
    4. void walk();   
    5. }   
    6.   
    7. package cn.com.chengang.spring;   
    8. public class Chinese implements Human {   
    9. /* (非 Javadoc)  
    10. * @see cn.com.chengang.spring.Human#eat()  
    11. */  
    12. public void eat() {   
    13. System.out.println("中國人對吃很有一套");   
    14. }   
    15.   
    16. /* (非 Javadoc)  
    17. * @see cn.com.chengang.spring.Human#walk()  
    18. */  
    19. public void walk() {   
    20. System.out.println("中國人行如飛");   
    21. }   
    22. }   
    23.   
    24. package cn.com.chengang.spring;   
    25. public class American implements Human {   
    26. /* (非 Javadoc)  
    27. * @see cn.com.chengang.spring.Human#eat()  
    28. */  
    29. public void eat() {   
    30. System.out.println("美國人主要以面包為主");   
    31. }   
    32.   
    33. /* (非 Javadoc)  
    34. * @see cn.com.chengang.spring.Human#walk()  
    35. */  
    36. public void walk() {   
    37. System.out.println("美國人以車代步,有四肢退化的趨勢");   
    38. }   
    39. }  

     

    2、對以上對象采用工廠模式的用法如下

       創建一個工廠類Factory,如下。這個工廠類里定義了兩個字符串常量,所標識不同的人種。getHuman方法根據傳入參數的字串,來判斷要生成什么樣的人種。

    java 代碼
    1. package cn.com.chengang.spring;   
    2. public class Factory {   
    3. public final static String CHINESE = "Chinese";   
    4. public final static String AMERICAN = "American";   
    5.   
    6. public Human getHuman(String ethnic) {   
    7. if (ethnic.equals(CHINESE))   
    8. return new Chinese();   
    9. else if (ethnic.equals(AMERICAN))   
    10. return new American();   
    11. else  
    12. throw new IllegalArgumentException("參數(人種)錯誤");   
    13. }   
    14. }  

     

    下面是一個測試的程序,使用工廠方法來得到了不同的“人種對象”,并執行相應的方法。

    java 代碼
    1. package cn.com.chengang.spring;   
    2. public class ClientTest {   
    3. public static void main(String[] args) {   
    4. Human human = null;   
    5. human = new Factory().getHuman(Factory.CHINESE);   
    6. human.eat();   
    7. human.walk();   
    8. human = new Factory().getHuman(Factory.AMERICAN);   
    9. human.eat();   
    10. human.walk();   
    11. }   
    12. }  

     

     3、采用Spring的IoC的用法如下:

       在項目根目錄下創建一個bean.xml文件

    xml 代碼
    1. <?xml version="1.0" encoding="UTF-8"?>   
    2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">   
    3. <beans>   
    4. <bean id="Chinese" class="cn.com.chengang.spring.Chinese"/>   
    5. <bean id="American" class="cn.com.chengang.spring.American"/>   
    6. </beans>  

    修改ClientTest程序如下:

    java 代碼
    1. package cn.com.chengang.spring;   
    2. import org.springframework.context.ApplicationContext;   
    3. import org.springframework.context.support.FileSystemXmlApplicationContext;   
    4. public class ClientTest {   
    5. public final static String CHINESE = "Chinese";   
    6. public final static String AMERICAN = "American";   
    7.   
    8. public static void main(String[] args) {   
    9. // Human human = null;   
    10. // human = new Factory().getHuman(Factory.CHINESE);   
    11. // human.eat();   
    12. // human.walk();   
    13. // human = new Factory().getHuman(Factory.AMERICAN);   
    14. // human.eat();   
    15. // human.walk();   
    16.   
    17. ApplicationContext ctx = new FileSystemXmlApplicationContext("bean.xml");   
    18. Human human = null;   
    19. human = (Human) ctx.getBean(CHINESE);   
    20. human.eat();   
    21. human.walk();   
    22. human = (Human) ctx.getBean(AMERICAN);   
    23. human.eat();   
    24. human.walk();   
    25. }   
    26. }  

     從這個程序可以看到,ctx就相當于原來的Factory工廠,原來的Factory就可以刪除掉了。然后又把Factory里的兩個常量移到了ClientTest類里,整個程序結構基本一樣。

       再回頭看原來的bean.xml文件的這一句:

    <bean id="Chinese" class="cn.com.chengang.spring.Chinese"/>

       id就是ctx.getBean的參數值,一個字符串。class就是一個類(包名+類名)。然后在ClientTest類里獲得Chinese對象就是這么一句

    human = (Human) ctx.getBean(CHINESE);

       因為getBean方法返回的是Object類型,所以前面要加一個類型轉換。

       總結

       (1)也許有人說,IoC和工廠模式不是一樣的作用嗎,用IoC好象還麻煩一點。

       舉個例子,如果用戶需求發生變化,要把Chinese類修改一下。那么前一種工廠模式,就要更改Factory類的方法,并且重新編譯布署。而IoC只需要將class屬性改變一下,并且由于IoC利用了Java反射機制,這些對象是動態生成的,這時我們就可以熱插撥Chinese對象(不必把原程序停止下來重新編譯布署)

       (2)也許有人說,即然IoC這么好,那么我把系統所有對象都用IoC方式來生成。

       注意,IoC的靈活性是有代價的:設置步驟麻煩、生成對象的方式不直觀、反射比正常生成對象在效率上慢一點。因此使用IoC要看有沒有必要,我認為比較通用的判斷方式是:用到工廠模式的地方都可以考慮用IoC模式。

       (3)在上面的IoC的方式里,還有一些可以變化的地方。比如,bean.xml不一定要放在項目錄下,也可以放在其他地方,比如cn.com.chengang.spring包里。不過在使用時也要變化一下,如下所示:

    new FileSystemXmlApplicationContext("src/cn/com/chengang/spring/bean.xml");

       另外,bean.xml也可以改成其他名字。這樣我們在系統中就可以分門別類的設置不同的bean.xml。

       (4)關于IoC的低侵入性。

       什么是低侵入性?如果你用過Struts或EJB就會發現,要繼承一些接口或類,才能利用它們的框架開發。這樣,系統就被綁定在Struts、EJB上了,對系統的可移植性產生不利的影響。如果代碼中很少涉及某一個框架的代碼,那么這個框架就可以稱做是一個低侵入性的框架。

       Spring的侵入性很低,Humen.java、Chinese.java等幾個類都不必繼承什么接口或類。但在ClientTest里還是有一些Spring的影子:FileSystemXmlApplicationContext類和ctx.getBean方式等。
    現在,低侵入性似乎也成了判定一個框架的實現技術好壞的標準之一。

       (5)關于bean.xml的用法

       bean.xml的用法還有很多,其中內容是相當豐富的。假設Chinese類里有一個humenName屬性(姓名),那么原的bean.xml修改如下。此后生成Chinese對象時,“陳剛”這個值將自動設置到Chinese類的humenName屬性中。而且由于singleton為true這時生成Chinese對象將采用單例模式,系統僅存在一個Chinese對象實例。

    <?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="Chinese" class="cn.com.chengang.spring.Chinese" singleton="true">
    <property name="humenName">
    <value>陳剛</value>
    </property>
    </bean>
    <bean id="American" class="cn.com.chengang.spring.American"/>
    </beans>

       關于bean.xml的其它用法,不再詳細介紹了,大家自己拿Spring的文檔一看就明白了。

     Spring能有效地組織J2EE應用各層的對象。不管是控制層的Action對象,還是業務層的Service對象,還是持久層的DAO對象,都可在Spring的管理下有機地協調、運行。Spring將各層的對象以松耦合的方式組織在一起,Action對象無須關心Service對象的具體實現,Service對象無須關心持久層對象的具體實現,各層對象的調用完全面向接口。當系統需要重構時,代碼的改寫量將大大減少。

      上面所說的一切都得宜于Spring的核心機制,依賴注入。依賴注入讓bean與bean之間以配置文件組織在一起,而不是以硬編碼的方式耦合在一起。理解依賴注入

      依賴注入(Dependency Injection)和控制反轉(Inversion of Control)是同一個概念。具體含義是:當某個角色(可能是一個Java實例,調用者)需要另一個角色(另一個Java實例,被調用者)的協助時,在傳統的程序設計過程中,通常由調用者來創建被調用者的實例。但在Spring里,創建被調用者的工作不再由調用者來完成,因此稱為控制反轉;創建被調用者實例的工作通常由Spring容器來完成,然后注入調用者,因此也稱為依賴注入。

      不管是依賴注入,還是控制反轉,都說明Spring采用動態、靈活的方式來管理各種對象。對象與對象之間的具體實現互相透明。在理解依賴注入之前,看如下這個問題在各種社會形態里如何解決:一個人(Java實例,調用者)需要一把斧子(Java實例,被調用者)。

      (1)原始社會里,幾乎沒有社會分工。需要斧子的人(調用者)只能自己去磨一把斧子(被調用者)。對應的情形為:Java程序里的調用者自己創建被調用者。

      (2)進入工業社會,工廠出現。斧子不再由普通人完成,而在工廠里被生產出來,此時需要斧子的人(調用者)找到工廠,購買斧子,無須關心斧子的制造過程。對應Java程序的簡單工廠的設計模式。

      (3)進入“按需分配”社會,需要斧子的人不需要找到工廠,坐在家里發出一個簡單指令:需要斧子。斧子就自然出現在他面前。對應Spring的依賴注入。

      第一種情況下,Java實例的調用者創建被調用的Java實例,必然要求被調用的Java類出現在調用者的代碼里。無法實現二者之間的松耦合。

      第二種情況下,調用者無須關心被調用者具體實現過程,只需要找到符合某種標準(接口)的實例,即可使用。此時調用的代碼面向接口編程,可以讓調用者和被調用者解耦,這也是工廠模式大量使用的原因。但調用者需要自己定位工廠,調用者與特定工廠耦合在一起。

      第三種情況下,調用者無須自己定位工廠,程序運行到需要被調用者時,系統自動提供被調用者實例。事實上,調用者和被調用者都處于Spring的管理下,二者之間的依賴關系由Spring提供。

      所謂依賴注入,是指程序運行過程中,如果需要調用另一個對象協助時,無須在代碼中創建被調用者,而是依賴于外部的注入。Spring的依賴注入對調用者和被調用者幾乎沒有任何要求,完全支持對POJO之間依賴關系的管理。依賴注入通常有兩種:

      ·設值注入。

      ·構造注入。
    .......

    posted on 2009-04-06 00:13 lanxin1020 閱讀(712) 評論(0)  編輯  收藏 所屬分類: spring
    主站蜘蛛池模板: 亚洲国产精品成人AV在线| 天堂亚洲免费视频| 免费A级毛片无码久久版| aa级毛片毛片免费观看久| 亚洲精品在线免费看| 全部免费毛片免费播放| 无码午夜成人1000部免费视频| 日韩亚洲国产高清免费视频| 亚洲午夜久久久久久久久久| 青春禁区视频在线观看直播免费| 四虎影视永久在线精品免费| 亚洲精品电影天堂网| 免费一级特黄特色大片在线观看| 特级无码毛片免费视频尤物| 青草青草视频2免费观看| 亚洲高清日韩精品第一区| 亚洲av麻豆aⅴ无码电影| 1000部国产成人免费视频| 无遮挡a级毛片免费看| 亚洲成aⅴ人在线观看| 在线观看亚洲精品国产| 久久精品a一国产成人免费网站| a级毛片黄免费a级毛片| 精品国产日韩亚洲一区91| 91久久亚洲国产成人精品性色 | 久久夜色精品国产亚洲AV动态图 | 亚洲一区二区三区日本久久九| 日本一道在线日本一道高清不卡免费 | 亚洲欧洲国产精品你懂的| 亚洲精品高清一二区久久| 成年黄网站色大免费全看| 免费无码作爱视频| 免费人成网上在线观看| 亚洲午夜理论片在线观看| 精品日韩亚洲AV无码| 亚洲色欲一区二区三区在线观看| 四虎永久免费地址在线观看| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 最近2022中文字幕免费视频| 香蕉免费在线视频| 美女免费视频一区二区|