Spring 在XML配置文件上的自动装配:
Spring在XML上提供5中自动装配形式:
- 默认(缺省)情况 – 缺省情况下,需要通过“ref”属性手动设定。
- 通过属性名称自动装配 “byName”。如果一个bean的名称和其他bean属性的名称是一样的,将会自装配它。
- 通过数据类型自动装配 "byType "。如果一个bean的数据类型是用其它bean属性的数据类型,兼容并自动装配它。
- 通过构造函数参数的数据类型按属性自动装配 “constructor”。 构造函数参数中使用byType方式。
- 通过自动检测自动装配 “autodetect”。如果默认的构造函数提供,自动检测将构造自动装配。如果没有找到默认的构造函数,自动检测将按类型选择装配。
以下面代码为例,显然,在配置Bean时需要把Person bean注入到Customer Bean中。
public class Car{
private Wheel wheel;
public Car(Wheel wheel) {
this.wheel = wheel;
}
//...
}
public class wheel {
//...
}
1、默认装配
默认装配需要通过 'ref' 属性来连接 bean。
<bean id="Car" class="com.common.Car">
<property name="wheel" ref="wheel" />
</bean>
<bean id="wheel" class="com.common.Wheel" />
2、按属性名称自动装配 "byName"
这种装配方式要求“wheel” bean的名称是与“car” bean 的属性(“wheel”)名称相同。这样,Spring会自动通过setter方法将其装配。
<bean id="car" class="com.common.Car" autowire="byName" />
<bean id="wheel" class="com.common.Wheel" />
3、按属性的数据类型自动装配 "byType"。
在这种情况下,由于“Wheel” bean中的数据类型是与“car” bean的属性(Wheel对象)的数据类型一样的,所以,Spring会自动通过setter方法将其自动装配。
注意:在类型的自动装配模式,就必须确保只有Bean 只有一个唯一的数据类型声明。
<bean id="car" class="com.common.Car" autowire="byType" />
<bean id="wheel" class="com.common.Wheel" />
4、通过构造函数参数的数据类型按属性自动装配 “constructor”
在这种情况下,由于“wheel” bean的数据类型与“car” bean的属性(Wheel对象)的构造函数参数的数据类型是一样的,所以,Spring通过构造方法自动装配 。
<bean id="car" class="com.common.Car" autowire="constructor" />
<bean id="wheel" class="com.common.Wheel" />
5、通过自动检测自动装配 “autodetect”
就是第三和第四种方法的结合,如果默认的构造函数提供,自动检测将构造自动装配。如果没有找到默认的构造函数,自动检测将按类型选择装配。
Spring 通过注解的方式实现自动装配:
通过注解的方式实现自动装配有三个步骤:
1、Beans
注意,这里就不需要在XML文件中配置Bean的依赖关系了。
<bean id="CarBean" class="com.common.Car"></bean>
<bean id="WheelBean" class="com.common.Wheel"></bean>
2、注册AutowiredAnnotationBeanPostProcessor
有两种方式:
1、 Include <context:annotation-config />
在XML配置文件中配置Bean之前加上该配置即可。
<context:annotation-config />
<bean id="CarBean" class="com.common.Car"></bean>
<bean id="WheelBean" class="com.common.Wheel"></bean>
2、包含 AutowiredAnnotationBeanPostProcessor
<beans class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
<bean id="CarBean" class="com.common.Car"></bean>
<bean id="WheelBean" class="com.common.Wheel"></bean>
</beans>
3、@Autowired注解
通过 @Autowired 自动装配 bean,它可以在 setter 方法,构造函数或字段中使用。如在字段上使用:
public class Car
{
@Autowired
private Wheel wheel;
//getter and setter methods
}
依赖检查
默认情况下,@Autowired将执行相关检查,以确保属性已经装配正常。当Spring无法找到匹配的Bean装配,它会抛出异常。可以通过 @Autowired 的“required”属性设置为false来禁用此检查功能。
public class Car
{
@Autowired(required=false)
private Wheel wheel;
//getter and setter methods
}
@Qualifier
如果有两个Person类型的Bean,通过注解如何知道应该装配那个Bean? 可以使用 @Qualifier 自动装配一个特定的 bean。
public class Car
{
@Autowired
@Qualifier("WheelBean1")
private Wheel wheel;
//getter and setter methods
}