Spring中的BeanFactory类入门到精通

 更新时间:2025年12月18日 17:14:41   作者:yifanghub  
BeanFactory是Spring框架的IoC容器接口,提供Bean的生命周期管理、依赖注入和配置元数据,它支持懒加载策略,并通过实现类如DefaultListableBeanFactory来完成具体的Bean创建和依赖注入,本文介绍Spring中的BeanFactory类,感兴趣的朋友跟随小编一起看看吧

一、BeanFactory 是什么?

BeanFactory 是 Spring 框架中最顶层的 IoC(Inversion of Control)容器接口,位于 org.springframework.beans.factory 包下。它是 Spring 管理 Bean 生命周期、依赖注入和配置元数据的核心入口。
根据 Spring 官方 Javadoc 的描述:

The root interface for accessing a Spring bean container. This is the basic client view of a bean container;

直译过来就是:BeanFactory 是访问 Spring Bean 容器的根接口,是容器对外暴露的最基础视图

Bean的源码:

public interface BeanFactory {
	String FACTORY_BEAN_PREFIX = "&";
	Object getBean(String name) throws BeansException;
	<T> T getBean(String name, Class<T> requiredType) throws BeansException;
	Object getBean(String name, Object... args) throws BeansException;
	<T> T getBean(Class<T> requiredType) throws BeansException;
	<T> T getBean(Class<T> requiredType, Object... args) throws BeansException;
	<T> ObjectProvider<T> getBeanProvider(Class<T> requiredType);
	<T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType);
	boolean containsBean(String name);
	boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
	boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
	boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;
	boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException;
	@Nullable
	Class<?> getType(String name) throws NoSuchBeanDefinitionException;
	String[] getAliases(String name);
}

从这些方法可以看出,其核心职责包括:

  • 根据名称或类型获取 Bean 实例(getBean()
  • 判断容器是否包含某个 Bean(containsBean()
  • 获取 Bean 的作用域、是否单例等元信息
  • 采用懒加载策略(只有在首次调用 getBean() 时才会实例化 Bean)

值得注意的是,BeanFactory本身并不负责 Bean 的创建过程,而是提供一个统一的访问入口。真正的 Bean 创建、依赖注入、生命周期管理由其实现类完成。

二、BeanFactory 的接口体系结构

BeanFactory接口继承体系

BeanFactory
├── HierarchicalBeanFactory          // 支持父子容器层级结构
├── ListableBeanFactory              // 支持枚举容器中所有 Bean
├── AutowireCapableBeanFactory       // 支持自动装配(可用于非 Spring 管理对象)
└── ConfigurableBeanFactory          // 支持配置(如设置父工厂、类加载器等)
     └── ConfigurableListableBeanFactory

1. ListableBeanFactory

提供按类型或名称获取多个Bean的方法,可以将容器中的Bean全部取出

public interface ListableBeanFactory extends BeanFactory {
    // 按类型获取所有Bean
    String[] getBeanNamesForType(Class<?> type);
    // 按类型获取所有Bean,包含子类
    String[] getBeanNamesForType(Class<?> type, boolean includeNonSingletons, boolean allowEagerInit);
    // 按类型获取所有Bean实例
    <T> Map<String, T> getBeansOfType(Class<T> type) throws BeansException;
    // 获取所有Bean定义的名称
    String[] getBeanDefinitionNames();
    // 获取Bean定义的数量
    int getBeanDefinitionCount();
}

2. HierarchicalBeanFactory

支持分层Bean工厂,允许有父工厂:

public interface HierarchicalBeanFactory extends BeanFactory {
    // 获取父工厂
    BeanFactory getParentBeanFactory();
    // 判断是否包含指定名称的Bean(包括父工厂)
    boolean containsLocalBean(String name);
}

3. ConfigurableBeanFactory

提供配置功能:如设置 ClassLoader、BeanPostProcessor、作用域注册等。

public interface ConfigurableBeanFactory extends HierarchicalBeanFactory, SingletonBeanRegistry {
    // 设置Bean类加载器
    void setBeanClassLoader(ClassLoader beanClassLoader);
    // 设置临时类加载器
    void setTempClassLoader(ClassLoader tempClassLoader);
    // 设置Bean后处理器
    void addBeanPostProcessor(BeanPostProcessor beanPostProcessor);
    // 销毁单例Bean
    void destroySingletons();
}

SingletonBeanRegistry 提供对单例 Bean 的注册和销毁能力,是实现单例模式的关键接口。

4. AutowireCapableBeanFactory

允许对任意 Java 对象执行 Spring 的依赖注入(即使该对象不是由 Spring 容器创建的)。常用于集成第三方库。

public interface AutowireCapableBeanFactory extends BeanFactory {
    // 创建Bean实例
    Object createBean(Class<?> beanClass) throws BeansException;
    // 自动装配Bean属性
    void autowireBean(Object existingBean) throws BeansException;
    // 应用Bean后处理器
    Object initializeBean(Object existingBean, String beanName) throws BeansException;
    // 销毁Bean
    void destroyBean(Object existingBean);
}

三、BeanFactory 的核心实现体系

虽然 BeanFactory 是接口,但 Spring 提供了多个实现类,其中最重要的是:

1. DefaultListableBeanFactory

这是BeanFactory最常用的实现类,实现了ListableBeanFactory、ConfigurableBeanFactory等接口:

public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory
        implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {
    // Bean定义的存储
    private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);
    // Bean名称的存储顺序
    private final List<String> beanDefinitionNames = new ArrayList<>(256);
    // 省略其他实现...
}

这是Spring 内部最核心、最完整的BeanFactory 实现,也是ApplicationContext(如 ClassPathXmlApplicationContext)内部实际使用的工厂。

  • 内部维护 BeanDefinition 注册表(Map<String, BeanDefinition>)
  • 支持依赖解析、循环依赖处理(通过三级缓存)、作用域管理等完整功能

2. XmlBeanFactory(已过时)

基于XML配置文件的Bean工厂实现,现在已被ClassPathXmlApplicationContext等替代:

public class XmlBeanFactory extends DefaultListableBeanFactory {
    private final XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this);
    public XmlBeanFactory(Resource resource) throws BeansException {
        this(resource, null);
    }
    public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException {
        super(parentBeanFactory);
        this.reader.loadBeanDefinitions(resource);
    }
}

