聚焦IOC容器刷新环节obtainFreshBeanFactory初始化BeanFactory专项

一、IOC容器的刷新环节快速回顾

public abstract class AbstractApplicationContext implements ApplicationContext {
 
    @Override
    public void refresh() throws BeansException, IllegalStateException {
        synchronized (this.startupShutdownMonitor) {
            // 准备上下文环境,包括初始化工厂、后置处理器等
            prepareRefresh();
 
            // 创建并初始化 BeanFactory
            ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
 
            // 设置 BeanFactory 的类加载器、资源加载器等
            prepareBeanFactory(beanFactory);
 
            try {
                // 允许子类对 BeanFactory 进行进一步的自定义处理
                postProcessBeanFactory(beanFactory);
 
                // 调用 BeanFactoryPostProcessors 进行后置处理
                invokeBeanFactoryPostProcessors(beanFactory);
 
                // 注册 BeanPostProcessors,用于对 Bean 实例进行后置处理
                registerBeanPostProcessors(beanFactory);
 
                // 初始化消息源
                initMessageSource();
 
                // 初始化事件广播器
                initApplicationEventMulticaster();
 
                // 初始化其他特殊 Bean
                onRefresh();
 
                // 注册关闭钩子
                registerListeners();
 
                // 初始化所有剩余的单例 Bean
                finishBeanFactoryInitialization(beanFactory);
 
                // 完成上下文刷新
                finishRefresh();
            } catch (BeansException ex) {
                if (logger.isWarnEnabled()) {
                    logger.warn("Exception encountered during context initialization - " +
                            "cancelling refresh attempt: " + ex);
                }
                // 销毁已创建的 Bean,关闭容器
                destroyBeans();
                // 重置容器刷新标志,允许再次刷新
                cancelRefresh(ex);
                // 把异常重新抛出,允许调用者处理
                throw ex;
            } finally {
                // 重置已注册的 JVM 关闭钩子
                resetCommonCaches();
            }
        }
    }
}

二、创建并初始化BeanFactory-obtainFreshBeanFactory源码分析

(一)refreshBeanFactory

(二)getBeanFactory

三、Spring注解驱动配置方式来定义和管理Bean的obtainFreshBeanFactory

(一)常见注解回顾

@Component:标记一个类为Spring的组件,即一个Bean。

@Autowired:自动注入依赖

@Configuration:标记一个类为配置类,可以定义多个Bean

@Bean:声明一个Bean,由Spring容器管

@ComponentScan:指定要扫描的包,Spring会自动扫描这些包下的组件

(二)注解驱动中的具体实现obtainFreshBeanFactory

AnnotationConfigApplicationContext实现分析

 refreshBeanFactory

 getBeanFactory

四、Spring XML驱动 (XML-Driven) 配置方式来定义和管理Bean的obtainFreshBeanFactory

(一)基本配置和启动

(二)XML驱动 (XML-Driven) 具体实现obtainFreshBeanFactory

ClassPathXmlApplicationContext实现分析

 refreshBeanFactory

l oadBeanDefinitions

 getBeanFactory

五、obtainFreshBeanFactory总结

obtainFreshBeanFactory 方法总结:

刷新 BeanFactory:方法首先调用 refreshBeanFactory 方法,该方法负责刷新 BeanFactory。在这个过程中,旧的 BeanFactory 实例将被销毁,新的 BeanFactory 实例将被创建和初始化,确保了每次获取 BeanFactory 时都可以获取到最新的实例,从而保持应用程序的状态和配置的一致性。

获取 BeanFactory:方法接着调用 getBeanFactory 方法,该方法返回已经刷新的 BeanFactory 实例。如果在刷新 BeanFactory 过程中发生异常,可能会抛出 BeansException,应用程序可以根据需要进行处理。

返回 BeanFactory:最后,方法将获取到的 BeanFactory 实例返回给调用者,以便它可以在应用程序中使用,BeanFactory 是整个 Spring 应用程序的核心,它负责管理应用程序中的所有 Bean 实例。

总的来说,obtainFreshBeanFactory 方法的作用是确保每次获取 BeanFactory 时都可以获取到最新的、已经刷新的 BeanFactory 实例,从而保证了应用程序的状态和配置的一致性。
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/xiaofeng10330111/article/details/139667021

                        
原文链接:https://blog.csdn.net/xiaofeng10330111/article/details/139667021

  • 14
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值