Spring BeanFactory、FactoryBean、ObjectFactory 有何不同?

简介: 前言前面两篇文章 Spring基础容器BeanFactory 和 Spring FactoryBean 源码分析 已经详细的介绍了BeanFactory和FactoryBean,Spring中还存在一个ObjectFactory,它们之间不仅名称非常相似,事实上功能也有一些区别和联系。初学Spring的小伙伴可能很难区分它们之间有什么区别,这篇文章将简单对它们加以区分。

前言

前面两篇文章 Spring基础容器BeanFactory 和 Spring FactoryBean 源码分析 已经详细的介绍了BeanFactory和FactoryBean,Spring中还存在一个ObjectFactory,它们之间不仅名称非常相似,事实上功能也有一些区别和联系。初学Spring的小伙伴可能很难区分它们之间有什么区别,这篇文章将简单对它们加以区分。


ObjectFactory源码浅析

ObjectFactory源码相对简单,我们先从源码入手对ObjectFactory做一个简单的认识。

/**
 * 定义一个工厂,该工厂在调用时可以返回对象实例(可能是共享的或独立的)。
 * 此接口通常用于封装一个通用工厂,该工厂在每次调用时返回某个目标对象的新实例(原型)。
 * 这个接口类似于FactoryBean,但是后者的实现通常被定义为BeanFactory中的SPI实例,
 * 而这个类的实现通常是作为API提供给其他bean的(通过注入)。因此,getObject()方法具有不同的异常处理行为。
 * @param <T> the object type
 * @author Colin Sampaleanu
 * @see FactoryBean
 * @since 1.0.2
 */
@FunctionalInterface
public interface ObjectFactory<T> {
  /**
   * 返回此工厂管理的对象的实例(可能是共享的或独立的)。
   *
   * @return the resulting instance
   * @throws BeansException in case of creation errors
   */
  T getObject() throws BeansException;
}


通过源码的注释我们可以大概了解到,ObjectFactory是一个工厂,在调用时可以返回对象的一个实例。


BeanFactory、FactoryBean、ObjectFactory的联系与区别

联系

BeanFactory、FactoryBean、ObjectFactory都是工厂,负责对象的创建与获取。


区别

BeanFactory作为bean工厂,是spring的基础容器,它可以管理单例bean对象从创建到销毁的整个生命周期。

FactoryBean可以作为BeanFactory管理的bean对象,同时BeanFactory对FactoryBean会做出特殊处理。如果FactoryBean被定义为spring的bean,则获取该bean时需要在beanName前面加上&符号,否则获取的bean是FactoryBean创建的对象。

ObjectFactory则只是作为一个普通的对象工厂,也不作为spring管理的bean使用,BeanFactory不会对ObjectFactory做特殊处理。它主要是用作BeanFactory子类的内部类或者使用lambda表达式封装bean的创建过程。

Spring中是如何使用ObjectFactory的?

BeanFactory和FactoryBean在前面的文章中已经进行了详细的分析,在此不加赘述,主要分析BeanFactory对ObjectFactory的使用。


BeanFactory中有两个和ObjectFactory相关的方法,如下:


<T> ObjectProvider<T> getBeanProvider(Class<T> requiredType);
<T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType);


这两个方法就是用于bean的延迟依赖查找,返回值类型ObjectProvider就是ObjectFactory的子接口。ObjectProvider相对ObjectFactory,主要是可以同时获取管理的对象的stream流或者迭代器、根据参数获取对象、如果唯一才获取等,实现类为DefaultListableBeanFactory的内部类DependencyObjectProvider,实现主要是封装了BeanFactory创建bean的逻辑,感兴趣的小伙伴可自行阅读源码。


