Spring之FactoryBean(工厂Bean)
org.springframework.beans.factory.FactoryBean是一个接口,是Spring中用于定义自定义服务的核心接口,他本身是在bean工厂中定义的一个bean,同时又是用于创建另一个Spring服务对象的工厂。
FactoryBean.java
package org.springframework.beans.factory;
public interface FactoryBean {
* 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
Object getObject() throws Exception;
Class getObjectType();
boolean isSingleton();
}
下面是FactoryBean的getObject方法的调用层次。
我们可以看出,当我们用BeanFactory或ApplicationContext去那getBean()时,如果这个Bean是被一个BeanFactory,那么BeanFactory得到的会是FactoryBean.getObject()的对象。
AbstractBeanFactory的getObjectForSharedInstance(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 '" + beanName + "' 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 '" + beanName + "'");
}
}
}
Spring通过FactoryBean来提供内置的许多有用的核心服务。当然你也可以实现自己的FactoryBean,但是你大不可以不必这样做,Spring已经提供了大量的。
-
org.springframework.jndi JndiObjectFactoryBean:JNDI 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
分享到:
相关推荐
当我们声明一个bean为`FactoryBean`类型时,Spring容器在实例化bean时会调用`FactoryBean`的相关方法来获取实际的对象,而不是直接使用默认的构造函数创建。这给我们提供了一个灵活的方式来控制对象的创建过程,包括...
工厂Bean是实现了`org.springframework.beans.factory.FactoryBean`接口的类。这个接口定义了两个核心方法:`getObject()`用于返回实际的业务对象,`isSingleton()`则指定返回的对象是否为单例。当Spring容器遇到一...
Spring 通过 FactoryBean 配置 Bean 在 Spring 框架中,FactoryBean 是一种特殊的 Bean,它可以实现复杂的 Bean 实例化逻辑。通过 FactoryBean,我们可以将复杂的实例化逻辑封装起来,使得 Bean 的配置更加灵活和...
但不同于传统的Java Bean,`FactoryBean`创建的对象在Spring容器中会被当作单独的Bean处理,即使它们可能共享相同的实例。Spring容器会调用`FactoryBean`的`getObject()`方法来获取实际的对象,而不是直接实例化`...
当我们调用 getBean("car") 时,Spring 将通过反射机制发现 CarFactoryBean 实现了 FactoryBean 的接口,然后调用其 getObject() 方法返回工厂类创建的对象。如果我们希望获取 CarFactoryBean 的实例,则需要在使用 ...
9. **FactoryBean**:Spring的`FactoryBean`允许自定义Bean的创建方式。`FactoryBean`创建的对象被视为容器中的单个Bean,因此,它的实例化顺序遵循标准规则。 综上所述,Spring Bean的实例化顺序是一个复杂的过程...
在Spring框架中,`FactoryBean`接口是一个非常重要的组件,它允许我们自定义Bean的创建逻辑,这在处理复杂对象的实例化或者需要特定初始化步骤时尤其有用。本笔记将详细探讨如何通过实现`FactoryBean`接口来创建Bean...
FactoryBean是Spring提供的一种特殊类型的bean,它不仅仅是一个普通的对象,还是一个工厂,可以用来创建其他的bean。这个压缩包文件"Spring中的FactoryBean.rar"包含的"Spring中的FactoryBean.pdf"很可能详细讲解了...
当我们遇到一些特殊的对象,如由工厂方法创建,而非简单地通过`new`关键字实例化时,Spring提供了工厂bean(FactoryBean)来处理这种情况。工厂bean允许我们自定义对象的创建过程,同时让Spring容器负责属性注入。 ...
FactoryBean是一个工厂Bean,它可以在Spring容器中生成其他Bean的实例。FactoryBean的主要方法包括: * getObject():生成其他Bean的实例。 * getObjectType():获取生成的Bean的类型。 * isSingleton():判断生成...
Spring 提供了五种方式来注入 Bean 到 IOC 容器中,即 @Import 导入组件、@Bean 注解、@Conditional 按照条件注册 Bean、FactoryBean 工厂 Bean 和包扫描组件。这些方式可以根据实际情况选择使用,以满足不同的需求...
在 Eclipse 中安装 SpringIDE 插件、IOC & DI、在 Spring 中配置 Bean、自动装配、Bean 之间的关系(依赖、继承)、Bean 的作用域、使用外部属性文件、SpEL、管理 Bean 的生命周期、通过工厂方法配置 Bean、通过 ...
在Spring框架中,`FactoryBean`是一个非常重要的接口,它为Spring容器提供了更高级别的抽象,使得我们可以自定义Bean的创建过程。当一个Bean的初始化需要处理复杂的逻辑、依赖其他多个Bean,或者需要进行特殊处理时...
在Spring框架中,Bean的生命周期管理和作用域是其核心特性之一,它们对于理解Spring如何管理对象的创建、初始化、使用以及销毁至关重要。首先,我们来深入探讨Bean的生命周期。 Spring中的Bean生命周期主要分为两个...
在`@Bean`和`Spring的factoryBean`注入的情况下,`factoryBean`允许我们通过自定义工厂方法创建bean。`@Bean`相当于一个简化版的工厂bean,因为它直接在配置类中定义了bean的创建逻辑。而传统的`factoryBean`则是...
在Spring框架中,Bean的生命周期管理是其核心特性之一,它允许开发者控制Bean从创建到销毁的整个过程。本资源提供了在Spring 4.2环境下关于Bean生命周期的测试代码,帮助我们深入理解这一关键概念。 首先,让我们...
在Spring框架中,Bean的创建方式多样,其中两种常见的非XML配置方式是通过静态工厂方法和实例工厂方法来创建Bean。这些方法为Spring容器提供了更灵活的Bean实例化策略,让我们深入了解一下这两种方法。 首先,静态...
在Spring框架中,FactoryBean是一种特殊的Bean,它可以生成其他Bean的实例。今天我们来了解一下FactoryBean的实现和使用。 首先,让我们从SessionFactory说起。在使用SSH集成开发时,我们经常会在...
Spring IOC 04 配置通过静态工厂方法创建的bean、实例工厂创建的bean、FactoryBean (1)bean的创建默认就是框架利用反射new出来的bean实例; (2)工厂模式:工厂帮我们创建对象,有一个专门帮我们创建对象的类,这...
当`isFactoryBean(beanName)`返回`true`时,Spring会调用`FactoryBean`的`getObject()`方法来获取实际的Bean实例,而非直接实例化`RootBeanDefinition`所表示的对象。 在`preInstantiateSingletons()`过程中,如果...