`
ruruhuang
  • 浏览: 193307 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Spring之FactoryBean(工厂Bean)

阅读更多

SpringFactoryBean(工厂Bean

org.springframework.beans.factory.FactoryBean是一个接口,是Spring中用于定义自定义服务的核心接口,他本身是在bean工厂中定义的一个bean,同时又是用于创建另一个Spring服务对象的工厂。

FactoryBean.java

package org.springframework.beans.factory;
public interface FactoryBean {

<fontsize=3>  /**
   * Return an instance (possibly shared or independent) of the object
   * managed by this factory. As with a BeanFactory, this allows
   * support for both the Singleton and Prototype design pattern.
   * 

If this method returns null, the factory will consider the
   * FactoryBean as not fully initialized and throw a corresponding
   * FactoryBeanNotInitializedException.
   * @return an instance of the bean (should not be null; a null value
   * will be considered as an indication of incomplete initialization)
   * @throws Exception in case of creation errors
   * @see FactoryBeanNotInitializedException
<fontsize=3>   */
  Object getObject() throws Exception;
  Class getObjectType();
  boolean isSingleton();

}

下面是FactoryBeangetObject方法的调用层次。

我们可以看出,当我们用BeanFactoryApplicationContext去那getBean()时,如果这个Bean是被一个BeanFactory,那么BeanFactory得到的会是FactoryBean.getObject()的对象。

<spanlang=zh-cn>下面是AbstractBeanFactorygetObjectForSharedInstance(String,Object)方法。

    // Now we have the bean instance, which may be a normal bean or a FactoryBean.
    // If it&aposs a FactoryBean, we use it to create a bean instance, unless the
    // caller actually wants a reference to the factory.
    if (beanInstance instanceof FactoryBean) {
      if (!isFactoryDereference(name)) {
        // Return bean instance from factory.
        FactoryBean factory = (FactoryBean) beanInstance; //Cast toFactoryBean.
        if (logger.isDebugEnabled()) {
          logger.debug("Bean with name &apos" + beanName + "&apos is a factory bean");
        }
        try {
          beanInstance = factory.getObject(); // Get the realObject
        }
        catch (Exception ex) {
          throw new BeanCreationException(beanName, "FactoryBean threw exception on object creation", ex);
        }
        if (beanInstance == null) {
          throw new FactoryBeanNotInitializedException(
              beanName, "FactoryBean returned null object: " +
              "probably not fully initialized (maybe due to circular bean reference)");
        }
      }
      else {
         // The user wants the factory itself.
        if (logger.isDebugEnabled()) {
          logger.debug("Calling code asked for FactoryBean instance for name &apos" + beanName + "&apos");
        }
      }
    }

Spring通过FactoryBean来提供内置的许多有用的核心服务。当然你也可以实现自己的FactoryBean,但是你大不可以不必这样做,Spring已经提供了大量的。

  • org.springframework.jndi JndiObjectFactoryBeanJNDI LookUp

  • org.springframework.orm.hibernate3. LocalSessionFactoryBean:配置本地的Hibernate SessionFactory的工厂bean

  • org.springframework.aop.framework ProxyFactoryBean:通用的用于获得AOP代理的工厂bean

  • org.springframework.transaction.interceptor.TransactionProxyFactoryBean:用于为对象创建事务代理,用于实现简介易用申明性事务管理。

  • …………etc

http://www.writely.com/View.aspx?docid=bdd75r9hmc98j

分享到:
评论

相关推荐

    spring的FactoryBean增强我们的目标对象.rar

    当我们声明一个bean为`FactoryBean`类型时,Spring容器在实例化bean时会调用`FactoryBean`的相关方法来获取实际的对象,而不是直接使用默认的构造函数创建。这给我们提供了一个灵活的方式来控制对象的创建过程,包括...

    spring学习----工厂Bean

    工厂Bean是实现了`org.springframework.beans.factory.FactoryBean`接口的类。这个接口定义了两个核心方法:`getObject()`用于返回实际的业务对象,`isSingleton()`则指定返回的对象是否为单例。当Spring容器遇到一...

    spring如何通过FactoryBean配置Bean

    Spring 通过 FactoryBean 配置 Bean 在 Spring 框架中,FactoryBean 是一种特殊的 Bean,它可以实现复杂的 Bean 实例化逻辑。通过 FactoryBean,我们可以将复杂的实例化逻辑封装起来,使得 Bean 的配置更加灵活和...

    spring源码解析之FactoryBean相关测试代码demo

    但不同于传统的Java Bean,`FactoryBean`创建的对象在Spring容器中会被当作单独的Bean处理,即使它们可能共享相同的实例。Spring容器会调用`FactoryBean`的`getObject()`方法来获取实际的对象,而不是直接实例化`...

    spring中FactoryBean中的getObject()方法实例解析

    当我们调用 getBean("car") 时,Spring 将通过反射机制发现 CarFactoryBean 实现了 FactoryBean 的接口,然后调用其 getObject() 方法返回工厂类创建的对象。如果我们希望获取 CarFactoryBean 的实例,则需要在使用 ...

    Spring实例化Bean顺序

    9. **FactoryBean**:Spring的`FactoryBean`允许自定义Bean的创建方式。`FactoryBean`创建的对象被视为容器中的单个Bean,因此,它的实例化顺序遵循标准规则。 综上所述,Spring Bean的实例化顺序是一个复杂的过程...

    SSH笔记-通过实现FactoryBean接口来创建 Bean

    在Spring框架中,`FactoryBean`接口是一个非常重要的组件,它允许我们自定义Bean的创建逻辑,这在处理复杂对象的实例化或者需要特定初始化步骤时尤其有用。本笔记将详细探讨如何通过实现`FactoryBean`接口来创建Bean...

    Spring中的FactoryBean.rar

    FactoryBean是Spring提供的一种特殊类型的bean,它不仅仅是一个普通的对象,还是一个工厂,可以用来创建其他的bean。这个压缩包文件"Spring中的FactoryBean.rar"包含的"Spring中的FactoryBean.pdf"很可能详细讲解了...

    spring工厂属性注入

    当我们遇到一些特殊的对象,如由工厂方法创建,而非简单地通过`new`关键字实例化时,Spring提供了工厂bean(FactoryBean)来处理这种情况。工厂bean允许我们自定义对象的创建过程,同时让Spring容器负责属性注入。 ...

    简单了解Spring中BeanFactory与FactoryBean的区别

    FactoryBean是一个工厂Bean,它可以在Spring容器中生成其他Bean的实例。FactoryBean的主要方法包括: * getObject():生成其他Bean的实例。 * getObjectType():获取生成的Bean的类型。 * isSingleton():判断生成...

    Spring为IOC容器注入Bean的五种方式详解

    Spring 提供了五种方式来注入 Bean 到 IOC 容器中,即 @Import 导入组件、@Bean 注解、@Conditional 按照条件注册 Bean、FactoryBean 工厂 Bean 和包扫描组件。这些方式可以根据实际情况选择使用,以满足不同的需求...

    尚硅谷佟刚Spring4代码及PPT.rar

    在 Eclipse 中安装 SpringIDE 插件、IOC & DI、在 Spring 中配置 Bean、自动装配、Bean 之间的关系(依赖、继承)、Bean 的作用域、使用外部属性文件、SpEL、管理 Bean 的生命周期、通过工厂方法配置 Bean、通过 ...

    详解Spring中的FactoryBean

    在Spring框架中,`FactoryBean`是一个非常重要的接口,它为Spring容器提供了更高级别的抽象,使得我们可以自定义Bean的创建过程。当一个Bean的初始化需要处理复杂的逻辑、依赖其他多个Bean,或者需要进行特殊处理时...

    Spring框架中Bean的生命周期 Spring中Bean有几种作用域

    在Spring框架中,Bean的生命周期管理和作用域是其核心特性之一,它们对于理解Spring如何管理对象的创建、初始化、使用以及销毁至关重要。首先,我们来深入探讨Bean的生命周期。 Spring中的Bean生命周期主要分为两个...

    通过@Autowired注解注入bean的顺序,以及@bean注入.rar

    在`@Bean`和`Spring的factoryBean`注入的情况下,`factoryBean`允许我们通过自定义工厂方法创建bean。`@Bean`相当于一个简化版的工厂bean,因为它直接在配置类中定义了bean的创建逻辑。而传统的`factoryBean`则是...

    spring bean的生命周期测试代码

    在Spring框架中,Bean的生命周期管理是其核心特性之一,它允许开发者控制Bean从创建到销毁的整个过程。本资源提供了在Spring 4.2环境下关于Bean生命周期的测试代码,帮助我们深入理解这一关键概念。 首先,让我们...

    SSH笔记-静态/实例工厂方法配置bean

    在Spring框架中,Bean的创建方式多样,其中两种常见的非XML配置方式是通过静态工厂方法和实例工厂方法来创建Bean。这些方法为Spring容器提供了更灵活的Bean实例化策略,让我们深入了解一下这两种方法。 首先,静态...

    spring中的FactoryBean代码示例

    在Spring框架中,FactoryBean是一种特殊的Bean,它可以生成其他Bean的实例。今天我们来了解一下FactoryBean的实现和使用。 首先,让我们从SessionFactory说起。在使用SSH集成开发时,我们经常会在...

    09-IoC配置-静态工厂与实例工厂创建bean

    Spring IOC 04 配置通过静态工厂方法创建的bean、实例工厂创建的bean、FactoryBean (1)bean的创建默认就是框架利用反射new出来的bean实例; (2)工厂模式:工厂帮我们创建对象,有一个专门帮我们创建对象的类,这...

    Spring源码学习六:bean初始化1

    当`isFactoryBean(beanName)`返回`true`时,Spring会调用`FactoryBean`的`getObject()`方法来获取实际的Bean实例,而非直接实例化`RootBeanDefinition`所表示的对象。 在`preInstantiateSingletons()`过程中,如果...

Global site tag (gtag.js) - Google Analytics