本文是看W3Cschool教程所写
1.Spring中提供的两种装配方式
- 手动装配:以value或ref的方式来明确指定属性值都是手动装配
- 自动装配:根据bean标签的autowire属性指定的装配规则,不需要明确指定,Spring自动把匹配的属性值注入bean中
自动装配的规则,即autowire的属性值有:
- no或default:不自动装配
- byName:根据bean的属性名自动装配,以当前bean的属性名作为id从IOC容器中寻找以实现装配。找到则装配,找不到则不装配
- byType:根据bean属性类型自动装配,找到一个则装配,找到多个则报错,找不到则不装配
2.对于自动装配的初步介绍
在前面几篇博客中,我们已经知道了如何使用元素来声明 bean 和通过使用 XML 配置文件中的和元素来注入 。Spring 容器可以在不使用和 元素的情况下自动装配相互协作的 bean 之间的关系,这有助于减少编写一个大的基于 Spring 的应用程序的 XML 配置的数量。
2.1自动装配模式
可以使用元素的 autowire 属性为一个 bean 定义指定自动装配模式。
模式 | 描述 |
---|---|
no | 这是默认的设置,它意味着没有自动装配,你应该使用显式的bean引用来连线。你不用为了连线做特殊的事。在依赖注入章节你已经看到这个了。 |
byName | 由属性名自动装配。Spring 容器看到在 XML 配置文件中 bean 的自动装配的属性设置为 byName。然后尝试匹配,并且将它的属性与在配置文件中被定义为相同名称的 beans 的属性进行连接。 |
byType | 由属性数据类型自动装配。Spring 容器看到在 XML 配置文件中 bean 的自动装配的属性设置为 byType。然后如果它的类型匹配配置文件中的一个确切的 bean 名称,它将尝试匹配和连接属性的类型。如果存在不止一个这样的 bean,则一个致命的异常将会被抛出。 |
constructor | 类似于 byType,但该类型适用于构造函数参数类型。如果在容器中没有一个构造函数参数类型的 bean,则一个致命错误将会发生。 |
autodetect(3.0版本不支持) | Spring首先尝试通过 constructor 使用自动装配来连接,如果它不执行,Spring 尝试通过 byType 来自动装配。 |
可以使用 byType 或者 constructor 自动装配模式来连接数组和其他类型的集合。
2.2 自动装配的局限性
限制 | 描述 |
---|---|
重写的可能性 | 你可以使用总是重写自动装配的 <constructor-arg>和 <property> 设置来指定依赖关系。 |
原始数据类型 | 你不能自动装配所谓的简单类型包括基本类型,字符串和类。 |
混乱的本质 | 自动装配不如显式装配精确,所以如果可能的话尽可能使用显式装配。 |
3.Spring自动装配语法及规则
- 在bean标签添加属性:Autowire就可以了
- byName
- 对象中属性和容器中的beanid进行匹配,如果属性名和beanid一致,则自动装配
- byType
- 对象中的属性类型与容器中bean的class进行匹配,如果唯一匹配则自动装配
- 匹配0个:未装配
- 匹配多个:会报错
- byName
- 基于XML的方式,只能装配非字面量的值
4.Spring自动装配 byName
- 由属性名称指定指定自动装配
5.Spring自动装配byType
- 由属性类型指定指定自动装配
- 比如:在配置文件中,有一个bean定义设置为自动装配byType,并且包含SpellChecker类型的spellChecker属性
- 那么Spring就会查找类型为SpellChecker的bean,并且用它来设置这个属性
- 我们仍然可以使用property标签来连接其他属性
6.总结
- 基于XML自动装配,底层使用set注入
- 不建议使用byName,byType
- 建议使用注解的方式自动装配