【HBZ分享】Spring启动时核心refresh方法流程
Spring容器启动的核心方法是refresh
,它定义在AbstractApplicationContext
类中,并被ClassPathXmlApplicationContext
、AnnotationConfigApplicationContext
等多个容器类继承和使用。
下面是refresh
方法的简化版流程:
@Override
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
// 准备环境,例如设置环境属性,添加应用监听器等
prepareRefresh();
// 创建BeanFactory,这是Spring读取配置文件,解析Bean定义的地方
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// 对BeanFactory进行功能增强,例如类型转换器,属性编辑器等
prepareBeanFactory(beanFactory);
try {
// 允许在BeanFactory创建Bean之前,进行自定义的BeanPostProcessor注册或者其他操作
postProcessBeanFactory(beanFactory);
// 调用在BeanFactory中标记为要执行的BeanPostProcessor的postProcessBeanFactory方法
invokeBeanFactoryPostProcessors(beanFactory);
// 注册BeanPostProcessor,这是Spring管理的Bean生命周期中的关键步骤
registerBeanPostProcessors(beanFactory);
// 初始化消息源,用于国际化
initMessageSource();
// 初始化事件派发器,用于应用事件的监听和处理
initApplicationEventMulticaster();
// 允许在Bean定义加载之后,Bean实例化之前,进行自定义操作
onRefresh();
// 在所有注册的Bean定义中注册监听器,并将其注册到事件多播器
registerListeners();
// 初始化所有的单例Bean
finishBeanFactoryInitialization(beanFactory);
// 完成容器的启动,通知监听器,发布应用上下文启动完成的事件
finishRefresh();
} catch (BeansException ex) {
// 如果在启动过程中出现异常,则进行错误处理,释放已经创建的单例Bean
destroyBeans();
// 重新抛出异常
throw ex;
}
}
}
这个流程展示了Spring容器从启动到Bean初始化的主要步骤。每个步骤都可能会触发一些特定的操作,比如注册BeanPostProcessor,这是Spring框架用来拦截Bean的创建过程,从而实现AOP或者其他功能的关键。
评论已关闭