Spring容器可以自动(autowire)关联协作(collaborating)bean。您可以通过检查ApplicationContext的内容来允许Spring自动解析您的bean的协作者(其他bean)。autowiring具有以下优点:
- 自动装配可以显着减少指定属性或构造函数参数的需要。
- 自动装配可以随着对象的发展而更新配置。例如,如果您需要向类添加依赖关系,则可以自动满足该依赖关系,而无需修改配置。因此,自动装配在开发过程中特别有用,而在代码库变得更加稳定时,无需切换到显式autowiring 。
当使用基于XML的配置元数据[2]时,您可以使用<bean />元素的autowire属性为bean定义指定自动连接模式。自动连线功能有四种模式。您可以指定每个bean的自动布线,因此可以选择要自动连线的。
Table 7.2. Autowiring modes
Mode | Explanation |
---|---|
no | (默认)无自动接线。 Bean引用必须通过ref元素定义。不建议更改默认设置用于较大的部署,因为明确指定协作者可以更好地控制和清晰。在某种程度上,它记录了系统的结构。 |
byNa me | 按属性名称自动装配。Spring会找到一个与需要自动连线的属性名称相同的bean。例如,如果bean定义通过名称设置为autowire,并且它包含master属性(即具有setMaster(..)方法),Spring寻找一个名为master的bean定义,并使用它来设置属性。 |
byType | 如果容器中存在属性类型的一个bean,则允许属性自动连接。如果存在多个,则会抛出一个致命异常,这表示您可能不会对该bean使用byType自动连线。如果没有匹配的bean,没有任何反应;该属性未设置。 |
constructor | 类似于byType,但适用于构造函数参数。如果在容器中没有一个构造函数参数类型的bean,则会引起致命错误。 |
使用byType或构造函数自动布线模式,可以对数组和类型集合进行连线。在这种情况下,提供符合预期类型的容器内的所有自动连线候选者以满足依赖性。果预期的键类型为String,则可以自动连接强类型的Maps。自动连线的地图值将包含与预期类型相匹配的所有bean实例,Maps键将包含相应的bean名称。
您可以将autowire行为与依赖关系检查相结合,这是自动连线完成后执行的。
Autowiring的局限性和缺点
- 属性和构造器参数设置中的显式依赖性总是覆盖自动布线。您不能自动连接所谓的简单属性,例如基元,字符串和类(以及这些简单属性的数组)。这个限制是按设计。
- autowiring不如显式接线精确。尽管如上表所示,虽然Spring很小心避免在可能出现意想不到的结果的歧义的情况下进行猜测,但是您的Spring管理对象之间的关系不再被明确记录。
- 对于可能会从Spring容器生成文档的工具可能无法使用接线信息。
- 容器中的多个bean定义可以匹配由setter方法指定的类型或构造函数参数以进行自动连线。对于数组,集合或地图,这不一定是一个问题。然而,对于期望单个值的依赖性,这种模糊性不是任意解决的。然而,对于期望单个值的依赖性,这种模糊性不是任意解决的。如果没有唯一的bean定义可用,则抛出异常。
从自动装配中排除一个bean
在每个bean的基础上,您可以将bean从自动装配中排除。在Spring的XML格式中,将<bean />元素的autowire-candidate属性设置为false;容器使特定的bean定义不可用于自动布线基础架构(包括注释样式配置,例如@Autowired)。