自動裝配:實現bean的注入或者裝配
bean的自動裝配的類型(默認類型爲No):
在同一個IOC容器中,id即屬性名是唯一的。
例:
spring-autowiring.xml設置default-autowire:
<?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.xsd"
default-autowire="constructor">
<!-- 也可設置爲byName,使用byName時,不可忽略AutoWiringDAO的id的配置 ;
byType的自動注入和bean的id沒有直接關係,當使用byType時,可省略此文件中AutoWiringDAO的id的配置 ;
設置爲"constructor"時,必須增加構造方法
-->
<bean id="autoWiringService" class="com.autowiring.AutoWiringService"></bean>
<bean id="autoWiringDAO" class="com.autowiring.AutoWiringDAO"></bean>
</beans>
AutoWiringDAO:
package com.autowiring;
public class AutoWiringDAO {
public void say(String word){
System.out.println("AutoWiringDAO:"+word);
}
}
AutoWiringService:
package com.autowiring;
public class AutoWiringService {
private AutoWiringDAO autoWiringDAO;
//設置 default-autowire="constructor"要增加構造方法,只有構造器注入才寫構造方法,其他方式可不寫
//根據構造器注入是在IOC容器中查找構造器方法傳入參數的類型是否在IOC容器存在相應類型的bean的實例,若查找類型class,則與id無關,可在bean的配置中刪除id
public AutoWiringService(AutoWiringDAO autoWiringDAO){
System.out.println("AutoWiringService");
this.autoWiringDAO=autoWiringDAO;
}
//在spring-autowiring.xml中設置了default-autowire="byName",
//會在Spring的IOC容器中尋找名稱爲autoWiringDAO的bean的id,會將其對應的實例賦值給AutoWiringService聲明的autoWiringDAO對象
public void setAutoWiringDAO(AutoWiringDAO autoWiringDAO) {
this.autoWiringDAO = autoWiringDAO;
}
public void say(String word){
this.autoWiringDAO.say(word);
}
}
測試TestAutoWiring:
package com.test.autowiring;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.BlockJUnit4ClassRunner;
import com.autowiring.AutoWiringService;
import com.imooc.test.base.UnitTestBase;
@RunWith(BlockJUnit4ClassRunner.class)
public class TestAutoWiring extends UnitTestBase {
public TestAutoWiring() {
super("classpath:spring-autowiring.xml");
}
@Test
public void testSay(){
AutoWiringService service=super.getBean("autoWiringService");
service.say("this is a test");
}
}
運行:
注:
- 使用構造器注入必須寫構造函數,其他方式可不寫。
- 根據屬性名裝配必須設置id
- 根據類型裝配,必須設置class,可不設置id