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");
}
}
}