第十章 定义Spring Bean的继承(Spring Framework3.1教程)

一个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配置文件中添加内容,并运行应用。

如下是Beans.xml配置文件我们定义了“helloWorld”bean它有两个属性message1和message2。接下来“helloIndia”bean被定义为“helloWorld”bean的子类通过定义parent属性。子类继承了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源代码:

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来定义给子类引用。








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值