Spring启动前言本文摘要 Spring启动的核心流程围绕ApplicationContext的初始化展开主要分为以下几个阶段准备阶段 - 初始化环境属性和监听器BeanFactory创建 - 构建DefaultListableBeanFactory并加载BeanDefinitions后处理阶段 - 执行BeanFactoryPostProcessors和注册BeanPostProcessors功能初始化 - 设置国际化消息源、事件广播器等Bean实例化 - 完成单例Bean的创建和初始化完成阶段 - 发布上下文刷新事件整个流程通过refresh()方法组织包含同步控制、异常处理和缓存重置等保障机制采用模板方法模式允许子类扩展特定步骤。核心在于BeanDefinition的加载解析和单例Bean的延迟初始化机制。流程图如下1、Spring启动核心是ApplicationContext 的初始化过程主要包含以下阶段1.构造BeanFactory对象2.解析配置类得到BeanDefiniton并注册到BeanFactory中a.解析ComponentScan完成扫描b.解析Beanc…3.Spring支持国际化还要初始化initMessageSource对象4.还支持事件初始化 initApplicationEventMulticaster5.子类模版方法6.创建非懒加载的单例Bean并存放单例池里面a.三级缓存b.include 、exclude7.发布 ContextRefreshedEvent 事件2、refresh() 核心代码讲解org.springframework.context.support.AbstractApplicationContext#refreshOverride publicvoidrefresh()throws BeansException,IllegalStateException{synchronized(this.startupShutdownMonitor){StartupStep contextRefreshthis.applicationStartup.start(spring.context.refresh);// Prepare this context for refreshing.// 准备阶段 // 1. 准备刷新上下文prepareRefresh();// 2.创建 / 获取BeanFactoryConfigurableListableBeanFactory beanFactoryobtainFreshBeanFactory();// BeanFactory 准备阶段 // 3. 准备 BeanFactory 配置标准功能prepareBeanFactory(beanFactory);try{// 4.允许子类对BeanFactory 进行后置处理postProcessBeanFactory(beanFactory);StartupStep beanPostProcessthis.applicationStartup.start(spring.context.beans.post-process);// BeanDefinition 加载阶段 // 5.调用BeanFactoryPostProcessorsinvokeBeanFactoryPostProcessors(beanFactory);// scanner.scan()// 6.注册BeanPostProcessorregisterBeanPostProcessors(beanFactory);beanPostProcess.end();// 消息、事件、监听器初始化 // 7.初始化MessageSource(国际化)initMessageSource();// 8.初始化事件广播器initApplicationEventMulticaster();// 9.模版方法子类可扩展onRefresh();// 10.注册监听器registerListeners();// Bean 实例化阶段 // 11.完成BeanFactory初始化实例化所有单例BeanfinishBeanFactoryInitialization(beanFactory);// 12.完成刷新发布 ContextRefreshedEventfinishRefresh();}catch(BeansException ex){if(logger.isWarnEnabled()){logger.warn(Exception encountered during context initialization - cancelling refresh attempt: ex);}// Destroy already created singletons to avoid dangling resources.// 13.销毁已创建的BeandestroyBeans();// Reset active flag.// 14. 取消已创建的BeancancelRefresh(ex);// Propagate exception to caller.throw ex;}finally{// Reset common introspection caches in Springs core, since we// might not ever need metadata for singleton beans anymore...// 15.重置Spring核心常见缓存resetCommonCaches();contextRefresh.end();}}}3、各阶段详解1准备刷新 - prepareRefresh()protectedvoidprepareRefresh(){// 1.记录启动时间this.startupDateSystem.currentTimeMillis();this.closed.set(false);this.active.set(true);if(logger.isDebugEnabled()){if(logger.isTraceEnabled()){logger.trace(Refreshing this);}else{logger.debug(Refreshing getDisplayName());}}// 2.初始化属性源 (property source)initPropertySources();// 3.验证必须属性getEnvironment().validateRequiredProperties();if(this.earlyApplicationListenersnull){this.earlyApplicationListenersnew LinkedHashSet(this.applicationListeners);}else{this.applicationListeners.clear();this.applicationListeners.addAll(this.earlyApplicationListeners);}// 4.存储早期事件this.earlyApplicationEventsnew LinkedHashSet();}2获取BeanFactory - obtainFreshBeanFactory()protected ConfigurableListableBeanFactoryobtainFreshBeanFactory(){// 1.刷新 BeanFactoryrefreshBeanFactory();// 2.获取新创建的BeanFactoryreturngetBeanFactory();}// org.springframework.context.support.AbstractRefreshableApplicationContext#refreshBeanFactoryOverride protected finalvoidrefreshBeanFactory()throws BeansException{if(hasBeanFactory()){destroyBeans();closeBeanFactory();}try{// 1.创建 DefaultListableBeanFactoryDefaultListableBeanFactory beanFactorycreateBeanFactory();// 2.设置序列化IDbeanFactory.setSerializationId(getId());customizeBeanFactory(beanFactory);// 3.加载BeanDefinitions(核心)loadBeanDefinitions(beanFactory);this.beanFactorybeanFactory;}catch(IOException ex){throw newApplicationContextException(I/O error parsing bean definition source for getDisplayName(),ex);}}3调用 BeanFactoryPostProcessor - invokeBeanFactoryPostProcessorsprotectedvoidinvokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory){// 1.获取所有BeanFactoryPostProcessorPostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory,getBeanFactoryPostProcessors());if(!NativeDetector.inNativeImage()beanFactory.getTempClassLoader()nullbeanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)){beanFactory.addBeanPostProcessor(newLoadTimeWeaverAwareProcessor(beanFactory));beanFactory.setTempClassLoader(newContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));}}4注册 BeanPostProcessor - registerBeanPostProcessors()protectedvoidregisterBeanPostProcessors(ConfigurableListableBeanFactory beanFactory){PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory,this);// 按优先级注册// 1.BeanPostProcessorChecker// 2.PriorityOrdered 接口的 BeanPostProcessor// 3.Ordered 接口的 BeanPostProcessor// 4.普通的BeanPostProcessor// 5.内部使用的BeanPostProcessor}5完成BeanFactory初始化 - finishBeanFactoryInitialization()protectedvoidfinishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory){// 1.初始化 ConversionService 类型转换if(beanFactory.containsBean(CONVERSION_SERVICE_BEAN_NAME)beanFactory.isTypeMatch(CONVERSION_SERVICE_BEAN_NAME,ConversionService.class)){beanFactory.setConversionService(beanFactory.getBean(CONVERSION_SERVICE_BEAN_NAME,ConversionService.class));}// 2.注册默认的字符串解析器if(!beanFactory.hasEmbeddedValueResolver()){beanFactory.addEmbeddedValueResolver(strVal-getEnvironment().resolvePlaceholders(strVal));}// 3.初始化LoadTimeWeaverAware AOP 相关String[]weaverAwareNamesbeanFactory.getBeanNamesForType(LoadTimeWeaverAware.class,false,false);for(String weaverAwareName:weaverAwareNames){getBean(weaverAwareName);}// 4.停止使用临时类加载器beanFactory.setTempClassLoader(null);// 5.冻结配置 不允许再修改BeanDefinitionbeanFactory.freezeConfiguration();// 实例化非懒加载的单例Bean (最核心)beanFactory.preInstantiateSingletons();}6完成刷新 - finnishRefresh()protectedvoidfinishRefresh(){// 1.清除上下文资源缓存clearResourceCaches();// 2.初始化 LifecycleProcessorinitLifecycleProcessor();// 3.启动 LifecycleProcessorgetLifecycleProcessor().onRefresh();// 4.发布 ContextRefreshedEvent 事件publishEvent(newContextRefreshedEvent(this));// 5.注册到 LiveBeansViewif(!NativeDetector.inNativeImage()){LiveBeansView.registerApplicationContext(this);}}喜欢我的文章记得点个在看或者点赞持续更新中ing…