97色伦色在线综合视频,无玛专区,18videosex性欧美黑色,日韩黄色电影免费在线观看,国产精品伦理一区二区三区,在线视频欧美日韩,亚洲欧美在线中文字幕不卡

兩學一做 網站房價成交數(shù)據(jù)官網查詢

鶴壁市浩天電氣有限公司 2026/01/22 08:20:34
兩學一做 網站,房價成交數(shù)據(jù)官網查詢,wordpress 關閉邊欄,網站建設的培訓的感受Spring Boot 啟動流程源碼解析#xff1a;從 main() 到 Web 服務就緒 一句 SpringApplication.run() 背后#xff0c;藏著整個 Spring 生態(tài)的啟動引擎。 你是否曾#xff1a; 在面試被問#xff1a;“Spring Boot 啟動過程做了哪些事#xff1f;”遇到啟動慢、Bean 找不到…Spring Boot 啟動流程源碼解析從main()到 Web 服務就緒一句SpringApplication.run()背后藏著整個 Spring 生態(tài)的啟動引擎。你是否曾在面試被問“Spring Boot 啟動過程做了哪些事”遇到啟動慢、Bean 找不到、配置不生效等問題卻無從下手想自定義啟動行為如動態(tài)加載配置、埋點監(jiān)控但不知從何切入答案都在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的靜態(tài)方法// 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 實現(xiàn)。 這就是 Spring Boot自動裝配和擴展機制的起點。三、階段 2執(zhí)行run(args)—— 啟動主流程這是最核心的方法我們分步解析步驟 1準備監(jiān)聽器SpringApplicationRunListeners listeners getRunListeners(args); listeners.starting(bootstrapContext, this.mainApplicationClass);getRunListeners()返回所有SpringApplicationRunListener實例默認是EventPublishingRunListenerstarting()發(fā)布ApplicationStartingEvent→ 可用于早期日志初始化、APM 埋點步驟 2準備 Environment環(huán)境DefaultBootstrapContext bootstrapContext createBootstrapContext(); ConfigurableEnvironment environment prepareEnvironment(listeners, bootstrapContext, applicationArguments);在prepareEnvironment()中創(chuàng)建EnvironmentStandardServletEnvironment調用environmentPrepared()→ 發(fā)布ApplicationEnvironmentPreparedEvent此時application.properties已加載實戰(zhàn)價值Nacos/Apollo 客戶端在此階段注入遠程配置步驟 3創(chuàng)建 ApplicationContext應用上下文context createApplicationContext();根據(jù)webApplicationType選擇上下文類型SERVLET→AnnotationConfigServletWebServerApplicationContextREACTIVE→AnnotationConfigReactiveWebServerApplicationContext該上下文繼承自GenericApplicationContext并具備內嵌 Web 容器支持。步驟 4準備上下文prepareContext(bootstrapContext, context, environment, listeners, applicationArguments, printedBanner);內部關鍵操作注冊bannerBean應用所有ApplicationContextInitializer發(fā)布ApplicationContextInitializedEvent?? 注意此時Bean 還未實例化只是定義已加載。步驟 5刷新上下文Refresh—— 最重量級階段refreshContext(context);最終調用AbstractApplicationContext.refresh()Spring Framework 的核心方法Override public void refresh() throws BeansException, IllegalStateException { synchronized (this.startupShutdownMonitor) { // 1. 準備刷新記錄啟動時間、設置活躍狀態(tài) prepareRefresh(); // 2. 獲取 BeanFactory通常是 DefaultListableBeanFactory ConfigurableListableBeanFactory beanFactory obtainFreshBeanFactory(); // 3. 配置 BeanFactory設置類加載器、表達式解析器等 prepareBeanFactory(beanFactory); // 4. 執(zhí)行 BeanFactoryPostProcessor如 ConfigurationProperties 綁定 invokeBeanFactoryPostProcessors(beanFactory); // 5. 注冊 BeanPostProcessor registerBeanPostProcessors(beanFactory); // 6. 初始化 MessageSource國際化 initMessageSource(); // 7. 初始化事件廣播器 initApplicationEventMulticaster(); // 8. 【模板方法】子類可擴展如 ServletWebServerApplicationContext 會在此啟動內嵌容器 onRefresh(); // 9. 注冊監(jiān)聽器 registerListeners(); // 10. 實例化所有非懶加載的單例 Bean finishBeanFactoryInitialization(beanFactory); // 11. 完成刷新發(fā)布 ContextRefreshedEvent finishRefresh(); } } 重點子階段解析invokeBeanFactoryPostProcessors→ConfigurationClassPostProcessor掃描Component、Bean解析自動配置類spring.factories中的EnableAutoConfigurationonRefresh()在 Servlet 上下文中Override protected void onRefresh() { super.onRefresh(); try { createWebServer(); // 啟動內嵌 Tomcat/Jetty } }finishBeanFactoryInitialization→ 調用preInstantiateSingletons()觸發(fā)所有單例 Bean 的創(chuàng)建包括依賴注入、PostConstruct步驟 6執(zhí)行 Runner 啟動完成/ 執(zhí)行 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() → 執(zhí)行啟動后任務五、學源碼有什么用實戰(zhàn)場景舉例場景利用的啟動階段擴展方式動態(tài)加載遠程配置environmentPrepared實現(xiàn)EnvironmentPostProcessor啟動耗時分析starting()/running()自定義SpringApplicationRunListener服務注冊延遲ContextRefreshedEvent后監(jiān)聽事件確保 Bean 全部就緒自定義 BannerprepareContext階段實現(xiàn)Banner接口避免循環(huán)依賴報錯理解finishBeanFactoryInitialization順序調整依賴關系或使用Lazy關注我每天5分鐘帶你從 Java 小白變身編程高手 點贊 關注讓更多小伙伴一起進步
版權聲明: 本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若內容造成侵權/違法違規(guī)/事實不符,請聯(lián)系我們進行投訴反饋,一經查實,立即刪除!

