标签:
1 byName 通过id的名字与属性的名字进行判断,要保证Bean实例中属性名字与该装配的id名字相同。
2 byType 通过类型确定装配的bean,但是当存在多个类型符合的bean时,会报错。
3 contructor 在构造注入时,使用该装配方式,效果如同byType。
4 autodetect 首先尝试使用constructor进行自动装配。如果失败,再次尝试使用byType经行自动装配。(测试过,3.0.5版本不可用了,不知道是不是被移除了。)
在byType装配方式下,spring首先会反射autowire="byType"的bean,得到bean属性的返回类型,然后去spring容器中按照类
型去匹配,最后把匹配到的bean注入到当前bean中.看个例子就明白了:
1.新建包com.tutorialspoint.autowire.bytype,并在包中新建Zoo.java类,内容如下:
package com.tutorialspoint.autowire.bytype; import com.tutorialspoint.autowire.Cat; import com.tutorialspoint.autowire.Dog; import com.tutorialspoint.autowire.Duck; public class Zoo { private Cat cat; private Dog dog; private Duck duck; // 自动装配并不适用于原始类型.这时候我们可以对该属性进行手动装配 private String zooName; public void setZooName(String zooName) { this.zooName = zooName; } public void setCat(Cat cat) { this.cat = cat; } public void setDog(Dog dog) { this.dog = dog; } public void setDuck(Duck duck) { this.duck = duck; } public void print() { if (cat == null) { System.out.println("cat is null"); } else { cat.sayHi(); } if (dog == null) { System.out.println("dog is null"); } else { dog.sayHi(); } if (duck == null) { System.out.println("duck is null"); } else { duck.sayHi(); } System.out.println(zooName); } }
2.在src目录下新建配置文件autowire_byType.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"> <!-- 名为zoo的bean在按照byType进行装配的时候,可以适配名字为cat1、dog1、duck1 的bean的类型。所以最终cat1、dog1、duck1会被分别注入进zoo的cat、dog、duck属性。 在按照类型进行装配的时候,如过有两个bean的类型符合的话,spring就不知道最终该使用哪个,这时候我们 可以使用primary="true"告诉spring优先使用本bean --> <bean id="cat1" class="com.tutorialspoint.autowire.Cat" primary="true"></bean> <bean id="cat2" class="com.tutorialspoint.autowire.Cat"></bean> <bean id="dog1" class="com.tutorialspoint.autowire.Dog"></bean> <bean id="duck1" class="com.tutorialspoint.autowire.Duck"></bean> <bean id="zoo" class="com.tutorialspoint.autowire.bytype.Zoo" autowire="byType"> <!-- 由于自动装配仅适用于引用类型,普通类型还需要手动进行注入 --> <property name="zooName" value="international_zoo"></property> </bean> </beans>
注:
<bean id="saxophone" class="com.springinaction.springidol.Saxophone" autowire-candidate="false"/>
如果需要为Spring应用的上下文中的每一个Bean(或者其中的大多数)配置相同的autowire属性,那么可以通过在根元素<beans>上增加一个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-3.0.xsd" default-autowire="byType"> </beans>
注意
标签:
原文地址:http://www.cnblogs.com/bmbi/p/5654812.html