spring自动装配注入

257 阅读2分钟

Spring容器可以自动装配bean之间的依赖关系,自动装配具有以下优点:

  • 自动装配可以大大减少指定属性或构造函数参数的配置
  • 随着对象的发展,自动装配可以更新配置。例如,如果您需要向类中添加依赖项,则无需修改配置即可自动满足该依赖项

自动装配的局限性和缺点:

  • 显式依赖项property和constructor-arg设置始终会覆盖自动装配。您不能自动连接简单的属性,例如基元 Strings,和Classes(以及此类简单属性的数组)。此限制是设计使然。
  • 自动装配不如显式接线精确。尽管如前所述,Spring还是谨慎地避免猜测,以免产生意想不到的结果。Spring管理的对象之间的关系不再明确记录。
  • 接线信息可能不适用于可能从Spring容器生成文档的工具。
  • 容器内的多个bean定义可能与要自动装配的setter方法或构造函数参数指定的类型匹配。对于数组,集合或 Map实例,这不一定是问题。但是,对于需要单个值的依赖项,不会任意解决此歧义。如果没有唯一的bean定义可用,则会引发异常

自动装配模式,参考文档

模式说明
no默认,无需自动装配
byName按属性名称自动属性。Spring会找与属性同名的bean,然后通过set方法注入
byType按类型自动装配属性。Spring会找该属性类型的bean,然后通过set方法注入
constructor类似于byType,但只适用于构造函数参数。如果容器中不存在造函数参数类型的bean会引发异常

在beans节点通过 default-autowire="byType" 开启自动装配,且指定全局默认按类型自动装配
也可以在bean节点通过 autowire 指定,bean的装配方式高于beans

<?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.xsd"
default-autowire="byType" >
    <bean class="com.ofwiki.AutowireApplication.UserService" primary="true" autowire="byName" />
    <bean id="userService1" class="com.ofwiki.AutowireApplication.UserService"  />
    <bean id="dbDao" class="com.ofwiki.AutowireApplication.UserDao" />
</beans>
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.util.Assert;

public class AutowireApplication {
    public static void main(String[] args) {
        new ClassPathXmlApplicationContext("spring-default-autowire.xml")
                .getBean(UserService.class).save();
    }

    public static class UserService {
        private UserDao dbDao;
        public void setDbDao(UserDao dbDao) {
            this.dbDao = dbDao;
        }
        public void save() {
            Assert.notNull(dbDao, "dbDao field is null");
            System.out.println("UserService:save user info");
            dbDao.save();
        }
    }
    public static class UserDao {
        public void save() {
            System.out.println("UserDao:save user info");
        }
    }
}