天天看點

Spring Autowire自動裝配

在應用中,我們常常使用<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屬性為printer的bean,然後使用Seter方法為其注入。

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

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

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

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類型的屬性host和Display類型的屬性display,再添加一個run方法,讓電腦可以“運作”一起來。屬性代碼如下:

電腦類:

 1

Spring Autowire自動裝配

package ioc.test;

 2

Spring Autowire自動裝配

 3

Spring Autowire自動裝配

/**

 4

Spring Autowire自動裝配

 * @author zhangyong

 5

Spring Autowire自動裝配

*/

 6

Spring Autowire自動裝配

public class Computer {

 7

Spring Autowire自動裝配

 8

Spring Autowire自動裝配

    private Host host;

 9

Spring Autowire自動裝配

    private Display display;

10

Spring Autowire自動裝配

    //電腦運作方法

11

Spring Autowire自動裝配

    public void run(){

12

Spring Autowire自動裝配

        System.out.println("你好,我是電腦,正在運作!");

13

Spring Autowire自動裝配

        System.out.print("   "+host.run()+",");

14

Spring Autowire自動裝配

        System.out.println(display.run());

15

Spring Autowire自動裝配

    }

16

Spring Autowire自動裝配

//Geter和Seter方法,省略

17

Spring Autowire自動裝配

}

18

Spring Autowire自動裝配

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

1

Spring Autowire自動裝配

2

Spring Autowire自動裝配

3

Spring Autowire自動裝配

public class Host {

4

Spring Autowire自動裝配

    public String run(){

5

Spring Autowire自動裝配

        return "我是主機,正在運作!";

6

Spring Autowire自動裝配

7

Spring Autowire自動裝配

8

Spring Autowire自動裝配

  同上也給Display類添加run方法,如下:

Spring Autowire自動裝配
Spring Autowire自動裝配
Spring Autowire自動裝配

public class Display {

Spring Autowire自動裝配
Spring Autowire自動裝配

        return "我是顯示器,正在運作!";

Spring Autowire自動裝配
Spring Autowire自動裝配
Spring Autowire自動裝配

下面便是修改Spring的配置檔案,讓IoC容器為我們的“電腦”自動裝配“主機”和“顯示器了”。分别配置兩個bean,host和display。再配置一個名computer1的bean,autowire屬性設為byName,同理配置computer1和computer3,autowire屬性分别設為byType和default,最後設定<beans>标簽的default-autowire屬性為autodetect。至此,配置工作已經完成,可以看到,我們并沒有顯式的給computer bean它注入依賴對象host和display。配置代碼如下:

Spring Autowire自動裝配

<?xml version="1.0" encoding="UTF-8"?>

Spring Autowire自動裝配

<beans    default-autowire="autodetect">

Spring Autowire自動裝配

    <bean id="computer1" class="ioc.test.Computer" autowire="byName"></bean>

Spring Autowire自動裝配

    <bean id="computer2" class="ioc.test.Computer" autowire="byType"></bean>

Spring Autowire自動裝配

    <bean id="computer3" class="ioc.test.Computer" autowire="default"></bean>

Spring Autowire自動裝配
Spring Autowire自動裝配

    <bean id="host" class="ioc.test.Host"></bean>

Spring Autowire自動裝配

    <bean id="display" class="ioc.test.Display"></bean>    

Spring Autowire自動裝配

</beans>

Spring Autowire自動裝配

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

Spring Autowire自動裝配
Spring Autowire自動裝配
Spring Autowire自動裝配

//import省略

Spring Autowire自動裝配

public class TestMain {

Spring Autowire自動裝配
Spring Autowire自動裝配

    public static void main(String[] args) {

Spring Autowire自動裝配

        ApplicationContext ac = new ClassPathXmlApplicationContext(

Spring Autowire自動裝配

                "applicationContext.xml");

Spring Autowire自動裝配

        //byName

Spring Autowire自動裝配

        Computer computer1 = (Computer)ac.getBean("computer1");

Spring Autowire自動裝配

        System.out.println("autowire=\"byName\":");

Spring Autowire自動裝配

        computer1.run();

Spring Autowire自動裝配
Spring Autowire自動裝配

        //byType

Spring Autowire自動裝配

        Computer computer2 = (Computer)ac.getBean("computer2");

Spring Autowire自動裝配

        System.out.println("autowire=\"byType\":");

Spring Autowire自動裝配

        computer2.run();

Spring Autowire自動裝配

19

Spring Autowire自動裝配

        //default

20

Spring Autowire自動裝配

        Computer computer3 = (Computer)ac.getBean("computer3");        

21

Spring Autowire自動裝配

        System.out.println("autowire=\"default\":");

22

Spring Autowire自動裝配

        computer3.run();

23

Spring Autowire自動裝配

24

Spring Autowire自動裝配

25

Spring Autowire自動裝配
Spring Autowire自動裝配