spring bean的自动装配
在spring框架应用场景中会有这么一种情况。一个bean在不同的使用类里面都要配置。这个bean相对来说是单独的。也就是说如果要装配这个bean.在不同的使用类里面都需要写相关的
注入代码。那有没有这么一种方式。可以通过配置自动的来注入bean到相关的属性中去。spring容器有这么四种自动装配的策略。 如byname、bytype、constructor、autodetect.
byname ---把与bean的属性名字(id)具有相同的名字的其他bean自动装配到bean相对应属性中。如果没有匹配的bean则不进行装配。
bytype ---把与bean的属性具有相同类型的其他bean自动装配到bean相对应属性中。如果没有匹配的bean则不进行装配
constructor---把与bean的构造器入参具有相同类型的其他bean注入到相对应的构造器入参中。
autodetect---这种方式是会优先使用constructor进行注入。不行则使用bytype.
下面详细讲解这些注入方式
1、 byname是把与bean的属性名字(id)具有相同的名字的其他bean自动装配到bean相对应属性中。如果没有匹配的bean则不进行装配。我们在之前配置的bean的方式如下
<bean id="user" calss="com.cnpxx.news.user">
<property name="age" value="1"/>
<property name="caid" ref="caid"/>
</bean>
这里显示配置了caid属性。如果我们配置一个跟caid属性一样名字的bean。如
<bean id="caid" class="com.cnpxx.news.caid"/>
通过配置autowire属性为byname。spring会利用此信息进行自动装配。同时byname自动装配会遵循一个约定。就是为属性自动装配跟属性ID或则名字一样的bean.
在这里spring会发现caid属性一样名字的bean通过setter方式进行装配。如果没有,则不装配。代码如
<bean id="user" calss="com.cnpxx.news.user" autowire="byname">
<property name="age" value="1"/>
</bean>
2、 bytype的注入方式是跟byname一样的。只是bytype匹配的是bean的类型。在当bean的属性与需要注入的其他bean是匹配的类型的时。spring将会进行自动装配。
代码如
<bean id="user" calss="com.cnpxx.news.user" autowire="bytype">
<property name="age" value="1"/>
</bean>
但是bytype也有局限性。当与bean的属性匹配的类型多余一个的时候。spring是不会自己做出选择。而是抛出异常。
所以在这个时候需要设置另外一个属性primary为true。但是spring默认情况下primary都为true。所以当你确定一个为优先装配的bean时设为true。其他设为false.
3、 constructor是构造器注入方式。当使用这种注入方式时直接把<constructor/>属性删除。设置autowire为constructor。
<bean id="user" calss="com.cnpxx.news.user" autowire="constructor">
</bean>
spring会去审视user类的构造器。当有跟构造器入参一样的类型的bean时。spring将进行自动装配。constructor是构造器注入方式跟bytype一样的局限性。
即当有匹配的类型有多个时。spring就无从选择。
4、autodetect注入方式应该算是比较好的注入策略。他会优先适用constructor进行注入。不行则用bytype方式。
以上是spring自动进行装配的几种策略。可以自己根据实际情况进行使用。如有不恰当的地方还请指正。感谢!
在spring框架应用场景中会有这么一种情况。一个bean在不同的使用类里面都要配置。这个bean相对来说是单独的。也就是说如果要装配这个bean.在不同的使用类里面都需要写相关的
注入代码。那有没有这么一种方式。可以通过配置自动的来注入bean到相关的属性中去。spring容器有这么四种自动装配的策略。 如byname、bytype、constructor、autodetect.
byname ---把与bean的属性名字(id)具有相同的名字的其他bean自动装配到bean相对应属性中。如果没有匹配的bean则不进行装配。
bytype ---把与bean的属性具有相同类型的其他bean自动装配到bean相对应属性中。如果没有匹配的bean则不进行装配
constructor---把与bean的构造器入参具有相同类型的其他bean注入到相对应的构造器入参中。
autodetect---这种方式是会优先使用constructor进行注入。不行则使用bytype.
下面详细讲解这些注入方式
1、 byname是把与bean的属性名字(id)具有相同的名字的其他bean自动装配到bean相对应属性中。如果没有匹配的bean则不进行装配。我们在之前配置的bean的方式如下
<bean id="user" calss="com.cnpxx.news.user">
<property name="age" value="1"/>
<property name="caid" ref="caid"/>
</bean>
这里显示配置了caid属性。如果我们配置一个跟caid属性一样名字的bean。如
<bean id="caid" class="com.cnpxx.news.caid"/>
通过配置autowire属性为byname。spring会利用此信息进行自动装配。同时byname自动装配会遵循一个约定。就是为属性自动装配跟属性ID或则名字一样的bean.
在这里spring会发现caid属性一样名字的bean通过setter方式进行装配。如果没有,则不装配。代码如
<bean id="user" calss="com.cnpxx.news.user" autowire="byname">
<property name="age" value="1"/>
</bean>
2、 bytype的注入方式是跟byname一样的。只是bytype匹配的是bean的类型。在当bean的属性与需要注入的其他bean是匹配的类型的时。spring将会进行自动装配。
代码如
<bean id="user" calss="com.cnpxx.news.user" autowire="bytype">
<property name="age" value="1"/>
</bean>
但是bytype也有局限性。当与bean的属性匹配的类型多余一个的时候。spring是不会自己做出选择。而是抛出异常。
所以在这个时候需要设置另外一个属性primary为true。但是spring默认情况下primary都为true。所以当你确定一个为优先装配的bean时设为true。其他设为false.
3、 constructor是构造器注入方式。当使用这种注入方式时直接把<constructor/>属性删除。设置autowire为constructor。
<bean id="user" calss="com.cnpxx.news.user" autowire="constructor">
</bean>
spring会去审视user类的构造器。当有跟构造器入参一样的类型的bean时。spring将进行自动装配。constructor是构造器注入方式跟bytype一样的局限性。
即当有匹配的类型有多个时。spring就无从选择。
4、autodetect注入方式应该算是比较好的注入策略。他会优先适用constructor进行注入。不行则用bytype方式。
以上是spring自动进行装配的几种策略。可以自己根据实际情况进行使用。如有不恰当的地方还请指正。感谢!