Spring 定义:abstract="true"
2012-12-31 14:00
375 查看
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定义的形式可以节省很多的输入工作。实际上,这就是一种模板形式。
当以编程的方式使用
<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和/或
剩余的设置将总是从子bean定义处得到:依赖、自动装配模式、依赖检查、singleton、作用域和延迟初始化。
注意在上面的例子中,我们使用abstract属性显式地将父bean定义标记为抽象的。 下面是个父bean定义并没有指定class属性的例子,其中父bean必须显式地标上
<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
</bean>
由于这样的父bean是不完整的,而且还被显式标记为
注意
默认情况下,
如果你有一个(父)bean定义你希望仅仅作为模版使用,而这个定义说明了一个类,你必须把abstract参数设置为true,否则应用程序上下文将试图预先初始化它。
本文出自 “蔚蓝海洋” 博客,请务必保留此出处http://xqsea.blog.51cto.com/5628704/1105037
今天看到很多配置文件中都有这样的写法:
<!-- 配置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
1from 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,否则应用程序上下文将试图预先初始化它。
本文出自 “蔚蓝海洋” 博客,请务必保留此出处http://xqsea.blog.51cto.com/5628704/1105037
相关文章推荐
- Spring 定义:abstract="true" ,可适用模板
- Spring 定义:abstract="true"(转http://blog.163.com/yangyanninhao@126/blog/static/239900292007101863043493/)
- Spring 定义:abstract="true"
- Spring abstract="true" merge="true"
- spring bean abstract="true"
- spring 依赖对象的注入方式(3种) 和 公共属性的设置abstract="true" parent
- spring使用aop时需要设置proxy-target-class="true" 否则无法依赖注入
- Spring read-only="true" 只读事务的一些概念
- spring使用aop时需要设置proxy-target-class="true" 否则无法依赖注入
- Spring Security http标签的use-expressions="true"属性
- Spring 中的default-lazy-init="true" 和 lazy-init="true"
- Spring 中的default-lazy-init="true" 和 lazy-init="true"
- abstract="true" 和 parent=""
- spring使用aop时需要设置proxy-target-class="true" 否则无法依赖注入
- spring事务定义中,@Transactional(readOnly = true, propagation = Propagation.NOT_SUPPORTED) 这样定义有问题吗?
- Spring配置文件中的 default-lazy-init="true"
- spring使用aop时需要设置proxy-target-class="true" 否则无法依赖注入
- Spring配置default-lazy-init="true"
- spring使用aop时需要设置proxy-target-class="true" 否则无法依赖注入
- spring使用aop时需要设置proxy-target-class="true" 否则无法依赖注入