AbstractBeanFactory#doGetBean方法中还存在如下的代码使用到了ObjectFactory,部分代码已省略。

  protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType,
      @Nullable final Object[] args, boolean typeCheckOnly) throws BeansException {
    ...省略部分代码
        if (mbd.isSingleton()) {
          //获取singleton bean
          sharedInstance = getSingleton(beanName, () -> {
            try {
              return createBean(beanName, mbd, args);
            } catch (BeansException ex) {
              destroySingleton(beanName);
              throw ex;
            }
          });
    ...省略部分代码
            Object scopedInstance = scope.get(beanName, () -> {
              beforePrototypeCreation(beanName);
              try {
                return createBean(beanName, mbd, args);
              } finally {
                afterPrototypeCreation(beanName);
              }
            });
    ...省略部分代码
  }

可以看到,获取单例bean及从自定义作用域中获取bean均使用ObjectFactory调用createBean方法封装了bean的创建。


总结

本文首先通过源码对ObjectFactory做一个简单的认识,然后对BeanFactory、FactoryBean、ObjectFactory的区别与联系做出总结,最后还分析了spring对ObjectFactory的使用,希望对大家有所帮助。


目录
相关文章
|
1月前
|
缓存 JavaScript Java
Spring之FactoryBean的处理底层源码分析
本文介绍了Spring框架中FactoryBean的重要作用及其使用方法。通过一个简单的示例展示了如何通过FactoryBean返回一个User对象,并解释了在调用`getBean()`方法时,传入名称前添加`&`符号会改变返回对象类型的原因。进一步深入源码分析,详细说明了`getBean()`方法内部对FactoryBean的处理逻辑,解释了为何添加`&`符号会导致不同的行为。最后,通过具体代码片段展示了这一过程的关键步骤。
Spring之FactoryBean的处理底层源码分析
|
1月前
|
XML 缓存 Java
Spring FactoryBean 的常见使用场景总结
FactoryBean 是 Spring 框架中的一个重要接口,用于自定义 Bean 的创建逻辑。常见使用场景包括: 1. **复杂 Bean 的创建**:如数据源配置。 2. **延迟实例化**:按需创建资源密集型对象。 3. **动态代理**:为 Bean 创建 AOP 代理。 4. **自定义配置**:根据特定配置创建 Bean。 5. **第三方库集成**:利用 FactoryBean 封装外部库的创建过程。
|
2月前
|
XML Java 数据格式
Spring BeanFactory深度讲解
Spring `BeanFactory` 是 Spring 容器的基础,负责创建、配置和管理 Bean 实例,并提供对 Bean 生命周期的管理和控制。它通过读取配置文件或注解来实例化和管理 Bean,支持 XML、Java 配置和注解配置方式。与 `ApplicationContext` 相比,`BeanFactory` 更轻量级,采用延迟加载策略,适用于资源受限的环境。它实现了工厂模式,将对象的创建和管理分离,使应用程序更灵活、可扩展且易于维护。
|
6月前
|
Java 测试技术 数据库连接
【Spring源码解读!底层原理高级进阶】【下】探寻Spring内部:BeanFactory和ApplicationContext实现原理揭秘✨
【Spring源码解读!底层原理高级进阶】【下】探寻Spring内部:BeanFactory和ApplicationContext实现原理揭秘✨
|
4月前
|
Java Spring
Spring初始化加速的思路和方案问题之在BeanFactory#doGetBean方法中,栈状态的变化影响bean的初始化的问题如何解决
Spring初始化加速的思路和方案问题之在BeanFactory#doGetBean方法中,栈状态的变化影响bean的初始化的问题如何解决
|
5月前
|
XML Java 数据格式
深度解析 Spring 源码:揭秘 BeanFactory 之谜
深度解析 Spring 源码:揭秘 BeanFactory 之谜
63 1
|
5月前
|
存储 Java C++
理解SpringIOC和DI第一课(Spring的特点),IOC对应五大注解,ApplicationContext vs BeanFactory
理解SpringIOC和DI第一课(Spring的特点),IOC对应五大注解,ApplicationContext vs BeanFactory
|
5月前
|
Java Spring
聊聊Spring中两种创建Bean的方式:BeanDefinition.setInstanceSupplier() 和 FactoryBean
聊聊Spring中两种创建Bean的方式:BeanDefinition.setInstanceSupplier() 和 FactoryBean
|
6月前
|
Java Spring 容器
Spring底层原理之 BeanFactory 与 ApplicationContext
Spring底层原理之 BeanFactory 与 ApplicationContext
64 3
|
6月前
|
Java Spring 容器
【Spring底层原理】BeanFactory的实现
【Spring底层原理】BeanFactory的实现
48 0