Spring学习笔记5 - Bean定义继承

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring学习笔记5 - Bean定义继承相关的知识,希望对你有一定的参考价值。

bean定义可以包含很多的配置信息,包括构造函数的参数,属性值,容器的具体信息。

例如初始化方法,静态工厂方法名等等。

 

子bean的定义继承父定义的配置数据。子定义可以根据需要重写一些值,或添加其他值(与Java类的继承概念一致)。

 

当使用基于XML的配置元数据时,通过使用父属性,指定父bean作为该属性的值来表明子bean的定义。

 

示例:

技术分享
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xsi:schemaLocation="http://www.springframework.org/schema/beans
 5         http://www.springframework.org/schema/beans/spring-beans.xsd">
 6         
 7     <bean id="helloWorld" class="com.microyum.HelloWorldExtend">
 8         <property name="message1" value="Hello First World" />
 9         <property name="message2" value="Hello Second World" />
10     </bean>
11     
12     <bean id="helloIndia" class="com.microyum.HelloIndiaExtend" parent="helloWorld">
13         <property name="message1" value="Hello First India" />
14         <property name="message3" value="Hello Third India" />
15     </bean>
16 </beans>
beanExtend.xml

 

 

技术分享
 1 public class HelloWorldExtend {
 2     private String message1;
 3     private String message2;
 4 
 5     public void getMessage1() {
 6         System.out.println("World Message1:" + message1);
 7     }
 8 
 9     public void setMessage1(String message1) {
10         this.message1 = message1;
11     }
12 
13     public void getMessage2() {
14         System.out.println("World Message2:" + message2);
15     }
16 
17     public void setMessage2(String message2) {
18         this.message2 = message2;
19     }
20 
21 }
HelloWorldExtend.java

 

 

技术分享
 1 public class HelloIndiaExtend {
 2     private String message1;
 3     private String message2;
 4     private String message3;
 5 
 6     public void getMessage1() {
 7         System.out.println("India Message1: " + message1);
 8     }
 9 
10     public void setMessage1(String message1) {
11         this.message1 = message1;
12     }
13 
14     public void getMessage2() {
15         System.out.println("India Message2: " + message2);
16     }
17 
18     public void setMessage2(String message2) {
19         this.message2 = message2;
20     }
21 
22     public void getMessage3() {
23         System.out.println("India Message3: " + message3);
24     }
25 
26     public void setMessage3(String message3) {
27         this.message3 = message3;
28     }
29 
30 }
HelloIndiaExtend.java

 

 

技术分享
 1 import org.springframework.context.ApplicationContext;
 2 import org.springframework.context.support.ClassPathXmlApplicationContext;
 3 
 4 public class MainAppExtend {
 5     public static void main(String[] args) {
 6         ApplicationContext context = new ClassPathXmlApplicationContext(
 7                 "beanExtend.xml");
 8 
 9         HelloWorldExtend objA = (HelloWorldExtend) context
10                 .getBean("helloWorld");
11         objA.getMessage1();
12         objA.getMessage2();
13 
14         HelloIndiaExtend objB = (HelloIndiaExtend) context
15                 .getBean("helloIndia");
16         objB.getMessage1();
17         objB.getMessage2();
18         objB.getMessage3();
19     }
20 }
MainAppExtend.java

 

 

输出结果:

World Message1:Hello First World
World Message2:Hello Second World
India Message1: Hello First India
India Message2: Hello Second World
India Message3: Hello Third India

 

这里可以观察到,在beanExtend.xml文件中,创建"helloIndia"bean的同时并没有传递message2,但由于Bean定义了继承,所有这里传递了message2

 

 

Bean定义模板

你可以创建一个Bean定义模板,不需要花太多功夫它就可以被其他子bean定义使用。

在定义一个Bean定义模板时,你不应该指定类的属性,而应该指定带true值的抽象属性

如下所示:

技术分享
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xsi:schemaLocation="http://www.springframework.org/schema/beans
 5         http://www.springframework.org/schema/beans/spring-beans.xsd">
 6         
 7     <bean id="beanTemplate" abstract="true">
 8         <property name="message1" value="Hello World" />
 9         <property name="message2" value="Hello Second World" />
10         <property name="message3" value="Namaste India" />
11     </bean>
12     
13     <bean id="helloIndia" class="com.microyum.HelloIndiaExtend" parent="beanTemplate">
14         <property name="message1" value="Hello India" />
15         <property name="message3" value="Namaste India" />
16     </bean>
17 </beans>
beanTemplate.xml

 

父bean自身不能被实例化,因为它是不完整的,而且它也被明确地标记为抽象的。

当一个定义是抽象的,它仅仅作为一个纯粹的模板bean定义来使用,充当子定义的父定义使用。

 

示例:

技术分享
 1 public class MainAppExtend {
 2     public static void main(String[] args) {
 3         ApplicationContext context = new ClassPathXmlApplicationContext(
 4                 "beanTemplate.xml");
 5 
 6         // HelloWorldExtend objA = (HelloWorldExtend) context
 7         // .getBean("helloWorld");
 8         // objA.getMessage1();
 9         // objA.getMessage2();
10 
11         HelloIndiaExtend objB = (HelloIndiaExtend) context
12                 .getBean("helloIndia");
13         objB.getMessage1();
14         objB.getMessage2();
15         objB.getMessage3();
16     }
17 }
MainAppExtend.java

 

 

输出结果:

India Message1: Hello India
India Message2: Hello Second World
India Message3: Namaste India

 







以上是关于Spring学习笔记5 - Bean定义继承的主要内容,如果未能解决你的问题,请参考以下文章

Spring4.0学习笔记005——Bean的配置三(基于XML文件)

Spring源码学习笔记1

Spring 学习笔记—— Bean之间的关系作用域自动装配

Spring4学习笔记二:Bean相关

Spring学习笔记6---bean配置和bean注入

Spring学习笔记5:bean的装配方式