spring bean autowire自动装配

转自:http://blog.csdn.net/xiao_jun_0820/article/details/7233139

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就会查找名为master的bean定义,并用它来装配给master属性。

byType

如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配。如果存在多个该类型的bean,那么将会抛出异常,并指出不能使用byType方式进行自动装配。若没有找到相匹配的bean,则什么事都不发生,属性也不会被设置。如果你不希望这样,那么可以通过设置dependency-check="objects"让Spring抛出异常。

constructor

byType的方式类似,不同之处在于它应用于构造器参数。如果在容器中没有找到与构造器参数类型一致的bean,那么将会抛出异常。

autodetect

通过bean类的自省机制(introspection)来决定是使用constructor还是byType方式进行自动装配。如果发现默认的构造器,那么将使用byType方式。

原文地址:https://www.cnblogs.com/wangpei/p/3656766.html