Spring源码之obtainFreshBeanFactory()

发布于:2024-05-21 ⋅ 阅读:(95) ⋅ 点赞:(0)

在Spring框架中,obtainFreshBeanFactory 是一个关键方法,主要用于获取并初始化一个新的 BeanFactory 实例。这个方法通常在应用启动时被调用,以确保应用上下文能正确加载并管理所有配置的Spring Bean。具体来说,它包括以下主要功能:创建BeanFactory实例、加载Bean定义、刷新BeanFactory,并最终准备上下文环境。这个方法位于 AbstractApplicationContext 类中,是实现应用上下文初始化的重要步骤。

obtainFreshBeanFactory的作用

obtainFreshBeanFactory 方法的主要作用是:

  1. 创建新的BeanFactory实例:确保通过 BeanFactory 实例化和管理Spring Beans。
  2. 加载Bean定义:从配置源(如XML文件、Java配置类或注解)中读取并注册Bean定义。
  3. 刷新BeanFactory:确保BeanFactory处于一个干净、可用的状态,准备好创建和管理Bean实例。

obtainFreshBeanFactory的工作流程

以下是 obtainFreshBeanFactory 方法的具体实现步骤:

protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
    refreshBeanFactory(); // 1. 刷新BeanFactory
    ConfigurableListableBeanFactory beanFactory = getBeanFactory(); // 2. 获取新的BeanFactory实例
    return beanFactory;
}
1. refreshBeanFactory

这个方法由 AbstractRefreshableApplicationContext 类实现,负责实际刷新或创建 BeanFactory 实例。其主要步骤如下:

  • 关闭现有BeanFactory:如果已经存在一个 BeanFactory 实例,先销毁其内容以防内存泄漏。
  • 创建新的BeanFactory:调用 createBeanFactory 方法,生成一个新的 DefaultListableBeanFactory 实例。
  • 加载Bean定义:通过调用 loadBeanDefinitions 方法,将所有配置的Bean定义加载到BeanFactory中。
@Override
protected final void refreshBeanFactory() throws BeansException {
    if (hasBeanFactory()) {
        destroyBeans();
        closeBeanFactory();
    }
    try {
        DefaultListableBeanFactory beanFactory = createBeanFactory();
        loadBeanDefinitions(beanFactory);
        this.beanFactory = beanFactory;
    }
    catch (IOException ex) {
        throw new ApplicationContextException("I/O error parsing bean definition source for " + getDisplayName(), ex);
    }
}
  • createBeanFactory:创建一个新的 DefaultListableBeanFactory 实例。
  • loadBeanDefinitions:加载所有Bean定义,这通常是从XML配置文件或注解中读取的。
2. getBeanFactory

这个方法返回当前的 BeanFactory 实例。执行 refreshBeanFactory 后,获取的是新的、已经加载了所有Bean定义的BeanFactory。

@Override
public final ConfigurableListableBeanFactory getBeanFactory() {
    if (this.beanFactory == null) {
        throw new IllegalStateException("BeanFactory not initialized or already closed - call 'refresh' before accessing beans via the ApplicationContext.");
    }
    return this.beanFactory;
}

loadBeanDefinitions方法的详细功能描述

loadBeanDefinitions 方法的作用是将所有配置的Bean定义加载到BeanFactory中。该方法通常由具体的子类实现,如 AbstractXmlApplicationContext,以从特定的配置源(如XML文件)读取Bean定义。

其主要步骤包括:

  1. 定位配置源:确定Bean定义配置的具体位置。
  2. 读取Bean定义:通过解析配置源(如XML解析)读取Bean定义信息。
  3. 注册Bean定义:将读取到的Bean定义注册到 BeanFactory 中。

以下是一个简化的 loadBeanDefinitions 方法示例:

protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws BeansException, IOException {
    // 获取Bean定义资源位置
    Resource[] configResources = getConfigResources();
    if (configResources != null) {
        XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);
        reader.loadBeanDefinitions(configResources);
    }
}
  • getConfigResources:获取配置资源的位置。
  • XmlBeanDefinitionReader:负责从XML配置文件中读取Bean定义。
  • loadBeanDefinitions:将读取到的Bean定义加载到 BeanFactory 中。

相关类和接口

  1. AbstractApplicationContext:Spring应用上下文的基础抽象类,定义了刷新上下文、获取BeanFactory等核心方法。
  2. AbstractRefreshableApplicationContext:继承自 AbstractApplicationContext,实现了 refreshBeanFactory 方法,管理 BeanFactory 实例的创建和刷新。
  3. ConfigurableListableBeanFactory:Spring中BeanFactory的一个配置接口,允许对BeanFactory进行配置和后处理。
  4. DefaultListableBeanFactory:Spring默认的BeanFactory实现,支持所有标准的Spring IOC容器功能。
  5. XmlBeanDefinitionReader:负责从XML文件中读取并注册Bean定义。

总结

obtainFreshBeanFactory 是Spring框架中用于初始化和刷新应用上下文中 BeanFactory 的关键方法。它通过调用 refreshBeanFactory 方法,确保 BeanFactory 实例是最新的,并载入所有的Bean定义。涉及的主要方法包括 refreshBeanFactorygetBeanFactory,相关的核心类有 AbstractApplicationContextAbstractRefreshableApplicationContextConfigurableListableBeanFactoryDefaultListableBeanFactory。此外,loadBeanDefinitions 方法负责具体加载和注册Bean定义,确保BeanFactory能够正确管理应用中的所有Bean。这些方法和类共同确保Spring应用上下文能够正确初始化和管理Bean的生命周期。