《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提供了抽象模板类AbstractFactoryBean供你扩展。

工厂Bean主要用于实现框架机制。下面是一些例子:

在JNDI中查找对象(例如一个数据源)时,你可以使用JndiObjectFactoryBean。
使用经典Spring AOP为一个Bean创建代理时,可以使用ProxyFactoryBean。
在IoC容器中创建一个Hibernate会话工厂时,可以使用LocalSessionFactoryBean。
但是,作为框架用户,你难得有必要编写自定义的工厂Bean,因为它们是框架专用的,无法用在Spring IoC容器之外。实际上,你总是能够为工厂Bean实现一个等价的工厂方法。

1.7.3 工作原理
尽管你很少有必要编写自定义的工厂Bean,但是会发现通过一个实例来理解其内部机制很有帮助。例如,你可以为创建一个适用价格折扣的产品编写一个工厂Bean。它接受一个product属性和一个discount属性,将折扣应用到产品上并且作为一个新的Bean返回。

package com.apress.springrecipes.shop;

import org.springframework.beans.factory.config.AbstractFactoryBean;

public class DiscountFactoryBean extends AbstractFactoryBean {

   private Product product;
   private double discount;

   public void setProduct(Product product) {
     this.product = product;
   }

   public void setDiscount(double discount) {
     this.discount = discount;
   }

   public Class getObjectType() {
     return product.getClass();
   }

   protected Object createInstance() throws Exception {
     product.setPrice(product.getPrice() * (1 - discount));
     return product;
   }
}

通过扩展AbstractFactoryBean类,你的工厂Bean能够重载createInstance()方法以创建目标Bean实例。此外,你必须在getObjectType()方法中返回目标Bean的类型,使自动装配(Auto-wiring)功能正常工作。

接下来,你可以用DiscountFactoryBean声明你的产品实例。每当你请求一个实现Factory Bean接口的Bean,Spring IoC容器将使用这个工厂Bean创建目标Bean并且返回给你。如果你确定希望得到工厂Bean的实例,可以在Bean名称之前加上&。

<beans ...>
   <bean id="aaa"
     class="com.apress.springrecipes.shop.DiscountFactoryBean">
     <property name="product">
        <bean class="com.apress.springrecipes.shop.Battery">
          <constructor-arg value="AAA" />
          <constructor-arg value="2.5" />
        </bean>
     </property>
     <property name="discount" value="0.2" />
   </bean>

   <bean id="cdrw"
     class="com.apress.springrecipes.shop.DiscountFactoryBean">
     <property name="product">
        <bean class="com.apress.springrecipes.shop.Disc">
          <constructor-arg value="CD-RW" />
          <constructor-arg value="1.5" />
        </bean>
     </property>
     <property name="discount" value="0.1" />
   </bean>
</beans>

前述的工厂Bean配置的工作方式和下面的代码片段类似:

DiscountFactoryBean aaa = new DiscountFactoryBean();
aaa.setProduct(new Battery("AAA", 2.5));
aaa.setDiscount(0.2);
Product aaa = (Product) aaa.createInstance();

DiscountFactoryBean cdrw = new DiscountFactoryBean();
cdrw.setProduct(new Disc("CD-RW", 1.5));
cdrw.setDiscount(0.1);
Product cdrw = (Product) cdrw.createInstance();
时间: 2024-09-21 09:26:51

《Spring攻略(第2版)》——1.7 使用Spring的FactoryBean创建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.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章 Spring简介 1.1实例化Spring IoC容器

第1章 Spring简介 在本章中,你将参加关于Spring.核心容器以及容器所提供的一些全局可用设施的一个速成班(或者一次复习),你还将了解Spring XML配置格式,以及注释驱动的支持.本章将带给你应付本书余下部分中引入的概念所需要的知识.你将学习Spring IoC容器中的基本组件配置.在Spring框架的核心部分,IoC容器的设计具有高度的适应性和可配置性,提供了使你的组件配置尽可能简单的一组工具.你能够很简单地设置运行于Spring IoC容器中的组件. 在Spring中,组件也被称

《Spring攻略(第2版)》——1.3 调用构造程序创建Bean

1.3 调用构造程序创建Bean 1.3.1 问题你想要调用构造程序在Spring IoC容器中创建一个Bean,这是创建Bean最常见和直接的方法.这和Java中使用new操作符创建对象相同. 1.3.2 解决方案通常,当你为一个Bean指定了class属性,就将要求Spring IoC容器调用构造程序创建Bean实例. 1.3.3 工作原理假定你打算开发一个在线销售产品的购物应用程序.首先,你创建一个Product类,这个类有多个属性,比如产品名称和价格.因为商店中有许多类型的产品,所以你定

《Spring攻略(第2版)》——1.4 解决构造程序歧义

1.4 解决构造程序歧义 1.4.1 问题当你为Bean指定一个或者多个构造程序参数时,Spring将试图在Bean类中查找对应的构造程序,并且传递用于Bean实例化的参数.但是,如果你的参数可以应用到超过一个构造程序,可能在构造程序匹配中造成歧义.在这种情况下,Spring可能无法调用你所预期的构造程序. 1.4.2 解决方案你可以为元素指定type和index属性,帮助Spring查找预期的构造程序. 1.4.3 工作原理现在添加一个新的构造程序到SequenceGenerator类,参数为

《Spring实战(第4版)》——2.2 自动化装配bean

2.2 自动化装配bean 在本章稍后的内容中,你会看到如何借助Java和XML来进行Spring装配.尽管你会发现这些显式装配技术非常有用,但是在便利性方面,最强大的还是Spring的自动化配置.如果Spring能够进行自动化装配的话,那何苦还要显式地将这些bean装配在一起呢? Spring从两个角度来实现自动化装配: 组件扫描(component scanning):Spring会自动发现应用上下文中所创建的bean.自动装配(autowiring):Spring自动满足bean之间的依赖

《Spring攻略(第2版)》——1.5 指定Bean引用

1.5 指定Bean引用 1.5.1 问题 组成应用程序的Bean往往需要互相协作完成应用功能.为了Bean之间的相互访问,你必须在Bean配置文件中指定Bean引用. 1.5.2 解决方案 在Bean配置文件中,你可以用元素为Bean属性或者构造程序参数指定Bean引用.只需要用元素指定一个简单值就可以轻松完成这一工作.你也可以像内部Bean一样直接地在属性或者构造程序中包含一个Bean声明. 1.5.3 工作原理 在你的序列生成器中接受字符串值作为前缀的灵活性不足以满足将来的要求.如果前缀生