0x01 描述
Bean定义可以包含很多的配置信息包括构造函数的参数,属性值,容器的具体信息例如初始化方法,静态工厂方法名等等...子Bean的定义继承父定义的配置数据子定义可以根据需要重写一些值,或者添加其它值Spring Bean定义的继承与Java类的继承无关,但是继承的概念是一样的你可以定义一个父Bean的定义作为模板和其他子Bean就可以从父Bean中继承所需的配置当你使用基于XML的配置元数据时,通过使用父属性,指定父Bean作为该属性的值来表明子Bean的定义
0x02 小例子
0x02.1 定义继承例子
// 第一步// 创建个基础父类,用来被其它类继承// 目录: ./SpringDemo/src/main/java/com/test/Bean定义继承/// 文件名: Hello.javapackage 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.javapackage 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.javaimport 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.javapackage 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.javaimport 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: 第三次说,你好美国!