自动装配类型:byname、bytype、constructor、autodetect
1、byname
根据属性名进行自动装配。此选项检查容器并根据名称查找与属性完全一致的bean,并将其与属性自动装配。
使用byname自动装配类型时,对于设置的属性名字必须提供set方法,否则在启动Spring容器时,将会报出异常。
package autowire;
public class People {
String name;
int age;
Action action;
public void setAction(Action action) {
this.action = action;
}
public Action getAction() {
return this.action;
}
// 省略。。。
}
<bean id="action" class="autowire.Action">
<property name="actionName" value="eat">
</bean>
<bean id="people" class="autowire.People" autowire="byName">
<property name="name" value="eat">
<property name="age" value="24">
</bean>
2、bytype
如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动匹配。如果存在多个该类型的bean,那么将会抛出异常,并指出不能使用bytype方式进行装配。如果没有找到相匹配的bean,则什么事都不会发生,属性也不会被设置。如果不希望这样,那么可以通过设置dependency-check="objects"使Spring抛出异常。
上面的例子改成autowire="byType"依然可以正常执行。
如果有A、B两个类,两者满足一下三种情况的任意一种,都可以称为A匹配与B
A和B是相同的类型、A是B的子类、A实现了B的接口
如果bean采用bytype进行自动装配,当IOC容器中存在多个类型匹配的bean时,因为无法判断究竟选择哪个bean作为自动装配的目标,Spring将会抛出异常unsatisfied-dependencyexception。
3、constructor
与bytype类似,不同之处在于应用于构造参数。如果在容器中没有找到与构造器参数类型一直的bean,那么将会抛出异常。
public People(String name, int age, Action action) {
this.name = name;
this.age = age;
this.action = action
}
<bean id="action" class="autowire.Action">
<property name="actionName" value="eat">
</bean>
<bean id="people" class="autowire.People" autowire="constructor">
<constructor-arg index="0" value="eat">
<constructor-arg index="1" value="24">
</bean>
4、autodetect
通过bean类的自省机制决定使用contructor还是bytype进行自动装配。如果发现默认构造器,那么将使用bytype方式。
自动装配控制:
可以将bean元素的autowire-candidate属性设为false,这样容器在查找自动装配的对象时,将不考虑该bean。
另一个是通过对bean的id属性进行模式匹配,对自动装配进行限制。通过设置beans元素的default-auto-candidates属性进行设置。如果限制名字以2结尾的bean,那么可以设置为"*2",表示名字为2结尾的bean将不作为候选者进行自动装配。
如果bean显示的将autowire-candidate属性设置为ture或false,容器在自动装配的时候优先采用该属性的设置,而模式匹配将不起作用。排除后的bean可以继续使用自动装配来注入到其他的bean,但是不能作为其他bean自动装配的候选者。
默认自动装配:
Spring通过<beans>元素的default-autowire属性可以设置其下的bean的自动装配模式,no表示不启动自动装配。bean中定义的autowire属性会覆盖通过beans设置的自动装配属性。
在Bean中设置primary属性为true,该bean设置为首选自动装配bean。