一个Bean的定义可以包含很多信息,包括构造参数、属性值和容器特有的信息如初始化方法,静态工厂方法等等。
一个子类bean的定义继承配置数据从他的父类的定义。子类的定义可以覆盖一些值或者增加根据需要。
Spring Bean定义的继承和Java类的继承没有任何关系但是概念相同,你可以把一个父类bean定义作为模版,其它的子类可以继承需要的配置从父类bean定义总。
当你通过使用基于XML的配置元数据,你指明了子类bean的定义使用了父类的属性,指明父类Bean的值作为属性的值。
示例
让我们按如下的步骤在Eclipse IDE中创建Spring应用。
步骤 | 描述 |
1 | 创建一个SpringExample的项目并在src目录下创建com.tutorialspoint包。 |
2 | 在Add External JARs选项卡中添加Spring库如在Spring Hello World章节中所讲。 |
3 | 在com.tutorialspoint包下创建HelloWorld、HelloIndia和MainApp类。 |
4 | 在src目录下创建bean的配置文件Beans.xml |
5 | 最后一步在Java类中和Bean配置文件中添加内容,并运行应用。 |
<?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
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="helloWorld" class="com.tutorialspoint.HelloWorld">
<property name="message1" value="Hello World!" />
<property name="message2" value="Hello Second World!" />
</bean>
<bean id="helloIndia" class="com.tutorialspoint.HelloIndia" parent="helloWorld">
<property name="message1" value="Hello India!" />
<property name="message3" value="Namaste India!" />
</bean>
</beans>
如下是HelloWorld源代码:
package com.tutorialspoint;
public class HelloWorld {
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("World Message1 : " + message1);
}
public void getMessage2() {
System.out.println("World Message2 : " + message2);
}
}
如下是HelloIndia源代码:
package com.tutorialspoint;
public class HelloIndia {
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("India Message1 : " + message1);
}
public void getMessage2() {
System.out.println("India Message2 : " + message2);
}
public void getMessage3() {
System.out.println("India Message3 : " + message3);
}
}
如下是MainApp源代码:
package com.tutorialspoint;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
HelloWorld objA = (HelloWorld) context.getBean("helloWorld");
objA.getMessage1();
objA.getMessage2();
HelloIndia objB = (HelloIndia) context.getBean("helloIndia");
objB.getMessage1();
objB.getMessage2();
objB.getMessage3();
}
}
一旦你完成了上述源代码和配置文件,运行应用。如果一切顺利,会输出如下内容:
World Message1 : Hello World!
World Message2 : Hello Second World!
India Message1 : Hello India!
India Message2 : Hello Second World!
India Message3 : Namaste India!
如果你注意这里,我们没有给“helloIndia”的message2赋值,但他从继承的bean定义中得到一个值。
Bean定义模版
你可以创建一个Bean的定义模版,这样可以被其他子类的定义引用而不需费劲。你不需要指明类的属性,需要指明abstract属性为true
<?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
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="beanTeamplate" abstract="true">
<property name="message1" value="Hello World!" />
<property name="message2" value="Hello Second World!" />
<property name="message3" value="Namaste India!" />
</bean>
<bean id="helloIndia" class="com.tutorialspoint.HelloIndia"
parent="beanTeamplate">
<property name="message1" value="Hello India!" />
<property name="message3" value="Namaste India!" />
</bean>
</beans>
父类本身不能够实例化因为它是不完全的,而且明确的标明了抽象的。当像上面那样定义一个抽象时,它不可以使用只能作为一个纯模版父类bean来定义给子类引用。