day09 - Spring启动
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…

相关新闻

企业级流浪动物救助网站管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】

企业级流浪动物救助网站管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】

摘要 随着城市化进程的加速,流浪动物问题日益突出,成为社会关注的焦点。传统救助方式因信息不透明、资源分散等问题难以高效运作,亟需数字化解决方案。企业级流浪动物救助网站管理系统旨在通过技术手段整合救助资源,提升救助效率…

2026/5/17 4:50:26 阅读更多 →
外包项目管理难题,XinServer 帮你全搞定

外包项目管理难题,XinServer 帮你全搞定

外包项目管理难题,XinServer 帮你全搞定 最近跟几个做外包的朋友聊天,大家吐槽最多的就是:“这项目后端又要延期了!” 要么是后端兄弟忙不过来,要么是数据库设计反复改,要么是服务器部署一堆坑。一个简单的…

2026/7/3 5:28:41 阅读更多 →
Java SpringBoot+Vue3+MyBatis 中山社区医疗综合服务平台系统源码|前后端分离+MySQL数据库

Java SpringBoot+Vue3+MyBatis 中山社区医疗综合服务平台系统源码|前后端分离+MySQL数据库

摘要 随着信息技术的快速发展,社区医疗服务在提升居民健康管理水平中的作用日益凸显。传统社区医疗服务存在信息孤岛、效率低下、资源分配不均等问题,难以满足居民日益增长的医疗健康需求。中山社区医疗综合服务平台旨在通过信息化手段整合医疗资源&…

2026/5/17 4:50:25 阅读更多 →

最新新闻

晋城酿造食品厂净化板如何选才能解决墙面难题

晋城酿造食品厂净化板如何选才能解决墙面难题

晋城本地特色食品以粮食醋发酵、杂粮深加工、小型卤味加工为主,大量酿造车间会长期挥发酸性气体,食品净化车间、无尘厂房改造经常遇到墙面腐蚀掉皮的困扰,和普通车间工况有明显区别,照搬通用板材很容易短期报废。 本地多家醋业厂房…

2026/7/3 14:45:10 阅读更多 →
HASL喷锡适配焊盘、孔径、板材、布局标准化设计规范

HASL喷锡适配焊盘、孔径、板材、布局标准化设计规范

HASL 批量生产出现堵孔、锡桥、露铜、焊盘共面度差、板材起泡翘曲等缺陷,七成根源并非制程管控问题,而是前期 PCB 布局、焊盘、孔径、板材选型未匹配喷锡工艺特性,设计先天存在 DFM 缺陷。本文从板材选型、焊盘结构、通孔孔径、大面积铜设计、…

2026/7/3 14:43:09 阅读更多 →
Kiran-Screensaver源代码架构分析:理解Qt屏保实现原理

Kiran-Screensaver源代码架构分析:理解Qt屏保实现原理

Kiran-Screensaver源代码架构分析:理解Qt屏保实现原理 【免费下载链接】kiran-screensaver This program provides screensaver backend. 项目地址: https://gitcode.com/openeuler/kiran-screensaver 前往项目官网免费下载:https://ar.openeuler…

2026/7/3 14:41:08 阅读更多 →
lboot单元测试实践:使用lboot-test-runner验证功能正确性

lboot单元测试实践:使用lboot-test-runner验证功能正确性

lboot单元测试实践:使用lboot-test-runner验证功能正确性 【免费下载链接】lboot a lightweight bootloader implemented by the Rust language 项目地址: https://gitcode.com/openeuler/lboot 前往项目官网免费下载:https://ar.openeuler.org/a…

2026/7/3 14:41:08 阅读更多 →
嵌入式开发笔记:CANopen相关移位运算与通信协议术语详解

嵌入式开发笔记:CANopen相关移位运算与通信协议术语详解

目录一、移位相关问题1.1 类型提升规则1.2 移位运算注意事项1.3 N位编码满量程值二、简称和符号含义2.1 通信协议相关**FDCAN****HSE****PLL****PCLK**2.2 CANopen 相关术语**PDO****SDO****PDO vs SDO 对比表****cob_id****CoE****BRS**2.3 数学符号三、交流与反馈欢迎大家有问…

2026/7/3 14:39:04 阅读更多 →
13DOF传感器与TM4C1299KCZAD的高精度定位系统设计

13DOF传感器与TM4C1299KCZAD的高精度定位系统设计

1. 项目背景与核心需求 在工业自动化、机器人导航和智能穿戴设备领域,精确的定位与运动追踪一直是技术难点。传统方案往往采用独立的惯性测量单元(IMU)与主控芯片分离的设计,导致系统延迟高、数据同步困难。这个项目创新性地将13自由度(13DOF)传感器与TM…

2026/7/3 14:39:04 阅读更多 →

日新闻

Nginx防御TLS重协商攻击实战:从原理到配置与监控

Nginx防御TLS重协商攻击实战:从原理到配置与监控

1. 项目概述:为什么TLS重协商攻击至今仍需警惕十多年前的CVE-2011-1473,一个关于TLS/SSL协议重协商机制的漏洞,现在提起来还有必要吗?很多运维和开发朋友可能会觉得,这都老掉牙了,现代服务器和客户端不都默…

2026/7/3 0:03:59 阅读更多 →
华为防火墙双通道远程管理实战:Web与SSH配置详解

华为防火墙双通道远程管理实战:Web与SSH配置详解

1. 项目概述:为什么需要双通道远程管理防火墙?在任何一个稍具规模的企业网络里,防火墙都是那个默默守护在边界的关键角色。作为网络工程师,我们不可能每次都跑到机房,插上console线去配置它。远程管理能力,…

2026/7/3 0:03:59 阅读更多 →
AD74413R与PIC18F65K40的高精度工业数据采集方案

AD74413R与PIC18F65K40的高精度工业数据采集方案

1. 项目概述:AD74413R与PIC18F65K40的协同工作在工业自动化和精密测量领域,同时实现高精度模数转换(ADC)和数模转换(DAC)功能是许多复杂系统的核心需求。AD74413R作为一款四通道可配置模拟输入/输出器件,与PIC18F65K40微控制器的组合&#xf…

2026/7/3 0:05:59 阅读更多 →

周新闻

月新闻