Spring Bean继承

2年前 (2024-04-27)
在 Spring 中,Bean 和 Bean 之间也存在继承关系。我们将被继承的 Bean 称为父 Bean,将继承父 Bean 配置信息的 Bean 称为子 Bean。

Spring Bean 的定义中可以包含很多配置信息,例如构造方法参数、属性值。子 Bean 既可以继承父 Bean 的配置数据,也可以根据需要重写或添加属于自己的配置信息。

在 Spring XML 配置中,我们通过子 Bean 的 parent 属性来指定需要继承的父 Bean,配置格式如下。

<!--父Bean-->

<bean id="parentBean" class=" x. . x.ParentBean" >

<property name=" x" value=" x"></property>

<property name=" x" value=" x"></property>

</bean>

<!--子Bean-->

<bean id="childBean" class=" x. x. x.ChildBean" parent="parentBean"></bean>

示例 1

下面我们就通过一个实例,演示 Spring Bean 的继承。

1. 参考《个 Spring 程序》,新建一个名为 my-spring-extend-demo 的 Java 项目。

2. 在 net.biancheng.c 包下,创建一个名为 Animal 的类,代码如下。

package net.biancheng.c;

public class Animal {

private String name;

private Integer age;

public void setName(String name) {

System.out.println("Animal setName:" + name);

this.name = name;

}

public void setAge(Integer age) {

System.out.println("Animal setAge:" + age);

this.age = age;

}

@Override

public String toString() {

return "Animal{" +

"name='" + name + '\'' +

", age=" + age +

'}';

}

}


3. 在 net.biancheng.c 包下,创建一个名为 Dog 的类,代码如下。

package net.biancheng.c;

public class Dog {

private String name;

private Integer age;

private String call;

public void setCall(String call) {

System.out.println("Dog setCall:" + call);

this.call = call;

}

public void setName(String name) {

System.out.println("Dog setName:" + name);

this.name = name;

}

public void setAge(Integer age) {

System.out.println("Dog setAge:" + age);

this.age = age;

}

@Override

public String toString() {

return "Dog{" +

"name='" + name + '\'' +

", age=" + age +

", call='" + call + '\'' +

'}';

}

}


4. 在 src 目录下,创建 Spring 配置文件 Beans.xml,配置内容如下。

<beans xmlns="http://www.springframework网站站点" rel="nofollow" />

package net.biancheng.c;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {

public static void main(String[] args) {

//获取 ClassPathXmlApplicationContext 容器

ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");

Dog dog = context.getBean("dog", Dog.class);

System.out.println(dog);

}

}


6. 执行 MainApp 中的 main 方法,控制台输出如下。

Animal setName:动物

Animal setAge:10

Dog setName:小狗

Dog setAge:10

Dog setCall:汪汪汪……

Dog{name='小狗', age=10, call='汪汪汪……'}

Bean 定义模板

在父 Bean 的定义中,有一个十分重要的属性,那就是 abstract 属性。如果一个父 Bean 的 abstract 属性值为 true,则表明这个 Bean 是抽象的。

抽象的父 Bean 只能作为模板被子 Bean 继承,它不能实例化,也不能被其他 Bean 引用,更不能在代码中根据 id 调用 getBean() 方法获取,否则就会返回错误。

在父 Bean 的定义中,既可以指定 class 属性,也可以不指定 class 属性。如果父 Bean 定义没有明确地指定 class 属性,那么这个父 Bean 的 abstract 属性就必须为 true。

示例 2

下面我们通过一个实例,演示下 Bean 定义模板的使用。

1. 将 my-spring-extend-demo 的 Beans.xml 中的配置修改为以下内容。

<beans xmlns="http://www.springframework网站站点" rel="nofollow" />

Dog setName:小狗

Dog setAge:10

Dog setCall:汪汪汪……

Dog{name='小狗', age=10, call='汪汪汪……'}


通过控制台输出可以看出,在 Spring 启动时,并没有实例化 animal。