Autowiring自动装配
有哪些类型
No:不做任何操作(默认的)。
byname:根据属性名自动装配。此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自动匹配。如果重复的话,IOC容器启动就会失败,不能存在两个相同的id。
byType:如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动匹配;如果存在多个该类型bean,那么抛出异常,并指出不能使用byType方式进行自动匹配;如果没有找到相匹配的bean,则什么事都不发生。
Constructor:与byType方式类似,不同之处在于它应用于构造器函数。如果容器中没有找到与构造器参数类型一致的bean,那么抛出异常。
例子
先创建AutoWiringDAO和AutoWiringService两个类,然后将他们配置到Spring的配置文件中。
<bean id="autoWiringService" class="com.imooc.autowiring.AutoWiringService" ></bean>
<bean id="autoWiringDAO" class="com.imooc.autowiring.AutoWiringDAO" ></bean>
通过在beans标签下设置default-autowire来自动装配
然后在AutoWiringDAO里边定义一个say方法
public class AutoWiringDAO {
public void say(String word) {
System.out.println("AutoWiringDAO : " + word);
}
}
然后是Service中的操作
采用的设值注入的方式.
首先生成AutoWiringDAO的set方法,然后定义Service的say方法,在里边调用DAO的say方法。
public class AutoWiringService {
private AutoWiringDAO autoWiringDAO;
//构造方法
public AutoWiringService(AutoWiringDAO autoWiringDAO) {
System.out.println("AutoWiringService");
this.autoWiringDAO = autoWiringDAO;
}
public void setAutoWiringDAO(AutoWiringDAO autoWiringDAO) {
System.out.println("setAutoWiringDAO");
this.autoWiringDAO = autoWiringDAO;
}
public void say(String word) {
this.autoWiringDAO.say(word);
}
}
按照之前的设值注入的配置方法,在xml文件里应该是
<bean id="autoWiringService" class="com.imooc.autowiring.AutoWiringService" >
<property name="autoWiringDAO" ref="sutoWiringDAO"></property>
</bean>
但是有了根据name的自动配置后,也就是default-autowire=”byName”,不需要property标签。只需要定义好bean,然后在引用的bean(AutoWiringService)中声明set方法和它的属性,被引用的bean(AutoWiringDAO)中不需要做任何操作。
单元测试类
@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");
}
}
这里service的say调用DAO的say,最终输出AutoWiringDAO:this is a test。
那么set这个方法是如何被执行的?
因为设置了default-autowire=”byName”,set为了将值赋给private的那个属性autoWiringDAO,在会在spring文件中寻找和autoWiringDAO完全一致的bean的id(对应的类AutoWiringDAO),将它的实例赋给那个属性(this.autoWiringDAO = autoWiringDAO(这个是实例))。
也就是说用这种默认的自动装配的方式可以减少我们在配置bean时的代码行数,使整个bean的配置看起来更简洁。
前边的是byName,如果是byType很类似,就是寻找对应的class,和bean的id没有直接的关系,甚至可以把id=”autoWiringDAO”删掉。
如果是default-autowire=”constructor”,在Service中写构造方法,之前已经写了
//构造方法
public AutoWiringService(AutoWiringDAO autoWiringDAO) {
System.out.println("AutoWiringService");
this.autoWiringDAO = autoWiringDAO;
}
根据构造器注入,是在IOC容器中查找构造器方法传入参数的类型在IOC容器中是否有相应类型的bean的实例,和id并没有严格的关系。