天天看點

Spring之自動裝配

随時随地閱讀更多技術實戰幹貨,擷取項目源碼、學習資料,請關注源代碼社群公衆号(ydmsq666)、QQ技術交流群(183198395)。

Spring之自動裝配
Spring之自動裝配
Spring之自動裝配

<bean>元素的autowire屬性負責自動裝配<bean>标簽定義的JavaBean的屬性。這樣代碼顯得簡潔美觀,負面影響是自動裝配之後,無法從配置檔案中讀懂JavaBean需要什麼屬性。

一、按名稱裝配

通過byname屬性以屬性名區分自動裝配。在容器中尋找與JavaBean屬性名相同的JavaBean,并将其自動裝配到JavaBean中。

示例如下:

User對象,引用上一文的:

package com.home.web.dto;

public class User {

    private String name;

    private Integer age;

    private String sex;

    public User() {
        super();
    }

    public User(String name, Integer age, String sex) {
        super();
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

}
           

定義PrintInfo類,将User注入到PrintInfo對象中,并提供操作方法:

PrintInfo:

package com.home.web.dto;

public class PrintInfo {

    private User user;

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public void printUser() {
        System.out.println("PrintInfo列印User屬性");
        System.out.println("------------------");
        System.out.println("使用者姓名:" + user.getName());
        System.out.println("使用者年齡:" + user.getAge());
        System.out.println("使用者性别:" + user.getSex());
    }

}
           

applicationContextx.xml中相關配置:

<!-- User Bean -->
	<bean name="user" class="com.home.web.dto.User">
		<constructor-arg index="0" type="String">
			<value>小明</value>
		</constructor-arg >
		<constructor-arg index="1" type="Integer">
			<value>25</value>
		</constructor-arg >
		<constructor-arg index="2" type="String">
			<value>男</value>
		</constructor-arg>
	</bean>
	<!-- PrintInfo Bean  -->
	<bean autowire="byName" id="printinfo" class="com.home.web.dto.PrintInfo"/>
           

下面是Manger類:

package com.home.web.manager;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;

import com.home.web.dto.PrintInfo;

public class Manager {

    public static void main(String[] args) {
        Resource resource = new ClassPathResource("applicationContext.xml");
        BeanFactory factory = new XmlBeanFactory(resource);
        PrintInfo printInfo = (PrintInfo) factory.getBean("printinfo");
        printInfo.printUser();
    }

}
           

運作結果如下:

Spring之自動裝配

二、按bean類型裝配:

Spring以bean類型區分自動裝配,這次容器比對的不再是bean的名稱。容器會自動找尋與JavaBean的屬性類型相同的JavaBean的定義,并将其注入到需要自動裝配的JavaBean中。

配置:

<!-- PrintInfo Bean  -->
	<bean autowire="byType" id="printinfo" class="com.home.web.dto.PrintInfo"/>
           

其他地方跟前面一樣。

三、其他方式

1、no屬性

這是autowire采用的預設值,它采用自動裝配。必須使用ref直接引用其他bean。這樣可以增加代碼可讀性,并且不易出錯。

2、constructor屬性

通過構造方法的參數類型自動裝配。會自動尋找構造方法參數類型相同的bean進行裝配,它與byType類型存在相同的無法識别自動裝配的情況。

3、autodetect屬性

它首先是要構造器方式自動裝配,然後是要byType方式。同樣存在他們相同的異常情況,建議把容易出現問題的JavaBean使用手動裝配注入依賴屬性。

四、自動裝配優點和缺點:

1、優點

能顯著減少配置數量。不過采用bean模闆也可以達到同樣目的。

自動裝配可以使用配置與Java代碼同步更新。推薦在開發過程中采用自動裝配,而在系統趨于穩定時改為顯示裝配的方式。

2、缺點

Spring會盡量避免在裝配不明确時進行猜測,因為可能出現難以預料的結果。而且 Spring所管理的對象之間的關聯關系也不再能清晰地進行文檔化。

如果采用byType方式,那麼容器中類型與自動裝配的bean的屬性或構造方法參數一緻的bean隻能有一個。如果存在多個就要考慮顯示裝配。