Spring IOC官方文档学习笔记(七)之Bean Definition继承
  oTtxkpRl76Le 2023年11月01日 50 0

1.Bean Definition继承

(1) Spring中的bean存在层级关系,我们可以定义子bean来继承或覆盖父bean中的某些属性,从而节省编码,在此处Spring运用到了模板设计模式,如下所示

//自定义了2个bean,ExampleA和ExampleB,注意,它们之间不存在继承关系,我们这里的继承注意是Bean Definition继承,也就是一个bean的一些属性值可能跟另一个bean的某些属性值相同,然后通过Bean Definition继承来减少编码,复用一下属性值,仅此而已
public class ExampleA {

    private String name;

    private int age;

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "ExampleA{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

public class ExampleB {

    private String name;

    private int age;

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "ExampleB{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

<!-- xml配置文件 -->
<beans ...>
    <bean id="exampleA" class="cn.example.spring.boke.ExampleA">
        <property name="name" value="exampleA"></property>
        <property name="age" value="20"></property>
    </bean>
    
    <!-- 在子bean标签中定义parent属性指向父bean,来继承父bean中的属性值 -->
    <bean id="exampleB" class="cn.example.spring.boke.ExampleB" parent="exampleA">
        <property name="name" value="exampleB"></property>
    </bean>
</beans>

//打印这两个bean,可以看到子bean exampleB中的age属性值继承了父bean exampleA的age属性值,两个值都是一样的,为20,此外exampleB还覆盖了父bean中的name属性值,为exampleB,而非exampleA
ExampleA{name='exampleA', age=20}
ExampleB{name='exampleB', age=20}

子bean可以继承或覆盖掉父bean中的scope, constructor argument values, property values, method overrides from the parent,initialization method, destroy method或者是static factory method settings为自己指定的值,其余的一些属性如:depends on, autowire mode, dependency check, singleton以及lazy init全部都取决于子bean而与父bean无关

(2) 模板父bean

<beans ...>
    <!-- 如果一个父bean没有指定class属性,同时设置它的abstract为true,那么它就是一个模板bean,来供其他的bean进行继承,如同java里的抽象类 -->
    <!-- 此时这个bean只能作为一个模板使用,其他的使用方式如使用getBean方法来获取这个bean,都将返回错误,因为它没有class属性,不完整,同时容器在初始化时也会忽略这个bean -->
    <bean id="template" abstract="true">
        <property name="name" value="exampleA"></property>
        <property name="age" value="20"></property>
    </bean>
    
    <!-- exampleB会继承父bean template中name和age的属性值 -->
    <bean id="exampleB" class="cn.example.spring.boke.ExampleB" parent="template"></bean>
</beans>
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  2Vtxr3XfwhHq   2024年05月17日   54   0   0 Java
  Tnh5bgG19sRf   2024年05月20日   109   0   0 Java
  8s1LUHPryisj   2024年05月17日   46   0   0 Java
  aRSRdgycpgWt   2024年05月17日   47   0   0 Java
oTtxkpRl76Le