`
langgufu
  • 浏览: 2309292 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Spring 定义:abstract="true" ,可适用模板

阅读更多

Spring 定义:abstract="true"  

今天看到很多配置文件中都有这样的写法:
<!-- 配置daoTemplate,作为所有DAO组件的模板 -->
<bean id="daoTemplate" abstract="true">
<!-- 为DAO组件注入SessionFactory引用 -->
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!-- 配置stateDao组件 -->
<bean id="stateDao" parent="daoTemplate"
class="org.crazyit.auction.dao.impl.StateDaoHibernate"/>
<!-- 配置kindDao组件 -->
<bean id="kindDao" parent="daoTemplate"
class="org.crazyit.auction.dao.impl.KindDaoHibernate"/>
 
为什么<bean id="daoTemplate" abstract="true">里面没有指定class呢?我查了spring手册,里面的例子都是有class指向的,因为一个bean没有class单独存在肯定无意义 ,后面一般是子类的指向。因为一个子bean定义可以从父bean继承构造器参数值、属性值以及覆盖父bean的方法,并且可以有选择地增加新的值。
 
 
先看看下面这段话:

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,否则应用程序上下文将试图预先初始化它。
分享到:
评论

相关推荐

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

    - 为了避免重复定义相同的bean配置,Spring支持一种类似于继承的机制,即通过定义一个抽象bean来作为其他bean的基础模板。例如,创建一个抽象bean `AbstractService`,并在其他具体服务中引用它: ```xml ...

    spring02-3

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

    spring

    通过设置父类bean为抽象类型(abstract="true"),并在子bean中引用父bean,可以轻松实现配置的重用和简化。 **6. 通过ApplicationContext装配bean** 使用ApplicationContext装配bean而不是在XML配置中直接预装配...

    spring bean 属性总结

    - **abstract属性**:如果设置为`true`,则该Bean仅作为其他Bean的抽象模板,不能被直接实例化。 - **parent属性**:允许继承另一个Bean的属性。这对于共享一些通用配置非常有用。 - **autowire属性**:控制Bean的...

    java设计模式之模板模式

    - **框架设计**:许多框架如Spring MVC,就大量使用了模板模式,定义了处理请求的基本流程,而开发者只需要关注具体的业务逻辑。 - **游戏引擎**:游戏中的各种逻辑(如角色移动、攻击等)可以抽象为模板,然后由...

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

     第27~30行定义了Spring代理Hibernate数据操作的HibernateTemplate模板,而第32~34行将该模板注入到tfileDAO中。  需要指定的是Spring 1.2.5提供了两套Hibernate的支持包,其中Hibernate 2相关的封装类位于org....

    通过实例解析spring bean之间的关系

    此外,Spring还允许定义抽象Bean(abstract bean),它们不用于实例化,而是作为其他Bean的模板。一个Bean可以通过设置`abstract`属性为`true`来声明为抽象Bean,或者如果未指定`class`属性,Spring也会将其视为抽象...

    事物管理配置文件.txt

    &lt;bean id="transactionIntercetorTemplate" abstract="true"&gt; &lt;property name="transactionAttributes"&gt; &lt;!-- ... --&gt; ``` `transactionIntercetorTemplate`是一个抽象bean,定义了事务属性的模板,而`...

    +Flex+集成到+Java+EE+应用程序的最佳实践(完整源代码)

    现在,Java EE 后端与 Flex 前端的接口已经定义好了,要完成 Java EE 后端的接口实现类非常容易,利用 Spring 强大的依赖注入功能,可以通过几行简单的代码完成: 清单 2. FlexServiceImpl class public class ...

    cms后台管理

    下面是我自己定义的标签mycontent_list 首先,在数据库里创建了一个jc_mycontent的表,其中有id,title,content三个字段 其次,创建了一个实体类 public class MyContent { private static final long ...

    将 Flex 集成到 Java EE 应用程序的最佳实践(完整源代码)

    现在,Java EE 后端与 Flex 前端的接口已经定义好了,要完成 Java EE 后端的接口实现类非常容易,利用 Spring 强大的依赖注入功能,可以通过几行简单的代码完成: 清单 2. FlexServiceImpl class public ...

    程序员英语手册

    - **定义**:在编程中指非具体存在的概念,如抽象类、抽象方法等,用于提供一个通用的模板或骨架,但不可实例化。 - **应用场景**:面向对象编程中定义接口或规范时使用。 **3. Abstract Base Class (ABC) 抽象基类...

    java_编程常用英语单词_解释

    `abstract` 关键字帮助开发者创建一种模板类,该类中的一些或所有方法必须由其子类实现。 #### Access (访问, 存取) - **发音**:['ækses] - **定义**:Access 在计算机科学中通常指对资源(如数据、文件等)的...

    java加强笔记

    实现类似spring的可配置的AOP框架 - 可以实现一个简单的AOP框架,通过配置文件来定义切面逻辑。 #### 十、JAVA5中的多线程 ##### 1. 传统线程技术回顾 - Java中的线程可以通过继承`Thread`类或实现`Runnable`接口...

    JAVA常用英文

    抽象类或方法,用于定义一种模板,允许子类继承并实现其功能。在Java中,`abstract`关键字不能单独使用于变量、构造器或初始化块,仅能用于类和方法。 ### access 访问控制是Java中一个核心概念,通过`public`、`...

Global site tag (gtag.js) - Google Analytics