官方建议改用ClassPathXmlApplicationContext,因其提供了更完整的生命周期管理和事件机制。

3. 其他轻量级实现

  • StaticListableBeanFactory:手动注册 Bean 实例,适用于测试或简单场景
  • SimpleJndiBeanFactory:从 JNDI 查找 Bean(主要用于传统 Java EE 环境)

另外还有两个抽象实现类

AbstractBeanFactory

关键职责:

  • 实现了单例Bean的缓存机制
  • 实现了 ConfigurableBeanFactory 接口的大部分通用逻辑。
  • 提供了 getBean() 方法的主干流程(模板方法模式),但将具体实例化、依赖解析等委托给子类。
  • 重要方法:
public Object getBean(String name) throws BeansException {
    return doGetBean(name, null, null, false);
}
protected <T> T doGetBean(...) { ... } // 模板方法,子类需实现 createBean()

AbstractAutowireCapableBeanFactory

定位:在 AbstractBeanFactory 基础上,增加了 自动装配(Autowiring) 和 Bean 生命周期管理 能力。
关键职责:

  • 实现了AutowireCapableBeanFactory 接口
  • 提供完整的 Bean 创建流程:实例化 → 属性填充 → 初始化逻辑执行(创建Bean的核心三个步骤)。
  • 实现循环依赖的核心逻辑(通过三级缓存)。
  • 典型子类:DefaultListableBeanFactory
  • 核心方法
protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)

四、小结

  • BeanFactory 是规范(接口契约)
  • AbstractBeanFactory 定义了流程(模板方法)
  • AbstractAutowireCapableBeanFactory 提供了核心实现骨架(Bean 创建、依赖注入、生命周期)
  • DefaultListableBeanFactory 是功能完整的最终实现(注册表 + 所有能力)

到此这篇关于Spring中的BeanFactory类入门到精通的文章就介绍到这了,更多相关Spring BeanFactory类内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring Boot 中的横切逻辑统一治理方案

    Spring Boot 中的横切逻辑统一治理方案

    拦截器是Spring框架提供的核心功能之一,核心用于统一拦截用户的请求,文章主要介绍了Spring框架中的拦截器、统一数据返回格式和统一异常处理,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2026-02-02
  • SpringCloud使用Feign实现远程调用流程详细介绍

    SpringCloud使用Feign实现远程调用流程详细介绍

    OpenFeign源于Netflix的Feign,是http通信的客户端。屏蔽了网络通信的细节,直接面向接口的方式开发,让开发者感知不到网络通信细节。所有远程调用,都像调用本地方法一样完成
    2023-02-02
  • Spring中的@Qualifier注解详解

    Spring中的@Qualifier注解详解

    这篇文章主要介绍了Spring中的@Qualifier注解详解,spring @Autowire 的注解默认是按类型注入bean,本文将对其使用方法进行说明,需要的朋友可以参考下
    2023-11-11
  • IDEA中的yml文件与properties互相转换

    IDEA中的yml文件与properties互相转换

    这篇文章主要介绍了IDEA中的yml文件与properties互相转换方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • java中Future使用方法举例详细介绍

    java中Future使用方法举例详细介绍

    Future是java5新加的一个接口,提供了异步并行计算的功能,这篇文章主要介绍了java中Future使用方法绍的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-01-01
  • SpringSecurity自定义登录界面

    SpringSecurity自定义登录界面

    这篇文章主要为大家详细介绍了SpringSecurity自定义登录界面,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-09-09
  • 使用javax.sound实现简单音频播放

    使用javax.sound实现简单音频播放

    这篇文章主要为大家详细介绍了使用javax.sound实现简单音频播放,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • SimpleDateFormat在多线程下的安全问题及解决

    SimpleDateFormat在多线程下的安全问题及解决

    SimpleDateFormat类在Java中用于日期时间的格式化和解析,但在高并发环境下存在线程不安全的问题,原因是它共享了一个Calendar对象,导致多个线程操作时出现冲突,为了解决这个问题,可以使用局部变量、加锁或使用线程安全的DateTimeFormatter类
    2026-03-03
  • 基于Java SSM框架开发图书借阅系统源代码

    基于Java SSM框架开发图书借阅系统源代码

    本文给大家介绍了基于Java SSM框架开发图书借阅系统,开发环境基于idea2020+mysql数据库,前端框架使用bootstrap4框架,完美了实现图书借阅系统,喜欢的朋友快来体验吧
    2021-05-05
  • 分布式之全面了解Kafka的使用与特性

    分布式之全面了解Kafka的使用与特性

    Kafka 是我工作多年使用最多的消息中间件 ,特点是拥有巨大吞吐量(数百万/秒),作为当下最流行的分布式,可水平扩展,可容错的“消息系统”,下面跟随小编看下分布式之全面了解Kafka的使用与特性
    2021-11-11

最新评论