autowire="byName"会自动装配属性与Bean id相同的Bean,例如有两个BEAN,
<bean id="userDAO" class="com.springdemo.dao.AdminDAO"></bean>
<bean id="userService3" autowire="byName" class="com.springdemo.service.UserService"></bean>
UserService类中有一个userDAO属性:
private IUserDAO userDAO;
public IUserDAO getUserDAO() {
return userDAO;
}
public void setUserDAO(IUserDAO userDAO) {
this.userDAO = userDAO;
}
这样在创建userService3这个BEAN的时候会byName找到userDAO这个BEAN然后setter注入到userService3这个BEAN实例中去。
如果userService3中同时又设置了setter注入,如下:
<bean id="clientDAO" class="com.springdemo.dao.ClientDAO"></bean>
<bean id="userService2" autowire="byName"
class="com.springdemo.service.UserService">
<property name="userDAO">
<ref bean="clientDAO" />
</property>
</bean>
这时候既有autowire又有property,那么property的setter会覆盖autowire的setter注入,这时候UserService类中的userDAO其实是com.springdemo.dao.ClientDAO类型,而不是com.springdemo.dao.AdminDAO
表 3.2. Autowiring modes
模式 | 说明 |
---|---|
no | |
byName | 根据属性名自动装配。此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自动装配。例如,在bean定义中将autowire设置为by name,而该bean包含master属性(同时提供setMaster(..)方法),Spring就会查找名为 |
byType | 如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配。如果存在多个该类型的bean,那么将会抛出异常,并指出不能使用byType方式进行自动装配。若没有找到相匹配的bean,则什么事都不发生,属性也不会被设置。如果你不希望这样,那么可以通过设置 |
constructor | 与byType的方式类似,不同之处在于它应用于构造器参数。如果在容器中没有找到与构造器参数类型一致的bean,那么将会抛出异常。 |
autodetect | 通过bean类的自省机制(introspection)来决定是使用constructor还是byType方式进行自动装配。如果发现默认的构造器,那么将使用byType方式。 |