一、关于Bean的继承

在之前的系列文章中,我们已经学会了如何定义一个spring的bean,在bean的定义中,我们可以为bean指定很多的 配置信息,包括构造器参数(constructor arguments),属性值(property values),指定的初始化回调方法(initialization method)等等。 如果一个子bean继承父bean,那么子bean的配置信息将会从父bean中继承。当然,和java类的继承类似,子bean可以 重写父bean的值或者新增新的属性值等等。

这里主要介绍基于xml配置的bean继承,你只需要在bean中添加属性parent,属性的指指定父bean的id就行了。看下面 示例:

二、Bean的继承示例

xml配置文件:

 <bean id="User" class="sk.spring.tuto.demo3.User" >
     <property name="info" value="用户个人信息"/>
     <property name="name" value="sam"/>
 </bean>

 <bean id="VipUser" class="sk.spring.tuto.demo3.VipUser" parent="User">
     <property name="name" value="dan"/>
     <property name="level" value="1"/>
 </bean>

java类:

public class User{
    private String name;
    private String info;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void getInfo() {
        System.out.println("User info is:"+info);
    }

    public void setInfo(String info) {
        this.info = info;
    }

}

public class VipUser {
    private String name;
    private String info;
    private int level;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void getInfo() {
        System.out.println("VipUser info is:"+info);
    }

    public void setInfo(String info) {
        this.info = info;
    }

    public void getLevel() {
        System.out.println("Vip level is :" + level);
    }

    public void setLevel(int level) {
        this.level = level;
    }
}

测试类:

public class MainTest7 {
    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("UserBeans.xml");

        User user = (User) ctx.getBean("User");
        user.getInfo();


        VipUser vipUser = (VipUser) ctx.getBean("VipUser");
        vipUser.getInfo();
        vipUser.getLevel();

    }
}

上面的代码有两个类,一个是User表示普通用户,另一个是VipUser表示是会员用户,其中,会员用户的bean继承了 普通用户bean,我们看到VipUser多了属性level,而它们通用的属性是info(信息)。从测试代码中,运行结果:

User info is:用户个人信息

VipUser info is:用户个人信息

Vip level is :1

从结果可以看出虽然我们并没有在配置文件中指定VipUser的info信息,但是它继承了User bean的info,结果打印了。

三、Bean的模版定义

通过创建一个Bean的定义模版,通过定义好的模版,其它子bean可以轻松继承它的所有属性。 那么如何定义模版呢?很简单,你只需要在bean中指定abstract属性,并将值设置为true。并且, 不需要提供该bean对应的java类:

<bean id="beanTeamplate" abstract="true">
    <property name="name" value="全世界就这一个名字"/>
</bean>

<bean id="User" class="sk.spring.tuto.demo3.User" parent="beanTeamplate">
    <property name="info" value="用户个人信息"/>
</bean>

<bean id="VipUser" class="sk.spring.tuto.demo3.VipUser" parent="User">
    <property name="level" value="1"/>
</bean>

四、本篇小结

本篇简要介绍了Bean的继承以及如何定义一个Bean的定义模板。

参考:http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/overview.html

##文档信息