php网站开发开发网站教程网站建设意义和作用

张小明 2026/1/13 7:06:34
php网站开发开发网站教程,网站建设意义和作用,为什么电脑有些网页打不开,医疗软件网站建设公司排名Spring 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进行投诉反馈,一经查实,立即删除!

金富通青岛建设工程有限公司网站适合做装饰公司的名字

在《最终幻想XIV》的游戏生态中,Dalamud作为一款功能强大的插件开发框架,为开发者提供了与游戏深度交互的能力。这个基于.NET Core构建的系统通过多层架构实现了对游戏数据的实时访问和界面增强,让玩家能够自定义游戏体验。 【免费下载链接】…

张小明 2026/1/1 18:40:45 网站建设

苏州做网站公司乛 苏州聚尚网络网站开发前端学习

第一章:Open-AutoGLM是用图片识别吗Open-AutoGLM 并不是一个专注于图像识别的模型,而是基于多模态大语言模型(Multimodal LLM)架构设计的通用智能系统,能够理解文本与图像双模态输入,但其核心能力更偏向于语…

张小明 2026/1/9 16:40:19 网站建设

网站开发工程师薪资个人网站设计文字内容模板

Langchain-Chatchat:构建企业级根因分析知识平台的技术实践 在 IT 运维、工业设备维护乃至金融风控等高可靠性场景中,面对突发故障时如何快速定位“根本原因”(Root Cause),一直是组织效率的关键瓶颈。传统方式依赖专家…

张小明 2026/1/12 13:18:53 网站建设

水处理网站源码家装设计软件哪个好用

ClickHouse分布式表原理深度解析:大数据分片存储与查询的底层逻辑 一、引言:为什么需要分布式表? 1.1 大数据时代的存储与查询痛点 假设你是一家电商公司的大数据工程师,负责处理每天10亿条用户行为数据(点击、收藏…

张小明 2026/1/13 0:16:07 网站建设

网站建设宽带手机网站怎么上传图片

毕业设计实战:基于SSMMySQL的校园外卖服务系统设计与实现,从需求到上线全流程指南! 当初做校园外卖系统毕设时,光“外卖订单”和“购物车”的数据同步就卡了3天——购物车结算时库存没校验,导致超卖,导师一…

张小明 2026/1/9 15:39:27 网站建设

ps扩展插件网站seo引擎搜索入口

本文详细解析了AI Agent与传统AI系统的区别,深入介绍了其核心架构(感知环境、自主决策、执行行动、持续学习)及ReAct循环机制和分层记忆系统。文章系统梳理了AI Agent的适用场景(智能客服、自动化运维等),并…

张小明 2026/1/9 8:31:07 网站建设