你的位置:首页 > 信息动态 > 新闻中心
信息动态
联系我们

【java bean】bean的继承

2021/12/18 21:10:58

如果两个bean定义比较类似,那么我们可以选择将其中一个bean继承自另外一个bean,然后在此基础上添加或者重写标签,增加复用性。
为了演示,我们定义两个类
人类:

public class People
{
    private String name;

    public String getName() {
        return name;
    }

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

    @Override
    public String toString() {
        return "People{" +
                "name='" + name + '\'' +
                '}';
    }
}

老师类:

public class Teacher
{
    private String name;
    private int salary;

    public String getName() {
        return name;
    }

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

    public int getSalary() {
        return salary;
    }

    public void setSalary(int salary) {
        this.salary = salary;
    }

    @Override
    public String toString() {
        return "Teacher{" +
                "name='" + name + '\'' +
                ", salary=" + salary +
                '}';
    }
}

可以看到两个类属性比较相似,老师类只是多了一个薪水属性,所以我们定义bean的时候没必要两个都一一定义,老师类的bean可以继承人类,然后在此基础上再定义一个薪水属性。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="people" class="upc.yqs.People">
        <property name="name" value="a people"></property>
    </bean>
    <bean id="teacher1" class="upc.yqs.Teacher" parent="people">
        <property name="salary" value="5000"></property>
    </bean>
    <bean id="teacher2" class="upc.yqs.Teacher" parent="people">
        <property name="name" value="a teacher"></property>
        <property name="salary" value="7000"></property>
    </bean>
</beans>

可以看到teacher1和teacher2都继承了people,teacher1新增了一个salary属性,由于没重写name属性,所以name就沿用了people的name。teacher2不仅新增了salary属性,还重写了name。
接下来写一个测试方法:

import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class InheritTest
{
    ApplicationContext context;

    @Before
    public void getContext() {
        context = new ClassPathXmlApplicationContext("people_and_teacher.xml");
    }

    @Test
    public void InheritTest()
    {
        People people=(People) context.getBean("people");
        Teacher teacher1=(Teacher) context.getBean("teacher1");
        Teacher teacher2=(Teacher) context.getBean("teacher2");
        System.out.println(people);
        System.out.println(teacher1);
        System.out.println(teacher2);
    }
}

输出结果:

People{name='a people'}
Teacher{name='a people', salary=5000}
Teacher{name='a teacher', salary=7000}

说到继承,如果有多个bean都有很多共同的标签,那么我们可以定义一个模板bean,专门用来当模板,如果想要定义模板bean的话,我们要设置abstract=“true”,表示这个bean是抽象的,这和java中的抽象类很相似。如果一个bean被定义为抽象的,那么spring就不会实例化它了,而是忽略它。
比如这样:

<bean id="teacher_template" class="upc.yqs.People" abstract="true">
    <property name="name" value="teacher"></property>
</bean>