自动装配:实现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