站群seo技巧科技公司企业网站建设

张小明 2026/1/9 9:53:34
站群seo技巧,科技公司企业网站建设,深圳市工商注册信息查询网站,wordpress 4.2 emojiSpring Boot 启动流程源码解析#xff1a;从 main() 到 Web 服务就绪 一句 SpringApplication.run() 背后#xff0c;藏着整个 Spring 生态的启动引擎。 你是否曾#xff1a; 在面试被问#xff1a;“Spring Boot 启动过程做了哪些事#xff1f;”遇到启动慢、Bean 找不到…Spring Boot 启动流程源码解析从main()到 Web 服务就绪一句SpringApplication.run()背后藏着整个 Spring 生态的启动引擎。你是否曾在面试被问“Spring Boot 启动过程做了哪些事”遇到启动慢、Bean 找不到、配置不生效等问题却无从下手想自定义启动行为如动态加载配置、埋点监控但不知从何切入答案都在SpringApplication.run()的源码里。今天我们就逐行拆解 Spring Boot 3.x兼容 2.x的启动主流程带你从main()方法一路走到内嵌 Tomcat 启动完成一、入口main()方法SpringBootApplication public class MyApp { public static void main(String[] args) { SpringApplication.run(MyApp.class, args); } }看似简单实则调用了SpringApplication的静态方法// SpringApplication.java public static ConfigurableApplicationContext run(Class? primarySource, String... args) { return run(new Class?[] { primarySource }, args); } public static ConfigurableApplicationContext run(Class?[] primarySources, String[] args) { return new SpringApplication(primarySources).run(args); }✅关键点先构造SpringApplication实例再调用其run()方法。二、阶段 1构造SpringApplication对象public SpringApplication(ResourceLoader resourceLoader, Class?... primarySources) { this.resourceLoader resourceLoader; Assert.notNull(primarySources, PrimarySources must not be null); this.primarySources new LinkedHashSet(Arrays.asList(primarySources)); // 1. 推断应用类型SERVLET / REACTIVE / NONE this.properties.setWebApplicationType(WebApplicationType.deduceFromClasspath()); // 2. 从 spring.factories 加载 BootstrapRegistryInitializer this.bootstrapRegistryInitializers new ArrayList( getSpringFactoriesInstances(BootstrapRegistryInitializer.class)); // 3. 从 spring.factories 加载 ApplicationContextInitializer setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class)); // 4. 从 spring.factories 加载 ApplicationListener setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class)); // 5. 推断主配置类即包含 main 方法的类 this.mainApplicationClass deduceMainApplicationClass(); } 核心动作推断 Web 类型SERVLETclasspath 中存在 Spring MVC 相关类如 DispatcherServlet REACTIVE存在 WebFlux 相关类如 DispatcherHandler NONE非 Web 应用如批处理、定时任务加载扩展点通过SpringFactoriesLoader读取META-INF/spring.factories中的 SPI 实现。 这就是 Spring Boot自动装配和扩展机制的起点。三、阶段 2执行run(args)—— 启动主流程这是最核心的方法我们分步解析步骤 1准备监听器SpringApplicationRunListeners listeners getRunListeners(args); listeners.starting(bootstrapContext, this.mainApplicationClass);getRunListeners()返回所有SpringApplicationRunListener实例默认是EventPublishingRunListenerstarting()发布ApplicationStartingEvent→ 可用于早期日志初始化、APM 埋点步骤 2准备 Environment环境DefaultBootstrapContext bootstrapContext createBootstrapContext(); ConfigurableEnvironment environment prepareEnvironment(listeners, bootstrapContext, applicationArguments);在prepareEnvironment()中创建EnvironmentStandardServletEnvironment调用environmentPrepared()→ 发布ApplicationEnvironmentPreparedEvent此时application.properties已加载实战价值Nacos/Apollo 客户端在此阶段注入远程配置步骤 3创建 ApplicationContext应用上下文context createApplicationContext();根据webApplicationType选择上下文类型SERVLET→AnnotationConfigServletWebServerApplicationContextREACTIVE→AnnotationConfigReactiveWebServerApplicationContext该上下文继承自GenericApplicationContext并具备内嵌 Web 容器支持。步骤 4准备上下文prepareContext(bootstrapContext, context, environment, listeners, applicationArguments, printedBanner);内部关键操作注册bannerBean应用所有ApplicationContextInitializer发布ApplicationContextInitializedEvent⚠️ 注意此时Bean 还未实例化只是定义已加载。步骤 5刷新上下文Refresh—— 最重量级阶段refreshContext(context);最终调用AbstractApplicationContext.refresh()Spring Framework 的核心方法Override public void refresh() throws BeansException, IllegalStateException { synchronized (this.startupShutdownMonitor) { // 1. 准备刷新记录启动时间、设置活跃状态 prepareRefresh(); // 2. 获取 BeanFactory通常是 DefaultListableBeanFactory ConfigurableListableBeanFactory beanFactory obtainFreshBeanFactory(); // 3. 配置 BeanFactory设置类加载器、表达式解析器等 prepareBeanFactory(beanFactory); // 4. 执行 BeanFactoryPostProcessor如 ConfigurationProperties 绑定 invokeBeanFactoryPostProcessors(beanFactory); // 5. 注册 BeanPostProcessor registerBeanPostProcessors(beanFactory); // 6. 初始化 MessageSource国际化 initMessageSource(); // 7. 初始化事件广播器 initApplicationEventMulticaster(); // 8. 【模板方法】子类可扩展如 ServletWebServerApplicationContext 会在此启动内嵌容器 onRefresh(); // 9. 注册监听器 registerListeners(); // 10. 实例化所有非懒加载的单例 Bean finishBeanFactoryInitialization(beanFactory); // 11. 完成刷新发布 ContextRefreshedEvent finishRefresh(); } } 重点子阶段解析invokeBeanFactoryPostProcessors→ConfigurationClassPostProcessor扫描Component、Bean解析自动配置类spring.factories中的EnableAutoConfigurationonRefresh()在 Servlet 上下文中Override protected void onRefresh() { super.onRefresh(); try { createWebServer(); // 启动内嵌 Tomcat/Jetty } }finishBeanFactoryInitialization→ 调用preInstantiateSingletons()触发所有单例 Bean 的创建包括依赖注入、PostConstruct步骤 6执行 Runner 启动完成/ 执行 CommandLineRunner / ApplicationRunner callRunners(context, applicationArguments);✅ 此时服务已完全就绪可处理请求四、启动流程全景图简化版ain() ↓ new SpringApplication() ├── 推断 Web 类型 ├── 加载 Initializers Listeners ↓ run(args) ├── starting() → ApplicationStartingEvent ├── prepareEnvironment() → 加载 application.properties ├── createApplicationContext() ├── prepareContext() → 注册主配置类 ├── refreshContext() │ ├── invokeBeanFactoryPostProcessors → 自动配置生效 │ ├── onRefresh() → 启动内嵌 Web 容器 │ └── finishBeanFactoryInitialization → 初始化所有 Bean ├── callRunners() → 执行启动后任务五、学源码有什么用实战场景举例场景利用的启动阶段扩展方式动态加载远程配置environmentPrepared实现EnvironmentPostProcessor启动耗时分析starting()/running()自定义SpringApplicationRunListener服务注册延迟ContextRefreshedEvent后监听事件确保 Bean 全部就绪自定义 BannerprepareContext阶段实现Banner接口避免循环依赖报错理解finishBeanFactoryInitialization顺序调整依赖关系或使用Lazy关注我每天5分钟带你从 Java 小白变身编程高手 点赞 关注让更多小伙伴一起进步
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

