如题,在spring框架中有时候需要非常显式的指明你要注入的bena。那我们是不是也可以自动的来配置这些bean。spring框架中有四种自动装配的方式。如byname、bytype、constructor、autodetect等四种方式。
byname----把与bean的属性名字相同的(或者id)的其他bean自动装配到bean的对应属性中。如果没有相对应的属性则不装配。
bytype-------把与bean的类型相同的其他bean自动装配到bean的对应属性中。如果没有相对应的属性则不装配。
constructor------把与bean的构造器入参具有相同类型的其他bean自动装配到bean构造器对应入参中。
autodetect-------这种类型是会先尝试用constructor方式装配。如失败则会用bytype进行自动装配.
1、 byname自动装配
在spring中、所有的东西都会有名字的属性。因此bean也会有名字。这些就像可以装配到属性中的bean一样。那是不是假如属性的名字刚好与bean的名字一样就可以自动装配到相对应的属性中呢。我可以先回顾一下之前注入bean的方式。配置代码如下
<bean in=user class="com.cnpxx.news.user">
<property name="name" value="xiaoming"/>
<property name="caid" ref="caid"/>
</bean>
在这里显式配置了user的caid属性。即指向了一个对象的引用。但是如果我们配置一个bean 的id属性跟这里的name属性一样了?
<bean id="caid" class="com.cnpxx.news.caid" />
这里id跟属性name的是一样的了。通过配置autowire属性、spring就可以利用此信息自动装配caid属性了。如下代码
<bean in=user class="com.cnpxx.news.user" autowire=“byname”>
<property name="name" value="xiaoming"/>
</bean>
byname自动装配遵循一项约定。就是会把跟属性跟id一样名字的bean进行自动装配。spring也会特殊的对待这些属性。当找到 跟属性一样的bean spring就会同setter注入来进行装配。2、bytype 自动装配
bytype自动装配的方式跟byname是一样的。不过bytype是匹配bean的类型。当通过设置autowire属性为bytype时spring容器为去匹配跟属性一样类型的bean。
但是bytype也有局限性。就是如果匹配的类型不是一个而是多个。spring这时是不会装配的。而是会直接报错。
所以为了解决这个问题就需要设置另外属性。即primary为true。但是默认的bean设置都是true.所以当有多个匹配的bean时。你要把优先要配置的bean设置为true其他的设置为false.
3、 constructor自动装配
那如果是通过构造器进行自动装配的话。在xml bean的配置里面把constructor属性删除。然后添加属性autowire为constructor即可。
如
<bean in=user class="com.cnpxx.news.user" autowire=“constructor”>
</bean>
spring会去审视user类的构造器入参的bean。如果是类型匹配的bean则进行装配。当然当有多个匹配bean时。sping是没办法去猜测谁更适合的。所以可以尝试另外一种装配方式,设置bean 的属性为autodetect时,spring就会优先使用constructor装配。如果没有匹配的则用bytype.
以上简明的讲述了自动装配的四种方式。之后补充使用注解进行自动装配bean的方式。