Spring的 xml配置文件中,通过将一个bean注入装配到另一个bean来实现类的耦合。
如果不使用自动装配,则方法为
< bean name="" ref="" />
<span style="font-family:FangSong_GB2312;font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;"> <bean id="userDAO" class="com.vin.dao.impl.UserDAOImpl">
<property name="id" value="1" />
</bean>
<bean id="userService" class="com.vin.service.UserService" scope="prototype" >
<property name="userDAO" ref="userDAO" />
</bean></span></span></span>
如上例,将userDAO的bean注入到了userService的bean,通过ref属性指定,ref的值必须与被注入的bean的id相同。
如果使用autowire,有两种方式:
1. xml配置文件中,在<bean>标签中加入autowire属性,值为“byType”或“byName”,此时无需ref注入。
<span style="font-family:FangSong_GB2312;font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;"><bean id="userDAO" class="com.vin.dao.impl.UserDAOImpl">
<property name="id" value="1" />
</bean>
<bean id="userService" class="com.vin.service.UserService" scope="prototype" autowire="byName">
</bean></span></span></span>
如上例,系统按名称扫描属性userDAO,如果扫描到userDAO,则自动装配它对应的类。如果是“byType”,则按类型扫描。
2. Annotation
2.1 Autowire按类型对应注入
在bean标签对应的类文件中,在被注入的属性的setter方法上写上注解@Autowired,则系统将从spring容器中自动扫描与setter函数的参数对应类型的bean。
<span style="font-family:FangSong_GB2312;font-size:18px;"><span style="font-size:18px;"> @Autowired
public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
}</span></span>
如上例,系统从spring容器中自动扫描类型为UserDAO类型的bean,注入UserService的userDAO属性的setter方法中,因此完成了自动装配。
2.2 Qualifier指定name
上面提到,autowire自动装配注入是按类型来对应bean和setter函数的参数的。
纳闷问题来了,如果有两个bean,他们是同样的类型,那么他们与setter函数的参数就无法对应,系统报错。
此时应使用@Qualifier(name)来指定名称(即bean的id)来指定装配哪一个bean。
<span style="font-family:FangSong_GB2312;font-size:18px;"><span style="white-space:pre"> </span>@Autowired
public void setUserDAO(@Qualifier("userDAO2") UserDAO userDAO) {
this.userDAO = userDAO;
}</span>
3. Resource
也可以不使用spring包的autowire,而使用javaEE的resource,同样是加在setter方法上。默认为匹配名称。
@Resource(name="userDAO2")
public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
}