Spring进阶(八)之bean继承

使用继承简化bean配置 (abstract & parent)

我们先来看一个案例:

public class ServiceA {
}


public class ServiceB {
    private String name;
    private ServiceA serviceA;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public ServiceA getServiceA() {
        return serviceA;
    }
    public void setServiceA(ServiceA serviceA) {
        this.serviceA = serviceA;
    }
    @Override
    public String toString() {
        return "ServiceB{" +
                "name='" + name + '\'' +
                ", serviceA=" + serviceA +
                '}';
    }
}

上面的ServiceB类中有2个属性,下面我们再创建一个ServiceC类,和ServiceB中的内容一样

public class ServiceC {
    private String name;
    private ServiceA serviceA;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public ServiceA getServiceA() {
        return serviceA;
    }
    public void setServiceA(ServiceA serviceA) {
        this.serviceA = serviceA;
    }
    @Override
    public String toString() {
        return "ServiceC{" +
                "name='" + name + '\'' +
                ", serviceA=" + serviceA +
                '}';
    }
}
<?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-4.3.xsd">

    <bean id="serviceA" class="com.javacode2018.lesson001.demo12.ServiceA"/>

    <bean id="serviceB" class="com.javacode2018.lesson001.demo12.ServiceB">
        <property name="name" value="测试数据"/>
        <property name="serviceA" ref="serviceA"/>
    </bean>

    <bean id="serviceC" class="com.javacode2018.lesson001.demo12.ServiceB">
        <property name="name" value="测试数据"/>
        <property name="serviceA" ref="serviceA"/>
    </bean>
</beans>

 运行后控制台打印:

serviceB:ServiceB{name='测试数据', serviceA=com.javacode2018.lesson001.demo12.ServiceA@222114ba} serviceC:ServiceC{name='测试数据', serviceA=com.javacode2018.lesson001.demo12.ServiceA@222114ba}

此时我们就可以通过继承去简化上面的代码了

<?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-4.3.xsd">

    <bean id="serviceA" class="com.javacode2018.lesson001.demo12.ServiceA"/>

    <bean id="baseService" abstract="true">
        <property name="name" value="测试数据"/>
        <property name="serviceA" ref="serviceA"/>
    </bean>

    <bean id="serviceB" class="com.javacode2018.lesson001.demo12.ServiceB" parent="baseService"/>

    <bean id="serviceC" class="com.javacode2018.lesson001.demo12.ServiceC" parent="baseService"/>

</beans>

上面多了一个baseService的bean,这个bean没有指定class对象,但是多了一个abstract="true"的 属性,表示这个bean是抽象的,abstract为true的bean在spring容器中不会被创建,只是会将其当做 bean定义的模板,而serviceB和serviceC的定义中多了一个属性parent,用来指定当前bean的父 bean名称,此处是baseService,此时serviceB和serviceC会继承baseService中定义的配置信息。serviceB 和 serviceC也叫做子bean,即使我们继承了子bean,我们也是可以在子bean中定义配置信息的,如果发生冲突时,子bean的配置会覆盖父bean的配置

总结:

  • bean元素的abstract属性为true的时候可以定义某个bean为一个抽象的bean,相当于定义了一 个bean模板,spring容器并不会创建这个bean,从容器中查找abstract为true的bean的时候, 会报错BeanIsAbstractException异常
  • bean元素的parent属性可以指定当前bean的父bean,子bean可以继承父bean中配置信息,也 可以自定义配置信息,这样可以覆盖父bean中的配置
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰魄雕狼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值