Spring 简明教程
Spring - Bean Definition Inheritance
一个 Bean 定义可以包含许多配置信息,包括构造函数参数、属性值,以及特定于容器的信息,比如初始化方法、静态工厂方法名,等等。
一个子 Bean 定义从父定义继承配置数据。子定义可以根据需要覆盖某些值,或添加其他值。
Spring Bean 定义继承与 Java 类继承无关,但继承概念是一样的。你可以将父 Bean 定义定义为模板,其他子 Bean 可以从中继承所需的配置。
使用基于 XML 的配置元数据时,可以通过使用 parent 属性来指示一个子 Bean 定义,指定父 Bean 作为该属性的值。
Example
让我们准备一个可用的 Eclipse IDE,然后执行以下步骤来创建一个 Spring 应用程序−
Steps |
Description |
1 |
使用 SpringExample 创建一个项目,并在创建的项目 src 文件夹下创建 com.tutorialspoint 包。 |
2 |
使用 Add External JARs 选项添加必需的 Spring 库,如 Spring Hello World Example 章节中所述。 |
3 |
在 com.tutorialspoint 包下创建 Java 类 HelloWorld、HelloIndia 和 MainApp。 |
4 |
在 src 文件夹下创建 Beans 配置文件 Beans.xml。 |
5 |
最后一步是创建所有 Java 文件和 Bean 配置文件的内容,并按如下所述运行应用程序。 |
以下是配置文件 Beans.xml ,我们在其中定义了“helloWorld”Bean,它具有两个属性 message1 和 message2。接下来“helloIndia”Bean 已被定义为“helloWorld”Bean 的子项,方法是使用 parent 属性。该子 Bean 原样继承 message2 属性,并覆盖 message1 属性并引入一个新的 message3 属性。
<?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.java 文件的内容 −
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.java 文件的内容 −
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.java 文件的内容−
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();
}
}
完成源文件和 Bean 配置文件创建后,我们运行该应用程序。如果您的应用程序一切正常,它将打印以下消息−
World Message1 : Hello World!
World Message2 : Hello Second World!
India Message1 : Hello India!
India Message2 : Hello Second World!
India Message3 : Namaste India!
如果你在这里观察到,我们在创建“helloIndia”Bean 时没有传递 message2,但由于 Bean 定义继承,它已经传递了。
Bean Definition Template
你可以创建一个 Bean 定义模板,它可以在其他子 Bean 定义中使用,无需付出太多努力。在定义 Bean 定义模板时,你应该不要指定 class 属性,而应该指定 abstract 属性,并且应该使用 true 值指定 abstract 属性,如下面的代码片段所示 −
<?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,它本身无法实例化,因为它是不完整的,并且它还被明确标记为 abstract。当一个定义像这样抽象时,它只能作为一个纯模板 Bean 定义使用,它作为子定义的父定义。