0x01 描述

  1. Bean定义可以包含很多的配置信息
  2. 包括构造函数的参数,属性值,容器的具体信息例如初始化方法,静态工厂方法名等等...
  3. Bean的定义继承父定义的配置数据
  4. 子定义可以根据需要重写一些值,或者添加其它值
  5. Spring Bean定义的继承与Java类的继承无关,但是继承的概念是一样的
  6. 你可以定义一个父Bean的定义作为模板和其他子Bean就可以从父Bean中继承所需的配置
  7. 当你使用基于XML的配置元数据时,通过使用父属性,指定父Bean作为该属性的值来表明子Bean的定义

0x02 小例子

0x02.1 定义继承例子

  1. // 第一步
  2. // 创建个基础父类,用来被其它类继承
  3. // 目录: ./SpringDemo/src/main/java/com/test/Bean定义继承/
  4. // 文件名: Hello.java
  5. package com.test.Bean定义继承;
  6. public class Hello {
  7. private String message1;
  8. private String message2;
  9. public void setMessage1(String message) {
  10. this.message1 = message;
  11. }
  12. public void setMessage2(String message) {
  13. this.message2 = message;
  14. }
  15. public void getMessage1() {
  16. System.out.println("Hello-Message1: " + message1);
  17. }
  18. public void getMessage2() {
  19. System.out.println("Hello-Message2: " + message2);
  20. }
  21. }
  1. // 第二步
  2. // 创建个普通类,准备用来继承Hello类
  3. // 目录: ./SpringDemo/src/main/java/com/test/Bean定义继承/
  4. // 文件名: Hello.java
  5. package com.test.Bean定义继承;
  6. public class HelloChina {
  7. private String message1;
  8. private String message2;
  9. private String message3;
  10. public void setMessage1(String message) {
  11. this.message1 = message;
  12. }
  13. public void setMessage2(String message) {
  14. this.message2 = message;
  15. }
  16. public void setMessage3(String message) {
  17. this.message3 = message;
  18. }
  19. public void getMessage1() {
  20. System.out.println("HelloChina-Message1: " + message1);
  21. }
  22. public void getMessage2() {
  23. System.out.println("HelloChina-Message2: " + message2);
  24. }
  25. public void getMessage3() {
  26. System.out.println("HelloChina-Message3: " + message3);
  27. }
  28. }
  1. // 第三步
  2. // 创建个applicationContext4.xml文件
  3. // 在该配置文件中,hello的Bean定义了两个属性message1和message2
  4. // 然后,helloChina的Bean定义了两个属性message1与message3
  5. // 接着使用parent属性把helloChina的Bean定义为hello的Bean的子类
  6. // helloChina这个子Bean继承hello的Bean的message2的属性,重写message1的属性
  7. // 这里提供一个配置好的applicationContext4.xml文件
  8. // 目录: ./SpringDemo/src/main/resources/
  9. // 文件名: applicationContext4.xml
  10. <?xml version="1.0" encoding="UTF-8"?>
  11. <beans xmlns="http://www.springframework.org/schema/beans"
  12. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  13. xsi:schemaLocation="http://www.springframework.org/schema/beans
  14. https://www.springframework.org/schema/beans/spring-beans.xsd">
  15. <bean id="hello" class="com.test.Bean定义继承.Hello">
  16. <property name="message1" value="你好!"/>
  17. <property name="message2" value="第二次说,你好!"/>
  18. </bean>
  19. <bean id="helloChina" class="com.test.Bean定义继承.HelloChina" parent="hello">
  20. <property name="message1" value="你好,中国!"/>
  21. <property name="message3" value="第三次说,你好中国!"/>
  22. </bean>
  23. </beans>
  1. // 第四步
  2. // 创建一个测试类Test11进行测试
  3. // 目录: ./SpringDemo/src/test/java/
  4. // 文件名: Test11.java
  5. import com.test.Bean定义继承.Hello;
  6. import com.test.Bean定义继承.HelloChina;
  7. import org.springframework.context.ApplicationContext;
  8. import org.springframework.context.support.ClassPathXmlApplicationContext;
  9. public class Test11 {
  10. public static void main(String[] args) {
  11. ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext4.xml");
  12. Hello objA = (Hello) context.getBean("hello");
  13. objA.getMessage1();
  14. objA.getMessage2();
  15. System.out.println("-------------------------------");
  16. HelloChina objB = (HelloChina) context.getBean("helloChina");
  17. objB.getMessage1();
  18. objB.getMessage2();
  19. objB.getMessage3();
  20. }
  21. }
  22. // 运行结果
  23. Hello-Message1: 你好!
  24. Hello-Message2: 第二次说,你好!
  25. -------------------------------
  26. HelloChina-Message1: 你好,中国!
  27. HelloChina-Message2: 第二次说,你好!
  28. HelloChina-Message3: 第三次说,你好中国!

