Spring Bean的自動裝配
阿新 • • 發佈:2019-01-22
一個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>