《Spring攻略(第2版)》——1.13 继承Bean配置

1.13 继承Bean配置

1.13.1 问题
在Spring IoC容器中配置Bean时,你可能拥有超过一个共享某些公用配置的Bean,比如属性和元素中的属性。你常常必须为多个Bean重复这些配置。

1.13.2 解决方案
Spring允许你提取公用的Bean配置组成一个父Bean。从父Bean继承而来的Bean称作子Bean。子Bean从父Bean继承Bean配置,包括Bean属性和元素中的属性,避免重复配置。子Bean在必要时也可以覆盖继承的配置。

父Bean可以作为配置模板,也可以同时作为Bean的一个实例。但是,如果你希望父Bean只作为模板而不能检索,必须将abstract设置为true,要求Spring不要实例化这个Bean。

必须注意,并不是所有在父元素中定义的属性都将被继承。例如,autowire 和dependency-check属性不会从父Bean中继承。如果需要了解哪些属性从父Bean继承,而哪些不能,请参见关于Bean继承的Spring文档。

1.13.3 工作原理
假定你必须添加一个新的序列生成器实例,初始值和后缀与现有的生成器相同。

<beans ...>
   <bean id="sequenceGenerator"
     class="com.apress.springrecipes.sequence.SequenceGenerator">
     <property name="initial" value="100000" />
     <property name="suffix" value="A" />
     <property name="prefixGenerator" ref="datePrefixGenerator" />
   </bean>

   <bean id="sequenceGenerator1"
     class="com.apress.springrecipes.sequence.SequenceGenerator">
     <property name="initial" value="100000" />
     <property name="suffix" value="A" />
     <property name="prefixGenerator" ref="datePrefixGenerator" />
   </bean>

   <bean id="datePrefixGenerator"
     class="com.apress.springrecipes.sequence.DatePrefixGenerator">
     <property name="pattern" value="yyyyMMdd" />
   </bean>
</beans>

为了避免重复相同的属性,你可以用这些属性集声明一个基序列生成器。然后,两个序列生成器可以从这个基生成器中继承,这样它们也就自动拥有了那些属性集。如果子Bean和父Bean的class属性相同,就不需要指定。

<beans ...>
   <bean id="baseSequenceGenerator"
     class="com.apress.springrecipes.sequence.SequenceGenerator">
     <property name="initial" value="100000" />
     <property name="suffix" value="A" />
     <property name="prefixGenerator" ref="datePrefixGenerator" />
   </bean>

   <bean id="sequenceGenerator" parent="baseSequenceGenerator" />

   <bean id="sequenceGenerator1" parent="baseSequenceGenerator" />
   ...
</beans>

继承的属性可以由子Bean覆盖。例如,你可以添加不同初始值的子序列生成器。

<beans ...>
   <bean id="baseSequenceGenerator"
     class="com.apress.springrecipes.sequence.SequenceGenerator">
     <property name="initial" value="100000" />
     <property name="suffix" value="A" />
     <property name="prefixGenerator" ref="datePrefixGenerator" />
   </bean>

   <bean id="sequenceGenerator2" parent="baseSequenceGenerator">
     <property name="initial" value="200000" />
   </bean>
   ...
</beans>

现在,基序列生成器Bean可以恢复为Bean实例使用。如果你希望它仅作为模板,就必须将abstract属性设置为true。以后Spring将不会实例化这个Bean。

<bean id="baseSequenceGenerator" abstract="true"
   class="com.apress.springrecipes.sequence.SequenceGenerator">
   ...
</bean>

你也可以忽略父Bean的类,让子Bean指定自己的类,特别是在父Bean与子Bean不在同一类层次结构但是共享同名属性的时候。在这种情况下,父Bean的abstract属性必须设置为true,因为父Bean不能实例化。例如,我们添加另一个也有initial属性的Reverse Generator类。

package com.apress.springrecipes.sequence;

public class ReverseGenerator {

   private int initial;

   public void setInitial(int initial) {
     this.initial = initial;
   }
}

现在,SequenceGenerator和ReverseGenerator不会扩展相同的基类,也就是说,它们不在相同的类层次结构中,但是具有同名的属性:initial。为了提取公共的initial属性,你需要一个没有定义class属性的父Bean——baseGenerator。

<beans ...>
   <bean id="baseGenerator" abstract="true">
     <property name="initial" value="100000" />
   </bean>

   <bean id="baseSequenceGenerator" abstract="true" parent="baseGenerator"
     class="com.apress.springrecipes.sequence.SequenceGenerator">
     <property name="suffix" value="A" />
     <property name="prefixGenerator" ref="datePrefixGenerator" />
   </bean>

   <bean id="reverseGenerator" parent="baseGenerator"
     class="com.apress.springrecipes.sequence.ReverseGenerator" />

<bean id="sequenceGenerator" parent="baseSequenceGenerator" />

   <bean id="sequenceGenerator1" parent="baseSequenceGenerator" />

   <bean id="sequenceGenerator2" parent="baseSequenceGenerator"/>
   ...
</beans>

图1-1显示了这个生成器Bean层次结构的对象图。

图1-1 生成器Bean层次结构的对象图

时间: 2024-08-10 10:34:55

《Spring攻略(第2版)》——1.13 继承Bean配置的相关文章

《Spring攻略(第2版)》——导读