0x02.2 定义模板例子

  1. 你可以创建一个Bean定义模板,这样不需要花太多功夫它就可以被其他子Bean定义使用
  2. 注:
  3. Bean模板自身不能被实例化,因为它是不完整的,而且它也被明确地标记为抽象的
  4. 当一个定义是抽象的,它仅仅作为一个纯粹的模板Bean定义来使用的
  1. // 第一步
  2. // 创建个普通类,准备用来继承Bean模板
  3. // 目录: ./SpringDemo/src/main/java/com/test/Bean定义模板/
  4. // 文件名: HelloAmerica.java
  5. package com.test.Bean定义模板;
  6. public class HelloAmerica {
  7. private String message1;
  8. private String message2;
  9. private String message3;
  10. public void setMessage1(String message) {
  11. this.message1 = message;
  12. }
  13. public void setMessage2(String message) {
  14. this.message2 = message;
  15. }
  16. public void setMessage3(String message) {
  17. this.message3 = message;
  18. }
  19. public void getMessage1() {
  20. System.out.println("HelloAmerica-Message1: " + message1);
  21. }
  22. public void getMessage2() {
  23. System.out.println("HelloAmerica-Message2: " + message2);
  24. }
  25. public void getMessage3() {
  26. System.out.println("HelloAmerica-Message3: " + message3);
  27. }
  28. }
  1. // 第二步
  2. // 创建个applicationContext5.xml文件
  3. // 在该配置文件中创建了个beanTemplate的Bean
  4. // 并且定义了三个属性message1和message2与message3
  5. // 然后,helloAmerica的Bean定义了两个属性message1与message3
  6. // 接着使用parent属性把helloAmerica的Bean定义为beanTemplate的Bean的子类
  7. // helloAmerica这个子Bean继承beanTemplate的Bean的message2的属性,重写message1与message3的属性
  8. // 这里提供一个配置好的applicationContext5.xml文件
  9. // 目录: ./SpringDemo/src/main/resources/
  10. // 文件名: applicationContext5.xml
  11. <?xml version="1.0" encoding="UTF-8"?>
  12. <beans xmlns="http://www.springframework.org/schema/beans"
  13. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  14. xsi:schemaLocation="http://www.springframework.org/schema/beans
  15. https://www.springframework.org/schema/beans/spring-beans.xsd">
  16. <bean id="beanTemplate" abstract="true">
  17. <property name="message1" value="你好,世界!"/>
  18. <property name="message2" value="第二次说,你好!"/>
  19. <property name="message3" value="第三次说,你好!"/>
  20. </bean>
  21. <bean id="helloAmerica" class="com.test.Bean定义模板.HelloAmerica" parent="beanTemplate">
  22. <property name="message1" value="你好,美国!"/>
  23. <property name="message3" value="第三次说,你好美国!"/>
  24. </bean>
  25. </beans>
  1. // 第三步
  2. // 创建一个测试类Test12进行测试
  3. // 目录: ./SpringDemo/src/test/java/
  4. // 文件名: Test12.java
  5. import com.test.Bean定义模板.HelloAmerica;
  6. import org.springframework.context.ApplicationContext;
  7. import org.springframework.context.support.ClassPathXmlApplicationContext;
  8. public class Test12 {
  9. public static void main(String[] args) {
  10. ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext5.xml");
  11. HelloAmerica obj = (HelloAmerica) context.getBean("helloAmerica");
  12. obj.getMessage1();
  13. obj.getMessage2();
  14. obj.getMessage3();
  15. }
  16. }
  17. // 运行结果
  18. HelloAmerica-Message1: 你好,美国!
  19. HelloAmerica-Message2: 第二次说,你好!
  20. HelloAmerica-Message3: 第三次说,你好美国!