目录:
- 自动装配Bean属性
- 使用注解装配
- 自动检测Bean
- 使用Spring基于Java的配置
自动装配Bean属性
四种类型的自动装配:
1 byName 通过id的名字与属性的名字进行判断,要保证Bean实例中属性名字与该装配的id名字相同。
2 byType 通过类型确定装配的bean,但是当存在多个类型符合的bean时,会报错。
3 contructor 在构造注入时,使用该装配方式,效果如同byType。
4 autodetect 首先尝试使用constructor进行自动装配。如果失败,再次尝试使用byType经行自动装配。(测试过,3.0.5版本不可用了,不知道是不是被移除了。)
自动装配以-byType为例讲解:
在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,可以使用<bean>元素的primary属性。如果只有一个自动装配的候选Bean的primary属性设置为true,那么该Bean将比其他候选Bean优先被选择。但是primary属性有一个很怪异的一点,它的默认设置为true。这意味着所有的候选Bean都变成首选Bean(因此,其实就不存在首选Bean了)。所有,为了使用primary属性,我们不得不将所有非首选Bean的primary属性设置为false。
- primary属性仅对标识首选Bean有意义。如果在自动装配时。我们希望排除某些Bean,那可以设置这些Bean的autowire-candidate属性为false,示例如下:
<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>
注意
- default-autowire应用于指定Spring配置文件中的所有Bean;并不是应用于Spring应用上下文中的所有Bean。我们可以在一个应用上下文中定义多个配置文件,每个配置文件都可以有自己的默认自动装配策略。
- 同样,不能因为我们配置了一个默认的自动装配策略,就意味着所有的Bean都只能使用这个默认的自动装配策略。我们还可以使用<bean>元素的autowire属性来覆盖所配置的默认自动装配策略。
- 可以使用自动装配策略和显式装配策略,显式装配会覆盖自动装配。
时间: 2024-10-11 18:08:07