網站建設工作計劃表河南企業(yè)網站定制

網站建設工作計劃表,河南企業(yè)網站定制,瀏覽器游戲網址,廣告公司簡介簡短大氣Kotaemon慢性病監(jiān)測助手#xff1a;血糖/血壓趨勢分析 在糖尿病和高血壓患者日常管理中#xff0c;一個普遍卻棘手的問

2026/01/21 16:09:01

公司推廣宣傳文案seo排名優(yōu)化技巧

公司推廣宣傳文案,seo排名優(yōu)化技巧,關鍵詞優(yōu)化seo優(yōu)化排名,湛江網站制作公司ComfyUI與Midjourney有何不同#xff1f;本地化優(yōu)勢解析 在AI圖像生成工具遍地開花的今天#xff0c

2026/01/21 15:59:01

福州朝陽房產網站建設軟件工程在網站建設

福州朝陽房產網站建設,軟件工程在網站建設,seo云優(yōu)化軟件,怎么在網上開店Keil5實戰(zhàn)指南#xff1a;如何用多模塊工程管理打造專業(yè)級嵌入式項目你有沒有遇到過這樣的場景#xff1f;改一行LED驅動

2026/01/21 19:16:01

建設網站的子文件夾wordpress 邀請注冊

建設網站的子文件夾,wordpress 邀請注冊,深圳提供網站建設服務平臺,網站建設合同繳印花稅Wan2.2-T2V-A14B模型對GPU算力的需求與優(yōu)化策略 在生成式AI飛速發(fā)展的今天#xff0c;

2026/01/21 16:20:01

哈爾濱的網站建設公司江西南昌網站建設招標

哈爾濱的網站建設公司,江西南昌網站建設招標,wordpress文章點擊量,云南網站新備案制收藏關注不迷路#xff01;#xff01;需要的小伙伴可以發(fā)鏈接或者截圖給我 項目展示 項目編號#xff1a;

2026/01/21 19:17:01