(http://www.cnblogs.com/cyjch/archive/2012/02/06/2340411.html)
1.在应用中,我们常常使用<ref>标签为JavaBean注入它依赖的对象,同时也Spring为我们提供了一个自动装配的机制,在定义Bean时,<bean>标签有一个autowire属性,我们可以通过指定它来让容器为受管JavaBean自动注入依赖对象。<bean>的autowire属性有如下六个取值,他们的说明如下:
1、 No:即不启用自动装配。Autowire默认的值。之所以它的默认值为NO,那是因为这会破坏模块关系的可读性,spring的reference也建议不用autoware,原文如下: Note: as has already been mentioned, for larger applications, it is discouraged to use autowiring because it removes the transparency and the structure from your collaborating classes.
2、 byName:根据属性名自动装配。此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自动装配。 如: <bean id="userManagerTarget" autowire="byName"> <property name="baseDAO"/> </bean> 这样对于bean userManagerTarget的属性baseDAO,spring就会自动去引用同名的bean,也就是上面的声明和下面是等价的: <bean id="userManagerTarget" autowire="no"> <property name="baseDAO"> <ref local="baseDAO"/> </property> </bean>
3、 byType:如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配;如果存在多个该类型bean,那么抛出异常,并指出不能使用byType方式进行自动装配;如果没有找到相匹配的bean,则什么事都不发生,也可以通过设置dependency-check="objects"让Spring抛出异常。
4、 constructor:与byType方式类似,不同之处在于它应用于构造器参数。如果容器中没有找到与构造器参数类型一致的bean, 那么抛出异常。 reference原文是: This is analogous to byType, but applies to constructor arguments. If there isn't exactly one bean of the constructor argument type in the bean factory, a fatal error is raised.
5、 autodetect:通过bean类的内省机制(introspection)来决定是使用constructor还是byType方式进行自动装配。如果发现默认的构造器,那么将使用byType方式,否则采用 constructor。 原文如下: Chooses constructor or byType through introspection of the bean class. If a default constructor is found, byType gets applied.
6、 default:由上级标签<beans>的default-autowire属性确定。
注意:在配置bean时,<bean>标签中Autowire属性的优先级比其上级标签高,即是说,如果在上级标签中定义default-autowire属性为byName,而在<bean>中定义为byType时,Spring IoC容器会优先使用<bean>标签的配置。
小结:使用自动装配,配置文件简洁了许多。但是,自动装配并不是十全十美的,我们不论是使用byName还是byType的方法,Spring不一定就能很准确的为我们找到JavaBean依赖的对象。在这种情况下,你务必遵守javabean的命名规范,另外,如果使用自动装配,Spring配置文件的可读性也大大降低,我们不能很容易的看出个bean之间的依赖关系,这也在一定程度上降低了程序可维护性;也容易造成潜在的错误,比如说通过byName来装配,如果将属性 名字改了后,Spring就不会将其自动装配给Bean的属性了。
因此在使用自动装配时,应当权衡利弊,合理的与ref的方法相结合,尽量在降低工作量的同时,保证应用的可维护度。但是spring的reference还是不推荐在定义中用这个功能
===========================================================================
链接:http://www.zhihu.com/question/29969524/answer/46245598
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
&lt;img src="https://pic2.zhimg.com/79f82210edf23d5757cb424a920edf99_b.jpg" data-rawwidth="1183" data-rawheight="317" class="origin_image zh-lightbox-thumb" width="1183" data-original="https://pic2.zhimg.com/79f82210edf23d5757cb424a920edf99_r.jpg"&gt;如果 bean 的 autowire 模式指定为 byName: 如果 bean 的 autowire 模式指定为 byName:
Spring 为这个 bean 注入 property 时,会从容器内查找和该 property 同名的 bean 作为 property value 自动注入,当然,这个 property 必须有对应的 setter.
注意:实际开发时,并不推荐使用 autowire byName. 一旦名称发生修改,就会注入失败,不利于维护,推荐显式注入(explicit injection)
一般情况下我会优先使用byName 因为根据类型寻找实现就意味着不能在一个容器中提供多个相同类型的bean了 所以byName在我看来是更具体的使用方式