Spring Bean继承
在 Spring 中,Bean 和 Bean 之间也存在继承关系。我们将被继承的 Bean 称为父 Bean,将继承父 Bean 配置信息的 Bean 称为子 Bean。
Spring Bean 的定义中可以包含很多配置信息,例如构造方法参数、属性值。子 Bean 既可以继承父 Bean 的配置数据,也可以根据需要重写或添加属于自己的配置信息。
在 Spring XML 配置中,我们通过子 Bean 的 parent 属性来指定需要继承的父 Bean,配置格式如下。
1. 参考《第一个 Spring 程序》,新建一个名为 my-spring-extend-demo 的 Java 项目。
2. 在 net.biancheng.c 包下,创建一个名为 Animal 的类,代码如下。
3. 在 net.biancheng.c 包下,创建一个名为 Dog 的类,代码如下。
4. 在 src 目录下,创建 Spring 配置文件 Beans.xml,配置内容如下。
5. 在 net.biancheng.c 包下,创建一个名为 MainApp 的类,代码如下。
6. 执行 MainApp 中的 main 方法,控制台输出如下。
抽象的父 Bean 只能作为模板被子 Bean 继承,它不能实例化,也不能被其他 Bean 引用,更不能在代码中根据 id 调用 getBean() 方法获取,否则就会返回错误。
在父 Bean 的定义中,既可以指定 class 属性,也可以不指定 class 属性。如果父 Bean 定义没有明确地指定 class 属性,那么这个父 Bean 的 abstract 属性就必须为 true。
1. 将 my-spring-extend-demo 的 Beans.xml 中的配置修改为以下内容。
2. 重新执行 MainApp 中的 main 方法,控制台输出如下。
通过控制台输出可以看出,在 Spring 启动时,并没有实例化 animal。
Spring Bean 的定义中可以包含很多配置信息,例如构造方法参数、属性值。子 Bean 既可以继承父 Bean 的配置数据,也可以根据需要重写或添加属于自己的配置信息。
在 Spring XML 配置中,我们通过子 Bean 的 parent 属性来指定需要继承的父 Bean,配置格式如下。
<!--父Bean--> <bean id="parentBean" class="xxx.xxxx.xxx.ParentBean" > <property name="xxx" value="xxx"></property> <property name="xxx" value="xxx"></property> </bean> <!--子Bean--> <bean id="childBean" class="xxx.xxx.xxx.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.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="animal" class="net.biancheng.c.Animal"> <property name="name" value="动物"></property> <property name="age" value="10"></property> </bean> <bean id="dog" class="net.biancheng.c.Dog" parent="animal"> <property name="name" value="小狗"></property> <property name="call" value="汪汪汪……"></property> </bean> </beans>
5. 在 net.biancheng.c 包下,创建一个名为 MainApp 的类,代码如下。
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.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="animal" abstract="true"> <property name="name" value="动物"></property> <property name="age" value="10"></property> </bean> <bean id="dog" class="net.biancheng.c.Dog" parent="animal"> <property name="name" value="小狗"></property> <property name="call" value="汪汪汪……"></property> </bean> </beans>
2. 重新执行 MainApp 中的 main 方法,控制台输出如下。
Dog setName:小狗 Dog setAge:10 Dog setCall:汪汪汪…… Dog{name='小狗', age=10, call='汪汪汪……'}
通过控制台输出可以看出,在 Spring 启动时,并没有实例化 animal。