Spring教程——Spring Bean继承

在 Spring 中,Bean 和 Bean 之间也存在继承关系。我们将被继承的 Bean 称为父 Bean,将继承父 Bean 配置信息的 Bean 称为子 Bean。

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. 新建一个名为 my-spring-extend-demo 的 Java 项目。

2. 在 net.CSDN.mp 包下,创建一个名为 Animal 的类,代码如下:

package net.CSDN.mp;
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.CSDN.mp 包下,创建一个名为 Dog 的类,代码如下:

package net.CSDN.mp;
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.CSDN.mp.Animal">
        <property name="name" value="动物"></property>
        <property name="age" value="10"></property>
    </bean>
    <bean id="dog" class="net.CSDN.mp.Dog" parent="animal">
        <property name="name" value="小狗"></property>
        <property name="call" value="汪汪汪……"></property>
    </bean>
</beans>

5. 在 net.CSDN.mp 包下,创建一个名为 MainApp 的类,代码如下:

package net.CSDN.mp;
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.CSDN.mp.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。

 新版Spring零基础入门到精通,一套搞定spring全套视频教程(含实战源码)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值