013_Spring IoC学习笔记autowire介绍
autowire是指自动装配,之前的博文你发现,我们如果想注入,总得在bean下面配置property
<bean id="userService" class="com.jt.service.UserService"> <property name="userDAO" ref="u" /> </bean>
是不是觉得麻烦,其实spring的开发者也考虑到了这点,我们可以通过在bean里面配置autowire来完成自动装配,如下
<bean id="userService" class="com.jt.service.UserService" scope="prototype" autowire="byName" />
autowire有以下五种类型:
- no
- byName
- byType
- constructor
- autodetect
1、no
表示不自动装配,这也是一种推荐方式,也是默认的方式,就是说,你必须添加property属性,虽然开发的工作量增加了,但程序更易读
2、byName
通过java类里面配置的name属性来装配,例如:
public class UserService { private UserDAO userDAO; public void add(User user) { userDAO.save(user); } public UserDAO getUserDAO() { return userDAO; } public void setUserDAO(UserDAO userDAO) { this.userDAO = userDAO; } }
这里的名字叫userDAO,那么spring就会用这个名字,在beans.xml文件中,找一个叫UserDAO的bean,如果没有找到,返回null
3、byType
通过属性来找,所以名字不重要了,只要是UserDAO的类型,就能被装配进去,但问题是,如果再beans.xml中有两个以上类型相同的bean,spring就傻了,一定不要让程序迷惑。例如下面的配置,就有问题。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <bean name="userDAO" class="com.jt.dao.impl.UserDAOImpl"> <property name="daoId" value="1"></property> </bean> <bean name="userDAO2" class="com.jt.dao.impl.UserDAOImpl"> <property name="daoId" value="2"></property> </bean> <bean id="userService" class="com.jt.service.UserService" scope="prototype" autowire="byType"/> </beans>
报的异常为:
org.springframework.beans.factory.NoSuchBeanDefinitionException
4、constructor
spring通过寻找构造方法来装配,如果你没有相应的构造方法,返回null,如果找到,按byType方式来装配,所以上面的问题还是存在
5、autodetect
通过byType或constructor来找,如果找不到,返回null,找到多个,报错
好了,说了这么多,实际中用哪个?一般哪个都不用,都是直接配置property,而且需要指出一点,如果配置了property,就能覆盖autowire的配置。