一、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