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的配置。

相关推荐