前言 Spring框架正在成长.它始终与选择相关.Java EE关注于少数几项技术,很大程度上阻碍了更好的替代解决方案出现.当Spring框架出现时,没有多少人还会承认Java EE是当今最佳的架构. 随后Spring被大张旗鼓地推出,因为它寻求简化Java EE.此后其每个版本都引入设计用来简化和实现解决方案的新特性. 从2.0版本之后,Spring框架开始针对多平台.和往常一样,该框架提供了现有平台之上的服务,但是尽可能去除与底层平台的耦合.Java EE仍然是主要的参考点,但是不是唯一的目

阿里妈妈联盟申请注册攻略(站长版)

中介交易 SEO诊断 淘宝客 云主机 技术大厅 阿里妈妈注册攻略(站长版) 阿里妈妈面世已经快一个月了,有很多朋友对于阿里妈妈的注册以及发布广告位流程不是很清楚.特别是作为 卖家,对于发布广告位之类的操作了解不多,特发布注册秘笈,以帮助大家更好的理解阿里妈妈的运作流程. 整体来说,要想成功在阿里妈妈注册,需要完成三个步骤: 一.注册成为阿里妈妈的会员 二.登记网站并发布广告位 三.投放广告代码 注意:上面这三个步骤主要是针对卖家在阿里妈妈出售广告位. 话不多说,开始注册了! 第一部分 注册成为阿

《Spring攻略(第2版)》——1.2 配置Spring IoC容器中的Bean

1.2 配置Spring IoC容器中的Bean 1.2.1 问题 Spring提供了一个强大的IoC容器来管理组成应用的bean.为了利用容器服务,你必须配置运行于Spring IoC容器中的Bean. 1.2.2 解决方案 你可以通过XML文件.属性文件.注释甚至API来配置Spring IoC容器中的Bean. Spring允许你在一个或者多个bean配置文件中配置bean.对于简单的应用程序,可以在单个配置文件中集中配置bean.但是对于有许多bean的大型应用,你应该根据其功能(例如控

《Spring攻略(第2版)》——1.12 用@Autowired和@Resource自动装配Bean

1.12 用@Autowired和@Resource自动装配Bean 1.12.1 问题 在Bean配置文件中设置autowire属性进行的自动装配将装配一个Bean的所有属性.这样的灵活性不足以仅仅装配特定的属性.而且,你只能通过类型或者名称自动装配Bean.如果这两种策略都不能满足你的需求,就必须明确地装配Bean. 1.12.2 解决方案 从Spring 2.5起,自动装配功能进行了多处改进.你可以通过用@Autowired或者@Resource(在JSR-250:Java平台常见注解中定

《Spring攻略(第2版)》——1.11 用XML配置自动装配Bean

1.11 用XML配置自动装配Bean 1.11.1 问题 当一个Bean需要访问另一个Bean时,你可以显式指定引用装配它.但是,如果你的容器能够自动装配Bean,就可以免去手工配置装配的麻烦. 1.11.2 解决方案 Spring IoC容器能够帮助你自动装配Bean.你只要在的autowire属性中指定自动装配模式就可以了.表1-2列出了Spring支持的自动装配模式. *默认模式是no,但是可以设置根元素的default-autowire属性修改.这个默认模式将被Bean自己指定的模式覆

《Spring攻略(第2版)》——1.9 用依赖检查属性

1.9 用依赖检查属性 1.9.1 问题在大规模的应用中,IoC容器中可能声明了几百个或者几千个Bean,这些Bean之间的依赖往往非常复杂.设值方法注入的不足之一是无法确定一个属性将会被注入.检查所有必要的属性是否已经设置是非常困难的. 1.9.2 解决方案Spring的依赖检查功能能够帮助你检查在一个Bean上的所有特定类型属性是否都已经设置.你只要在的dependency-check属性中指定依赖检查模式就可以了.注意,依赖检查功能只能检查属性是否已经设置,而无法检查它们的值是否非空.表1

《Spring攻略(第2版)》——1.15 小结

1.15 小结 在本章中,你已经学习了Spring IoC容器中的基本Bean配置.Spring支持多种Bean配置.在这些配置中,XML是最简单和最自然的.Spring提供两种IoC容器实现.基本的实现是Bean工厂,高级的实现是应用程序上下文.如果可能,你应该使用应用程序上下文,除非资源有限.Spring支持用Setter注入和构造程序注入定义Bean属性,属性可以是简单值.集合或者Bean引用. 依赖检查和自动装配是Spring提供的两种有价值的容器特性.依赖检查帮助检查所有必要的属性是否

《Spring攻略(第2版)》——1.14 从Classpath中扫描组件

1.14 从Classpath中扫描组件 1.14.1 问题为了便于Spring IoC容器对组件的管理,你需要在Bean配置中逐个声明它们.但是,如果Spring能够自动地监测你的组件而不需要手工配置,将会大大地节省你的工作量. 1.14.2 解决方案Spring提供一个强大的功能--组件扫描.这个功能能够利用特殊的典型化注解,从classpath中自动地扫描.检测和实例化你的组件.指示Spring管理组件的基本注解是@Component.其他特殊的典型化注解包括@Repository.@Se

《Spring攻略(第2版)》——1.7 使用Spring的FactoryBean创建Bean

1.7 使用Spring的FactoryBean创建Bean 1.7.1 问题你可能希望用Spring的工厂Bean在Spring IoC容器中创建Bean.工厂Bean(Factory bean)是作为创建IoC容器中其他Bean的工厂的一个Bean.概念上,工厂Bean与工厂方法非常类似,但是它是Bean构造期间可被Spring IoC容器识别的Spring专用Bean. 1.7.2 解决方案工厂Bean的基本要求是实现FactoryBean接口.为了方便,Spring提供了抽象模板类Abs