1. 程式人生 > >Spring Bean的自動裝配

Spring Bean的自動裝配

一個bean使用其他的bean,除了顯式的配置XML檔案外,也可以通過配置< bean >的autowire 屬性來實現bean的自動裝配。自動裝配的好處是減少了構造器注入和setter注入配置(其實就是少了< property >標籤,但是Bean裡面set方法還是必須的),減少了配置檔案的長度。

Spring 3.0支援以下4種自動裝配模式:

模式 描述
no 預設的設定,它意味著沒有自動裝配,此時應該顯式配置bean
byName 根據屬性名自動裝配。Spring容器將根據名字查詢與屬性完全一致的bean,然後將其自動裝配
byType 根據屬性型別自動裝配。如果容器中存在一個與指定型別相同的bean,那麼將與該屬性自動裝配;如果存在多個該型別的bean,那麼丟擲異常,提示不能使用byType方式進行自動裝配;如果沒有找到相匹配的bean,那麼不會發生任何事
constructor 與byType方式類似,不同的是它應用於構造器引數。如果沒有找到對應型別的bean,那麼將會丟擲異常


下面以byType方式為例進行演示:
首先建立一個AutoWiringService類(set方法還是必須要寫的):

package com.spring.test;

public class
AutoWiringService { private AutoWiringDao autoWiringDao; public void setAutoWiringDao(AutoWiringDao autoWiringDao) { this.autoWiringDao = autoWiringDao; } public void say(String s) { autoWiringDao.say(s); } }

然後建立一個的依賴類AutoWiringDao:

public class AutoWiringDao {
    public
void say(String s) { System.out.println("AutoWiringDao:"+s); } }

XML配置檔案:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans  
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">  

    <bean id="autoWiringService" class="com.spring.test.AutoWiringService" autowire="byType"></bean>
    <bean id="autoWiringDao" class="com.spring.test.AutoWiringDao"></bean>

</beans>

測試類:

public class App {
    public static void main(String[] args) {
        @SuppressWarnings("resource")
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring-autowiring.xml");  
        AutoWiringService aService = (AutoWiringService) context.getBean("autoWiringService");
        aService.say("Hello World!");
    }
}

測試結果:這裡寫圖片描述

如果配置了多個依賴型別的bean,那麼byType的方式就會報錯:
XML檔案配置:

    <bean id="autoWiringService" class="com.spring.test.AutoWiringService" autowire="byType"></bean>
    <bean id="autoWiringDao" class="com.spring.test.AutoWiringDao"></bean>
    <bean id="autoWiringDao2" class="com.spring.test.AutoWiringDao"></bean>

測試結果:
這裡寫圖片描述

如果覺得對每個bean都配置一個autowire 太麻煩,那麼可以通過全域性的< beans >的default-autowire 屬性來指定所有的bean的自動裝配方式:

<beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans  
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
    default-autowire="byType">

    ...

<beans>