spring IoC容器可以自动装配(autowire)来协作bean之间的相互联系。
autowire一共有五种类型。由于autowire可以针对单个bean进行设置,因此可以让有些bean使用autowire,有些bean不采用。autowire的方便之处在减少或者消除属性或构造器参数的设置,这样可以减少我们的配置文件。
no
不采用自动装配
byName
根据属性名自动装配。此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自动装配。
例如,在bean定义中将autowire设置为by name,而该bean包含master属性(同时提供setMaster(..)方法),Spring就会查找名为master的bean定义,并用它来装配给master属性。
byType
如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配。如果存在多个该类型的bean,那么将会抛出异常,并指出不能使用byType方式进行自动装配。若没有找到相匹配的bean,则什么事都不发生,属性也不会被设置。如果你不希望这样,那么可以通过设置dependency-check=”objects”让Spring抛出异常。
constructor
与byType的方式类似,不同之处在于它应用于构造器参数。如果在容器中没有找到与构造器参数类型一致的bean,那么将会抛出异常。
autodetect
通过bean类的自省机制(introspection)来决定是使用constructor还是byType方式进行自动装配。如果发现默认的构造器,那么将使用byType方式。
注意:
如果直接使用property和constructor-arg注入依赖的话,那么将总是覆盖自动装配。
目前不支持简单类型(基本类型、String、Class以及简单类型的数组)的自动装配。
byType和constructor自动装配模式也可用于数组和指定类型的集合。在这种情况下容器中的所有匹配的自动装配对象将被用于满足各种依赖。
自动装配还可以与依赖检查结合使用,这样依赖检查将在自动装配完成之后被执行。
自动装配的优点:
自动装配能显著减少配置的数量。
自动装配可以使配置与java代码同步更新。因此强烈推荐在开发过程中采用自动装配,而在系统趋于稳定的时候改为显式装配的方式。
自动装配的缺点:
装配不明确可能出现难以预料的结果,而且Spring所管理的对象之间的关联关系也不再能清晰的进行文档化。
对于那些根据Spring配置文件生成文档的工具来说,自动装配将会使这些工具没法生成依赖信息。
-
当根据类型进行自动装配的时候,容器中可能存在多个bean定义跟自动装配的setter方法和构造器参数类型匹配。如果bean定义不唯一,装配时就会抛出异常,面对这种场景我们有几个方案进行选择:
- 第一个方案就是弃自动装配而改用显式装配;
- 第二个方案就是在bean定义中通过设置’autowire-candidate’属性为’false’来将该bean排除在自动装配候选名单之外;
- 第三个方案是通过在bean定义中设置’primary’属性为’true’来将该bean设置为首选自动装配bean。最后,对于使用Java 5的用户来说,可能会使用注解的形式来配置bean。