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

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

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

    隨筆-42  評論-349  文章-4  trackbacks-0

        殘夢追月原創,轉載請注明。

    在應用中,我們常常使用<ref>標簽為JavaBean注入它依賴的對象。但是對于一個大型的系統,這個操作將會耗費我們大量的資源,我們不得不花費大量的時間和精力用于創建和維護系統中的<ref>標簽。實際上,這種方式也會在另一種形式上增加了應用程序的復雜性,那么如何解決這個問題呢?Spring為我們提供了一個自動裝配的機制,盡管這種機制不是很完善,但是在應用中結合<ref>標簽還是可以大大的減少我們的勞動強度。前面提到過,在定義Bean時,<bean>標簽有一個autowire屬性,我們可以通過指定它來讓容器為受管JavaBean自動注入依賴對象。

    <bean>autowire屬性有如下六個取值,他們的說明如下:

    1、 No:即不啟用自動裝配。Autowire默認的值。

    2、 byName:通過屬性的名字的方式查找JavaBean依賴的對象并為其注入。比如說類Computer有個屬性printer,指定其autowire屬性為byName后,Spring IoC容器會在配置文件中查找id/name屬性為printerbean,然后使用Seter方法為其注入。

    3、 byType:通過屬性的類型查找JavaBean依賴的對象并為其注入。比如類Computer有個屬性printer,類型為Printer,那么,指定其autowire屬性為byType后,Spring IoC容器會查找Class屬性為Printerbean,使用Seter方法為其注入。

    4、 constructor:通byType一樣,也是通過類型查找依賴對象。與byType的區別在于它不是使用Seter方法注入,而是使用構造子注入。

    5、 autodetect:在byTypeconstructor之間自動的選擇注入方式。

    6、 default:由上級標簽<beans>default-autowire屬性確定。

    注意:在配置bean時,<bean>標簽中Autowire屬性的優先級比其上級標簽高,即是說,如果在上級標簽中定義default-autowire屬性為byName,而在<bean>中定義為byType時,Spring IoC容器會優先使用<bean>標簽的配置。

    下面通過一個例子來說明如何在應用中使用自動裝配(工程代碼見例程3.2)。新建一個java工程,為其添加上Spring開發能力后,創建一個ioc.test包,再分別創建電腦類(Computer)、主機類(Host)和顯示器類(Dispaly),為電腦類添加Host類型的屬性hostDisplay類型的屬性display,再添加一個run方法,讓電腦可以“運行”一起來。屬性代碼如下:

    電腦類:

     1package ioc.test;
     2
     3/**
     4 * @author zhangyong
     5*/

     6public class Computer {
     7    
     8    private Host host;
     9    private Display display;
    10    //電腦運行方法
    11    public void run(){
    12        System.out.println("你好,我是電腦,正在運行!");
    13        System.out.print("   "+host.run()+",");
    14        System.out.println(display.run());
    15    }

    16//Geter和Seter方法,省略
    17}

    18

     

    再給主機類添加一run方法,讓主機也可以“運行”,代碼如下:


    1package ioc.test;
    2
    3public class Host {
    4    public String run(){
    5        return "我是主機,正在運行!";
    6    }

    7}

    8

      同上也給Display添加run方法,如下:
    1package ioc.test;
    2
    3public class Display {
    4    public String run(){
    5        return "我是顯示器,正在運行!";
    6    }

    7}

    8

    下面便是修改Spring的配置文件,讓IoC容器為我們的“電腦”自動裝配“主機”和“顯示器了”。分別配置兩個beanhostdisplay。再配置一個名computer1beanautowire屬性設為byName,同理配置computer1computer3autowire屬性分別設為byTypedefault,最后設置<beans>標簽的default-autowire屬性為autodetect。至此,配置工作已經完成,可以看到,我們并沒有顯式的給computer bean它注入依賴對象hostdisplay。配置代碼如下:

     1<?xml version="1.0" encoding="UTF-8"?>
     2<beans    default-autowire="autodetect">
     3    <bean id="computer1" class="ioc.test.Computer" autowire="byName"></bean>
     4    <bean id="computer2" class="ioc.test.Computer" autowire="byType"></bean>
     5    <bean id="computer3" class="ioc.test.Computer" autowire="default"></bean>
     6    
     7    <bean id="host" class="ioc.test.Host"></bean>
     8    <bean id="display" class="ioc.test.Display"></bean>    
     9</beans>
    10

    現在可以建立一個測試類來測試一下Spring時候真的為我們自動裝配好了我們需要的bean。代碼如下:

     1package ioc.test;
     2
     3//import省略
     4public class TestMain {
     5
     6    public static void main(String[] args) {
     7        ApplicationContext ac = new ClassPathXmlApplicationContext(
     8                "applicationContext.xml");
     9        //byName
    10        Computer computer1 = (Computer)ac.getBean("computer1");
    11        System.out.println("autowire=\"byName\":");
    12        computer1.run();
    13        
    14        //byType
    15        Computer computer2 = (Computer)ac.getBean("computer2");
    16        System.out.println("autowire=\"byType\":");
    17        computer2.run();
    18        
    19        //default
    20        Computer computer3 = (Computer)ac.getBean("computer3");        
    21        System.out.println("autowire=\"default\":");
    22        computer3.run();
    23    }

    24}

    25

    運行該類,輸出結果如下:

     
    從運行結果可以看出,Spring IoC容器已經為我們自動的裝配好的“電腦”,從而配置文件簡潔了許多。但是,自動裝配并不是十全十美的,我們不論是使用byName還是byType的方法,Spring不一定就能很準確的為我們找到JavaBean依賴的對象。另外,如果使用自動裝配,Spring配置文件的可讀性也大大降低,我們不能很容易的看出個bean之間的依賴關系,這也在一定程度上降低了程序可維護性。因此在使用自動裝配時,應當權衡利弊,合理的與ref的方法相結合,盡量在降低工作量的同時,保證應用的可維護度。



    By:殘夢追月
    posted on 2008-07-20 15:13 殘夢追月 閱讀(24765) 評論(16)  編輯  收藏 所屬分類: Spring

    評論:
    # re: Spring Autowiring自動裝配 2008-07-20 15:18 | 殘夢追月
    寫的不好,達人拍磚啊!  回復  更多評論
      
    # re: Spring Autowire自動裝配 2009-02-23 14:47 | 老衲
    老衲很以為然  回復  更多評論
      
    # re: Spring Autowire自動裝配 2009-02-23 14:48 | 老衲
    老衲很以為然343  回復  更多評論
      
    # re: Spring Autowire自動裝配 2009-04-01 10:19 | 楊愛友
    寫的這么精彩,不頂一下太對不起你。  回復  更多評論
      
    # re: Spring Autowire自動裝配 [未登錄] 2009-05-24 12:03 | super
    不錯
    通俗易懂  回復  更多評論
      
    # re: Spring Autowire自動裝配 2010-01-11 15:28 | chaoskz
    我個人認為自動注入比較好,架構的依賴關系應該以看文檔為主!  回復  更多評論
      
    # re: Spring Autowire自動裝配 2011-04-10 11:33 | Jonn
    寫的真的不錯啊!呵呵 頂  回復  更多評論
      
    # re: Spring Autowire自動裝配 [未登錄] 2011-12-29 10:49 | jiang
    通俗易懂,頂一個。  回復  更多評論
      
    # re: Spring Autowire自動裝配 2012-02-20 14:22 | 譚杰希
    老納法號亂來!  回復  更多評論
      
    # re: Spring Autowire自動裝配 2012-04-19 12:30 | fashion_ly
    寫的不錯  回復  更多評論
      
    # re: Spring Autowire自動裝配 2012-12-16 20:10 | Join
    不錯,很清晰
      回復  更多評論
      
    # re: Spring Autowire自動裝配 2013-01-29 11:51 | java程序猿
    寫的很好,看懂了,對我幫助挺大 謝謝了  回復  更多評論
      
    # re: Spring Autowire自動裝配 2013-04-11 18:45 | 你兒吃草
    cacacaca  回復  更多評論
      
    # re: Spring Autowire自動裝配 [未登錄] 2013-04-24 17:11 | 大頭
    學到了 頂一個 摸摸頭  回復  更多評論
      
    # re: Spring Autowire自動裝配 [未登錄] 2013-12-02 09:48 | 許仙兒
    栗子不錯  回復  更多評論
      
    主站蜘蛛池模板: 一级日本高清视频免费观看| 亚洲爆乳无码精品AAA片蜜桃| 亚洲黄页网在线观看| 大地资源在线观看免费高清| 日韩亚洲人成网站| 国产亚洲综合久久系列| 青娱乐免费视频在线观看| 免费无码婬片aaa直播表情| 亚洲国产精品免费视频| 国产黄色片在线免费观看| 中文毛片无遮挡高清免费| 亚洲人成网站在线观看播放青青| 五月天婷亚洲天综合网精品偷| 最近中文字幕免费大全| 亚洲AV男人的天堂在线观看| 亚洲无人区一区二区三区| 久久电影网午夜鲁丝片免费| 999zyz**站免费毛片| 亚洲性色精品一区二区在线| 久久精品国产精品亚洲精品| 妞干网免费视频观看| 久久午夜无码免费| 一级特黄a免费大片| 亚洲七久久之综合七久久| 亚洲国产成人一区二区三区| 免费大黄网站在线看| 国产精品永久免费10000| 国产男女爽爽爽免费视频| 亚洲综合色丁香婷婷六月图片 | 亚洲中文字幕不卡无码| 无码一区二区三区AV免费| 久久精品成人免费看| 黄页网址大全免费观看12网站 | 青柠影视在线观看免费| 国产精品亚洲va在线观看| 亚洲午夜成激人情在线影院 | 男女猛烈无遮掩视频免费软件| 亚洲中文字幕人成乱码| 久久精品亚洲中文字幕无码网站| 亚洲国产成人影院播放| 四虎影视大全免费入口|