`
liyixing1
  • 浏览: 967627 次
  • 性别: Icon_minigender_1
  • 来自: 江西上饶
社区版块
存档分类
最新评论

bean定义的继承

阅读更多
bean定义中包含了大量的配置信息,其中包括容器相关的信息(比如初始化方法、静态工厂方法名等等)以及构造器参数和属性值。子bean定义就是从父bean定义继承配置数据的bean定义。它可以覆盖父bean的一些值,或者添加一些它需要的值。使用父/子bean定义的形式可以节省很多的输入工作。实际上,这就是一种模板形式。

当以编程的方式使用BeanFactory时,子bean定义用ChildBeanDefinition类表示。大多数用户从来不需要以这个方式使用它们,而是以类似XmlBeanFactory中的声明方式去配置bean定义。当使用基于XML的配置元数据时,给'parent'属性指定值,意味着子bean定义的声明。

<bean id="inheritedTestBean" abstract="true"
    class="org.springframework.beans.TestBean">
  <property name="name" value="parent"/>
  <property name="age" value="1"/>
</bean>

<bean id="inheritsWithDifferentClass"
      class="org.springframework.beans.DerivedTestBean"
      parent="inheritedTestBean" init-method="initialize">
   
  <property name="name" value="override"/>
  <!-- the age property value of 1 will be inherited from  parent -->

</bean>
如果子bean定义没有指定class属性,它将使用父bean定义的class属性,当然也可以覆盖它。在后面一种情况中,子bean的class属性值必须同父bean兼容,也就是说它必须接受父bean的属性值。

一个子bean定义可以从父bean继承构造器参数值、属性值以及覆盖父bean的方法,并且可以有选择地增加新的值。如果指定了init-method,destroy-method和/或静态factory-method,它们就会覆盖父bean相应的设置。

剩余的设置将总是从子bean定义处得到:依赖、自动装配模式、依赖检查、singleton、作用域和延迟初始化。

注意在上面的例子中,我们使用abstract属性显式地将父bean定义标记为抽象的。下面是个父bean定义并没有指定class属性的例子,其中父bean必须显式地标上abstract:

<bean id="inheritedTestBeanWithoutClass" abstract="true">
    <property name="name" value="parent"/>
    <property name="age" value="1"/>
</bean>

<bean id="inheritsWithClass" class="org.springframework.beans.DerivedTestBean"
    parent="inheritedTestBeanWithoutClass" init-method="initialize">
  <property name="name" value="override"/>
  <!-- age will inherit the value of 1 from the parent bean definition-->
</bean>
由于这样的父bean是不完整的,而且还被显式标记为抽象的,因而它无法得到自己的实例。抽象bean定义可作为子bean定义的模板。若要尝试单独使用这样的父bean(比如将它作为其他bean的ref属性而引用,或者直接使用这个父bean的id作为参数调用getBean()方法),将会导致错误。同样地,容器内部的preInstantiateSingletons()方法会完全忽略abstract的bean定义。

Note
默认情况下,ApplicationContext(不是BeanFactory)会预实例化所有singleton的bean。因此很重要的一点是:如果你只想把一个(父)bean定义当作模板使用,而它又指定了class属性,那么你就得将'abstract'属性设置为'true',否则应用上下文将会(试着)预实例化抽象bean。
分享到:
评论

相关推荐

    实体Bean继承讲解

    实体Bean继承是Java企业级应用开发中的一个重要概念,特别是在使用Java持久化技术(JPA)进行数据存储时。实体Bean代表数据库中的一个表,而实体Bean之间的继承关系则需要在数据库层面进行适当的映射,以便正确地...

    示例代码:spring使用【XXXPostProcessor】添加bean定义,修改bean定义、代理bean

    2. **修改Bean定义**:如果需要修改已存在的bean定义,如属性值、依赖关系等,可以在`BeanPostProcessor` 的实现中检查bean定义并进行调整。这通常需要通过`BeanDefinitionRegistry` 获取bean定义,并利用`Bean...

    Spring中XML配置文件的十二个最佳方法[借鉴].pdf

    Spring允许bean定义的继承,这意味着可以创建一个父bean定义,然后由其他bean定义继承它。这样可以减少重复配置,保持XML文件整洁。通过`parent`属性指定父bean,子bean只需覆盖需要改变的部分。 6. 使用内部bean...

    spring5.0.2中文官网文档.pdf

    本文档详细介绍了 Spring 5.0.2 中的核心技术,涵盖了 IoC 容器、Bean 的概述、依赖关系、范围、定制 Bean 的本质、Bean 定义继承、容器扩展点、基于注解的容器配置、类路径扫描和管理组件、使用 JSR 330 标准注释、...

    SSH笔记-依赖、继承bean的配置

    在Spring中,一个bean可以基于另一个bean定义,这意味着它将继承父bean的所有属性和配置,包括默认的初始化方法、销毁方法、属性值等。这样,我们可以在父bean中定义通用的配置,而在子bean中只定义特有的部分,避免...

    spring core官方文档.pdf

    - **Bean定义继承**:Bean可以继承另一个Bean的定义,从而重用属性和配置信息。这种机制可以减少重复配置,并使配置更加灵活。 以上是对Spring Core官方文档的部分内容进行的详细总结,涵盖了Spring框架中IoC容器的...

    Spring In Action 继承Bean的配置

    当我们说“Bean的继承配置”时,实际上是指一个Bean定义可以继承另一个Bean定义的部分或全部属性。 在XML配置中,我们可以使用`&lt;bean&gt;`标签的`parent`属性来指定父Bean。例如: ```xml &lt;bean id="parentBean" ...

    Spring Key tutorial PDF

    #### Spring Bean 定义继承 Bean 定义也可以支持继承,子 bean 可以继承父 bean 的属性。 - **示例**:创建两个 bean 定义,其中一个继承另一个,并覆盖某些属性。 #### Spring 依赖注入 Spring 支持多种依赖...

    spring入门教程之bean的继承与自动装配详解

    Bean的继承是通过`parent`属性实现的,允许一个Bean继承另一个Bean的配置。这样可以重用和覆盖父Bean的属性值。比如: ```xml &lt;bean id="address2" class=...

    2022年EJB3.0之实体Bean的继承Java教程.docx

    实体Bean的继承可以通过`@Inheritance`注解来实现,它定义了如何处理子类和父类之间的关系。在这个例子中,我们有一个`Person`实体Bean,它有`name`和`gender`两个属性。然后,我们有两个子类`Man`和`Woman`,它们都...

    Spring Reference Core Technologies

    #### 六、Bean定义继承 通过继承Bean定义,可以复用现有的Bean配置,减少冗余代码。这种方式在配置复杂的应用时非常有用。 总结起来,Spring IoC容器提供了一套完整的机制来管理应用中的对象及其依赖关系。通过对...

    Spring Reference - Core Technologies.pdf

    1.7 Bean定义继承 Bean定义可以继承自父定义,使得子定义可以继承父定义的配置属性。 1.8 容器扩展点 Spring框架允许开发者扩展容器行为,这包括自定义BeanPostProcessor、BeanFactoryPostProcessor等。 在Spring...

    Getting started with spring framwork.pdf

    - **Bean定义继承**:Bean定义可以继承其他Bean定义的属性,这样可以在不重复定义相同属性的情况下创建新Bean定义。 - **构造函数参数匹配**:Spring允许通过不同方式进行构造函数参数的匹配,包括基于类型或基于...

    Java的Spring框架中bean的继承与内部bean的注入

    Bean的继承是指在Spring容器中,一个子Bean定义可以从一个父Bean定义中继承配置信息。这并不意味着Java类的继承关系,而是针对配置元数据的一种抽象。通过继承,子Bean可以在保留父Bean某些配置的同时,对某些属性...

    spring-framework-4-reference

    Bean定义继承允许一个bean定义可以继承另一个bean定义的配置,通过parent属性指定。这种方式对于管理具有共同配置的多个bean非常有用。 容器扩展点提供了自定义容器行为的能力,通过实现特定的接口或继承特定的类...

    spring-framework-4-reference 中文文档

    - **Bean 定义继承**:允许子 Bean 继承父 Bean 的属性,简化了配置。 - **环境抽象**:允许应用程序根据运行时环境的不同而加载不同的配置。 **2. 资源处理** - **Resource 接口**:定义了如何访问资源的标准...

    SpringFramework4

    Spring Framework 4.x中对IoC容器进行了改进,包括对bean定义继承、容器扩展点和类路径扫描的增强。这些改进使得Spring IoC容器更加灵活,能够更好地与现代Java应用集成。 资源(Resources)处理是Spring框架中的一...

    spring-developing-java-applications-enterprise

    - **bean定义继承**:允许子bean继承父bean的属性,可以减少重复的配置。 - `abstract`属性:用于标记一个bean是否为抽象bean,抽象bean不能被实例化,主要用于被其他bean继承。 - **自动装配**:Spring可以根据...

    Spring-Framework-4.x参考文档.pdf

    - **3.1.7 Bean 定义继承**: Bean 定义支持继承,可以方便地复用配置。 - **3.1.8 容器扩展点**: 提供了对 IoC 容器进行扩展的方法。 - **3.1.9 类路径扫描与托管组件**: 介绍了如何使用类路径扫描来自动发现和配置...

Global site tag (gtag.js) - Google Analytics