当涉及自动装配Bean的依赖关系时,Spring有多种处理方式,因此,Spring提供了4种各具特色的自动装配策略。
1、byName——把与Bean的属性具有相同名字(或者ID)的其他Bean自动装配到Bean的对应属性中,如果没有跟属性的名字相匹配的Bean,则该属性不进行装配。
2、byType——把与Bean的属性具有相同类型的其他Bean自动装配到Bean的对应属性中,如果没有跟属性相匹配的Bean,则该属性不被装配。
3、constructor——把与Bean的构造器入参具有相同类型的其他Bean自动装配到Bean构造器对应入参中。
4、autodetect——首先先尝试使用constructor进行自动装配。如果失败,再尝试byType进行自动装配。
一、byName自动装配
Spring配置文件在声明Bean时加上autowire="byName",这样该Bean就不用声明instrument这个属性,它会在上下文中找到一个id为instrument的Bean来装配这个属性,输出结果正是我们想要的。
二、byType自动装配
byType自动装配的工作方式类似于byName自动装配,只不过不再是匹配属性的名字而是检查属性的类型。当我们尝试使用byType自动装配,Spring会寻找哪一个Bean的类型与属性的类型相匹配。
performer这个Bean的instrument属性是Instrument类,Guitar类实现Instrument类,这两个Bean相匹配,所以instrument会自动装配到performer中的instrument属性中。
但是byType自动装配存在一个局限性,如果Spring寻找到多个Bean,它们的类型与需要自动装配的属性的类型相匹配,怎么办呢?这种场景下,Spring不会猜测哪一个Bean更适合装配,而是选择抛出异常。为了避免因为使用byType自动装配带来的歧义,Spring为我们提供了另外两种选择。
一种是Primary="false",另一种是auto-wire-candidate="false",添加两者之一表示该Bean不作为候选装配的Bean
三、constructor自动装配
constructor自动装配时,Spring会在上下文找到跟构造器入参类型匹配的Bean进行注入,跟byType有点相像
四、最佳自动装配
autowire="autodetect"
五、默认自动装配
如果需要为Spring应用上下文中每个Bean配置相同autowire属性,那么就可以要求spring为它创建所有Bean应用相同的自动装配策略来简化配置。我们所需要的做的仅仅是在根元素<beans>上添加一个default-autowire属性
六、显式混合装配