如果两个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>
