spring bean的自动装配

                        如题,在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的方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值