首页 > 代码库 > Spring学习笔记5 - Bean定义继承
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>
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 }
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 }
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 }
输出结果:
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>
父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 }
输出结果:
India Message1: Hello India
India Message2: Hello Second World
India Message3: Namaste India
Spring学习笔记5 - Bean定义继承