杭州专业网站建设东莞汽车总站停止营业

5分钟掌握PyTorch SuperPoint:终极图像特征点检测指南 【免费下载链接】pytorch-superpoint 项目地址: https://gitcode.com/gh_mirrors/py/pytorch-superpoint 想要让计算机像人类一样"看懂"图像中的关键特征点吗?🤔 PyTo…

张小明 2026/1/6 3:12:30 网站建设

安徽安搜做的网站怎么样seo薪酬

PPTist是一款基于Vue 3.x和TypeScript技术栈开发的在线演示文稿制作工具,完美复刻了Office PowerPoint的核心编辑功能。无论你是技术开发者还是普通用户,这份完整教程都能帮助你在最短时间内搭建起属于自己的在线PPT编辑平台。 【免费下载链接】PPTist 基…

张小明 2026/1/3 18:05:20 网站建设

wordpress 建站插件王占山人物简介

EldenRingSaveCopier终极教程:轻松实现存档安全迁移 【免费下载链接】EldenRingSaveCopier 项目地址: https://gitcode.com/gh_mirrors/el/EldenRingSaveCopier 还在为艾尔登法环存档丢失而烦恼吗?当你更换电脑、重装系统或游戏版本更新时&#…

张小明 2026/1/3 12:23:52 网站建设

汕头网站建设制作公司wordpress后台界面样式

Excalidraw手绘风格背后的算法原理揭秘 在一场紧张的产品评审会上,工程师用鼠标拖拽出一张工整的架构图,会议室却陷入沉默——太“完美”了,反而让人不敢开口提意见。而当另一个人随手画出几条歪歪扭扭的线条,大家却立刻围上来讨…

张小明 2026/1/6 13:29:05 网站建设

广告设计策划公司广州seo群

在学术探索的浩瀚星空中,每一位即将完成本科或硕士学业的学生,都像是手持罗盘的航海家,面对论文写作这片未知海域,既充满期待又难免忐忑。选题迷茫、文献梳理耗时、逻辑构建混乱、语言表达不专业……这些问题如同暗礁,…

张小明 2026/1/3 16:44:05 网站建设

百度竞价设不同网站扒wordpress

微服务架构:原理、实践与.NET Core 开发 1. 微服务架构概述 微服务应用开发在软件行业正迅速发展,广泛用于开发具有弹性、可扩展、分布式且支持云的高性能应用。许多组织和软件公司正将其应用转变为微服务架构风格,像亚马逊、eBay 和优步就是成功转型的例子。 微服务将应…

张小明 2026/1/7 7:47:27 网站建设