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