0x01 描述
Bean定义可以包含很多的配置信息
包括构造函数的参数,属性值,容器的具体信息例如初始化方法,静态工厂方法名等等...
子Bean的定义继承父定义的配置数据
子定义可以根据需要重写一些值,或者添加其它值
Spring Bean定义的继承与Java类的继承无关,但是继承的概念是一样的
你可以定义一个父Bean的定义作为模板和其他子Bean就可以从父Bean中继承所需的配置
当你使用基于XML的配置元数据时,通过使用父属性,指定父Bean作为该属性的值来表明子Bean的定义
0x02 小例子
0x02.1 定义继承例子
// 第一步
// 创建个基础父类,用来被其它类继承
// 目录: ./SpringDemo/src/main/java/com/test/Bean定义继承/
// 文件名: Hello.java
package com.test.Bean定义继承;
public class Hello {
private String message1;
private String message2;
public void setMessage1(String message) {
this.message1 = message;
}
public void setMessage2(String message) {
this.message2 = message;
}
public void getMessage1() {
System.out.println("Hello-Message1: " + message1);
}
public void getMessage2() {
System.out.println("Hello-Message2: " + message2);
}
}
// 第二步
// 创建个普通类,准备用来继承Hello类
// 目录: ./SpringDemo/src/main/java/com/test/Bean定义继承/
// 文件名: Hello.java
package com.test.Bean定义继承;
public class HelloChina {
private String message1;
private String message2;
private String message3;
public void setMessage1(String message) {
this.message1 = message;
}
public void setMessage2(String message) {
this.message2 = message;
}
public void setMessage3(String message) {
this.message3 = message;
}
public void getMessage1() {
System.out.println("HelloChina-Message1: " + message1);
}
public void getMessage2() {
System.out.println("HelloChina-Message2: " + message2);
}
public void getMessage3() {
System.out.println("HelloChina-Message3: " + message3);
}
}
// 第三步
// 创建个applicationContext4.xml文件
// 在该配置文件中,hello的Bean定义了两个属性message1和message2
// 然后,helloChina的Bean定义了两个属性message1与message3
// 接着使用parent属性把helloChina的Bean定义为hello的Bean的子类
// helloChina这个子Bean继承hello的Bean的message2的属性,重写message1的属性
// 这里提供一个配置好的applicationContext4.xml文件
// 目录: ./SpringDemo/src/main/resources/
// 文件名: applicationContext4.xml
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="hello" class="com.test.Bean定义继承.Hello">
<property name="message1" value="你好!"/>
<property name="message2" value="第二次说,你好!"/>
</bean>
<bean id="helloChina" class="com.test.Bean定义继承.HelloChina" parent="hello">
<property name="message1" value="你好,中国!"/>
<property name="message3" value="第三次说,你好中国!"/>
</bean>
</beans>
// 第四步
// 创建一个测试类Test11进行测试
// 目录: ./SpringDemo/src/test/java/
// 文件名: Test11.java
import com.test.Bean定义继承.Hello;
import com.test.Bean定义继承.HelloChina;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test11 {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext4.xml");
Hello objA = (Hello) context.getBean("hello");
objA.getMessage1();
objA.getMessage2();
System.out.println("-------------------------------");
HelloChina objB = (HelloChina) context.getBean("helloChina");
objB.getMessage1();
objB.getMessage2();
objB.getMessage3();
}
}
// 运行结果
Hello-Message1: 你好!
Hello-Message2: 第二次说,你好!
-------------------------------
HelloChina-Message1: 你好,中国!
HelloChina-Message2: 第二次说,你好!
HelloChina-Message3: 第三次说,你好中国!
0x02.2 定义模板例子
你可以创建一个Bean定义模板,这样不需要花太多功夫它就可以被其他子Bean定义使用
注:
Bean模板自身不能被实例化,因为它是不完整的,而且它也被明确地标记为抽象的
当一个定义是抽象的,它仅仅作为一个纯粹的模板Bean定义来使用的
// 第一步
// 创建个普通类,准备用来继承Bean模板
// 目录: ./SpringDemo/src/main/java/com/test/Bean定义模板/
// 文件名: HelloAmerica.java
package com.test.Bean定义模板;
public class HelloAmerica {
private String message1;
private String message2;
private String message3;
public void setMessage1(String message) {
this.message1 = message;
}
public void setMessage2(String message) {
this.message2 = message;
}
public void setMessage3(String message) {
this.message3 = message;
}
public void getMessage1() {
System.out.println("HelloAmerica-Message1: " + message1);
}
public void getMessage2() {
System.out.println("HelloAmerica-Message2: " + message2);
}
public void getMessage3() {
System.out.println("HelloAmerica-Message3: " + message3);
}
}
// 第二步
// 创建个applicationContext5.xml文件
// 在该配置文件中创建了个beanTemplate的Bean
// 并且定义了三个属性message1和message2与message3
// 然后,helloAmerica的Bean定义了两个属性message1与message3
// 接着使用parent属性把helloAmerica的Bean定义为beanTemplate的Bean的子类
// helloAmerica这个子Bean继承beanTemplate的Bean的message2的属性,重写message1与message3的属性
// 这里提供一个配置好的applicationContext5.xml文件
// 目录: ./SpringDemo/src/main/resources/
// 文件名: applicationContext5.xml
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="beanTemplate" abstract="true">
<property name="message1" value="你好,世界!"/>
<property name="message2" value="第二次说,你好!"/>
<property name="message3" value="第三次说,你好!"/>
</bean>
<bean id="helloAmerica" class="com.test.Bean定义模板.HelloAmerica" parent="beanTemplate">
<property name="message1" value="你好,美国!"/>
<property name="message3" value="第三次说,你好美国!"/>
</bean>
</beans>
// 第三步
// 创建一个测试类Test12进行测试
// 目录: ./SpringDemo/src/test/java/
// 文件名: Test12.java
import com.test.Bean定义模板.HelloAmerica;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test12 {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext5.xml");
HelloAmerica obj = (HelloAmerica) context.getBean("helloAmerica");
obj.getMessage1();
obj.getMessage2();
obj.getMessage3();
}
}
// 运行结果
HelloAmerica-Message1: 你好,美国!
HelloAmerica-Message2: 第二次说,你好!
HelloAmerica-Message3: 第三次说,你好美国!