`

Spring中abstract="true"的定义

 
阅读更多

来源:http://wangxr66.iteye.com/blog/1561189

 

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定义。

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

注:由于设置bean定义中设置了abstract="true",因此它不能被容器实例化,只是在此起了模板的作用,供其他bean继承,所以在它的属性在类体中可以不定义,直接在bean的声明中以<proerty/>声明即可。子bean继承他后需要在提供对应的属性和set方法即可,在子bean中就可获取从父bean继承来的值

分享到:
评论

相关推荐

    spring配置文件:整理总结Spring中XML配

    &lt;bean id="abstractService" abstract="true"&gt; &lt;property name="companyName" value="Acme Inc."/&gt; &lt;bean id="shippingService" parent="abstractService" class="com.lizjason.spring.ShippingService"/&gt; `...

    Spring中xml的配置[定义].pdf

    当一个bean继承自另一个抽象bean(用`abstract="true"`标记)时,子bean可以覆盖父bean的集合属性。这意味着,如果子bean定义了自己的集合属性,那么这些属性会替换掉父bean中对应的值。 除了这些核心概念,Spring...

    spring02-3

    当我们创建一个`abstract="true"`的bean定义时,Spring容器不会尝试创建该bean,而是将其作为其他bean的父类,让子bean继承其属性和配置。这在我们需要定义一组有共同配置的bean时非常有用,而具体实现则由子bean...

    尚学堂Spring学习笔记

    1. 定义一个属性编辑器的类,这个类要继承Spring中的spring.beans.PropertyEditorSupport类。 2. 在Spring的配置文件中配置属性编辑器的bean。 3. 在需要注入Date类型属性的类的bean的配置文件中直接使用属性注入就...

    自己总结的Spring实用资料

    - 配置对象:在Spring配置文件中定义对象,包括其属性和依赖。 - 客户端代码:编写调用Spring管理对象的客户端代码,通常通过ApplicationContext接口获取对象实例。 3. **Spring IoC容器的关键点**: - IoC...

    Spring中XML配置的12个技巧

    - **实现方法**:为了实现这一点,可以在父bean中设置`abstract="true"`属性,并在子bean中引用父bean。例如: ```xml &lt;!-- 父bean --&gt; &lt;bean id="abstractService" abstract="true" class=...

    spring学习小结

    Spring 提供了一种方式来共享和重用bean的属性,通过定义抽象bean(`abstract="true"`),然后让其他bean继承这些属性。这种方式减少了重复的配置,提高代码复用。 示例: ```xml &lt;bean id="AbstractBean" ...

    Spring环境搭建

    对于共享属性的bean,可以通过定义一个抽象bean(`abstract="true"`),然后让其他bean继承这个抽象bean的属性。例如: ```xml &lt;bean id="beanAbstract" abstract="true"&gt; &lt;property name="id" value="1000"/&gt; ...

    spring 复习整理

    在本文中,我们将总结 Spring 框架的基础知识点,涵盖了 Spring 框架的核心概念、IOC 容器、依赖注入、Bean 的定义和使用、属性编辑器的定义和使用等方面的知识点。 一、Spring 框架的核心概念 Spring 框架的核心...

    spring个人笔记,很好的哦

    对于共享的注入属性,可以使用`abstract="true"`定义一个抽象的父bean,然后让具有相同属性的子bean引用这个父bean。 最后,名称自动装配是一种简化配置的方法,通过在`&lt;beans&gt;`标签中启用命名空间并设置特定的...

    hibernate+spring配置详细解析

    &lt;bean id="transactionProxyFactory" abstract="true" lazy-init="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"&gt; &lt;property name="transactionManager" ref=...

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

    除了普通的Bean,Spring还支持抽象Bean,也就是`abstract="true"`的Bean。这些Bean不会被实例化,仅用于其他Bean继承配置。例如: ```xml &lt;bean id="address4" class="com.sunny.beans.autowire.Address" p:city=...

    spring1.2的配置-jdbc

    &lt;bean id="commProxy" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"&gt; &lt;property name="transactionManager" ref="tranManager"/&gt; &lt;property name=...

    spring ioc使用教程

    Bean可以通过设置`abstract="true"`变为抽象Bean,它不能直接实例化,但可以作为其他Bean的父类。 8. **依赖实验**: 一个Bean可能依赖于其他Bean,Spring会自动处理这些依赖关系,确保在需要时能正确注入。 9. ...

    spring框架配置bean的高级属性

    &lt;bean id="transactionProxyFactory" abstract="true" lazy-init="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"&gt; &lt;property name="transactionManager"&gt; &lt;ref local=...

    spring bean 属性总结

    Spring的`&lt;beans&gt;`和`&lt;bean&gt;`元素及其属性提供了强大的配置能力,使开发者能够灵活地定义、配置和管理应用程序中的组件。通过深入了解这些元素和属性,开发人员可以更有效地利用Spring框架的功能,构建更加健壮和可...

    Spring-boot项目多数据源配置

    &lt;bean id="jpaFactoryBean" abstract="true" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"&gt; &lt;property name="dataSource" ref="dynamicDataSource"/&gt; &lt;!-- Other JPA properties...

    spring2.0声明式事务

    &lt;bean id="baseTransactionProxy" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"&gt; &lt;property name="transactionManager" ref="hibernateTransactionManager...

    ssh(structs,spring,hibernate)框架中的上传下载

     Spring强调面向接口编程,所以我们将所有对Tfile的数据操作的方法定义在TfileDAO接口中,这些接口方法分别是:  •findByFildId(String fileId)  •save(Tfile tfile)  •List findAll()  TfileDAOHibernate...

Global site tag (gtag.js) - Google Analytics