Spring入门学习——继承Bean配置

来源:互联网 发布:淘宝最大的店铺2017 编辑:程序博客网 时间:2024/05/17 08:33
在Spring IoC容器中配置Bean时,可能拥有超过一个共享某些公用配置的Bean,比如属性和<bean>元素中的属性。往往会为多个Bean重复这些配置。Spring允许提取公用的Bean的配置组成一个父Bean。子Bean从父Bean中继承Bean配置,包括Bean属性和<bean>元素的属性,从而避免重复配置。但是应该注意,并不是所欲父<bean>元素中定义的属性都将被继承,例如autowire和dependency-check属性不会从父Bean中继承。

假设现在应用场景是,我们必须有两个序列号生成实例(其前缀,后缀,初始值均一致)。往往在没有使用继承Bean时,将会写多一次同样的bean配置,只是bean的id或者name不一样而已。但是使用继承Bean后,我们可以大大简化代码。
e.g.

<bean id="baseSequenceGenerator" class="com.cgy.springrecipes.sequence.SequenceGenerator">
<property name="prefixGenerator" ref="datePrefixGenerator" />
<property name="suffix" value="CGY" />
<property name="initial" value="10000" />
</bean>

<bean id="sequenceGenerator" parent="baseSequenceGenerator"/>

<bean id="sequenceGenerator1" parent="baseSequenceGenerator"/>

<bean id="datePrefixGenerator" class="com.cgy.springrecipes.sequence.DatePrefixGenerator">
<property name="pattern">
<value>yyyyMMdd</value>
</property>
</bean>

同样,我们可以在子Bean中对父Bean的一些属性进行覆盖。
e.g.

<bean id="sequenceGenerator1" parent="baseSequenceGenerator">
<property name="initial" value="20000"/>
</bean>

如果希望父Bean只是一个模板,而不能被实例使用,可以设置abstract属性。
e.g.

<bean id="baseSequenceGenerator" class="com.cgy.springrecipes.sequence.SequenceGenerator" abstract="true">
<property name="prefixGenerator" ref="datePrefixGenerator" />
<property name="suffix" value="CGY" />
<property name="initial" value="10000" />
</bean>

继承声明为abstract的Bean将会抛出

org.springframework.beans.factory.BeanIsAbstractException

*******************************************************************************************************************************************
当父Bean和子Bean不在同一类层次结构,但是都具有同名的属性时,可以忽略父Bean的class属性,同时设置为abstract属性为true,来抽取这个同名属性(有点不好理解),看以下代码

package com.cgy.springrecipes.sequence;

public class ReverseGenerator {
private int initial;//这个类与序列化类一样,都具有initial属性
public  void setInitial(int initial) {
this.initial = initial;s
}
}

此时,我们定一个没有class属性的父Bean,抽取这个initial属性

,<!--这里抽取了initial属性,这个bean是抽象的,没有class属性-->

<bean id="baseGenerator" abstract="true">
<property name="initial" value="100000"/>
</bean>


<!--这个是序列号Bean的父Bean,也是抽象的,继承了baseGenerator,获取了initial属性-->
<bean id="baseSequenceGenerator" abstract="true" parent="baseGenerator"
class="com.cgy.springrecipes.sequence.SequenceGenerator">
<property name="suffix" value="CGY"/>
<property name="prefixGenerator" ref="datePrefixGenerator"/>
</bean>


<!--这个是ReverseGenerator的Bean配置,继承了baseGenerator,获取了initial属性-->
<bean id="reverseGenerator" parent="baseGenerator"
class="com.cgy.springrecipes.sequence.ReverseGenerator">
</bean>

<!--这个是用于生成序列号实例的Bean,继承了baseSequenceGenerator,获取了initial,suffix,prefix,

等属性-->

<bean id="sequenceGenerator" parent="baseSequenceGenerator"/>

<bean id="datePrefixGenerator" class="com.cgy.springrecipes.sequence.DatePrefixGenerator">
<property name="pattern">
<value>yyyyMMdd</value>
</property>
</bean>

个人总结:巧妙地利用继承,可以简化一些经常重复的代码,抽取一些通用的属性,组成一个抽象父Bean,再加以继承,

可以减少配置文件的篇幅。


0 0