电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

分析SpringBoot的啟動原理

瀏覽:5日期:2023-04-25 18:52:28

背景

1> 大家都知道SpringBoot是通過main函數啟動的,這里面跟蹤代碼到處都沒有找到while(true),為什么啟動后可以一直跑?

2> SpringBoot默認使用tomcat作為web容器。大家也可以通過在pom文件中exclusion掉tomcat,denpendency jetty 的方法來使用jetty。那SpringBoot是怎么做到在不同web容器之間切換的呢?

3> 傳統的web容器比如jetty本質上是直接通過java start.jar 來啟動,之后來加載spring上下文的,SpringBoot通過main函數是怎么來啟動web容器的呢?

本文就這三個問題展開論述。

問題1分析

問題1很簡單,啟動后一直跑是因為啟動了線程池。原理就是有非deamon的線程在跑。Java虛擬機規范定義要等所有用戶線程都運行完才會退出。

所以這個原理就和下面啟動線程池一樣

分析SpringBoot的啟動原理

程序員修煉之道教我們:不要假定,要證明。雖然jetty使用線程池是常識,我們也來跟蹤下源碼,看看線程池是在哪里初始化的:

org.springframework.boot.web.embedded.jetty.JettyServletWebServerFactory類里,創建Server的使用使用線程池作為初始化參數。然后創建了socket連接來監聽端口。(對于socket連接有之前沒接觸過的,可以自己查一下。建議動手實踐。《Java異常處理總結》這篇文章里有不錯的簡單小例子可以實操下。)

分析SpringBoot的啟動原理

到這里,大家應該都明白了為什么啟動后一直不停。但是又有疑問了:JettyServletWebServerFactory是個什么東東?

問題2分析

關于問題2,我們寫個最簡單的類來debug一下:

分析SpringBoot的啟動原理

進入SpringAppication.run的源碼可以看到,里面創建了一個context,默認是AnnotationConfigServletWebServerApplicationContext。一初始化,在Bean定義里就加載了spring開天辟地的5個Bean。

分析SpringBoot的啟動原理

繼續向下執行走到AbstractApplicationContext的refresh方法,執行到onRefresh時,你進入方法里發現實際上執行的是

ServletWebServerApplicationContext的onFresh

分析SpringBoot的啟動原理

這里面實際只做了一件事:創建web服務。

分析SpringBoot的啟動原理

進入這個方法,debug到getWebServerFactory

分析SpringBoot的啟動原理

來看一下:

分析SpringBoot的啟動原理

獲取的正式JettyServletWebServerFactory。為啥不是TomcatServlet呢?ServletWebServerFactoryAutoConfiguration的源碼很好的說明了這個問題。源碼的大意是當tomcat依賴存在就用tomcat,不然就按順序找jetty存不存在,不存在再找Undertow存不存在。找到了就返回這個bean作為Servlet的工廠類。

@Configuration@AutoConfigureOrder(-2147483648)@ConditionalOnClass({ServletRequest.class})@ConditionalOnWebApplication( type = Type.SERVLET)@EnableConfigurationProperties({ServerProperties.class})@Import({ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class, EmbeddedTomcat.class, EmbeddedJetty.class, EmbeddedUndertow.class})public class ServletWebServerFactoryAutoConfiguration { public ServletWebServerFactoryAutoConfiguration() { } @Bean public ServletWebServerFactoryCustomizer servletWebServerFactoryCustomizer(ServerProperties serverProperties) { return new ServletWebServerFactoryCustomizer(serverProperties); } @Bean @ConditionalOnClass( name = {'org.apache.catalina.startup.Tomcat'} ) public TomcatServletWebServerFactoryCustomizer tomcatServletWebServerFactoryCustomizer(ServerProperties serverProperties) { return new TomcatServletWebServerFactoryCustomizer(serverProperties); } public static class BeanPostProcessorsRegistrar implements ImportBeanDefinitionRegistrar, BeanFactoryAware { private ConfigurableListableBeanFactory beanFactory; public BeanPostProcessorsRegistrar() { } public void setBeanFactory(BeanFactory beanFactory) throws BeansException { if (beanFactory instanceof ConfigurableListableBeanFactory) {this.beanFactory = (ConfigurableListableBeanFactory)beanFactory; } } public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { if (this.beanFactory != null) {this.registerSyntheticBeanIfMissing(registry, 'webServerFactoryCustomizerBeanPostProcessor', WebServerFactoryCustomizerBeanPostProcessor.class);this.registerSyntheticBeanIfMissing(registry, 'errorPageRegistrarBeanPostProcessor', ErrorPageRegistrarBeanPostProcessor.class); } } private void registerSyntheticBeanIfMissing(BeanDefinitionRegistry registry, String name, Class<?> beanClass) { if (ObjectUtils.isEmpty(this.beanFactory.getBeanNamesForType(beanClass, true, false))) {RootBeanDefinition beanDefinition = new RootBeanDefinition(beanClass);beanDefinition.setSynthetic(true);registry.registerBeanDefinition(name, beanDefinition); } } }}

至此第二個問題也真相大白。

問題3分析

第三個問題是傳統的web容器比如jetty本質上是直接通過java start.jar 來啟動,之后來加載spring上下文的,SpringBoot通過main函數是怎么來啟動web容器。

這個問題在前面問題分析過程中也給了很多線索。我們來回顧下:SpringApplication.run里會創建Spring的應用上下文,默認是AnnotationConfigServletWebServerApplicationContext。首先會加載Spring開天辟地的5個Bean。然后它初始化各種Bean工廠。

SpringBoot在ServletWebServerApplicationContext中重載了onRefresh方法,除了以前Spring默認的onRefresh方法外還增加了createWebServer方法,在這個方法中對Web容器進行了初始化工作。

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>${spring.boot.version}</version> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> <exclusion> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </exclusion> </exclusions></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jetty</artifactId> <version>${spring.boot.version}</version> <exclusions> <exclusion> <groupId>org.eclipse.jetty.aggregate</groupId> <artifactId>jetty-all</artifactId> </exclusion> </exclusions></dependency>

因為選擇servlet容器是類似于使用基于條件的注解方式。因為當exclusion掉tomcat后,只有jetty滿足條件,所以會加載JettyServletWebServerFactory。

通過getWebServer方法會new一個WebServer對象,new對象的方法會調用initialize方法,在這個方法中會對容器進行初始化并啟動。

而容器啟動的基本原理就是創建個線程池和網絡套接字。用線程去處理套接字讀寫的內容。

總結

文本用帶有少許說明的三個問題開場展開論述,實際是使用了麥肯錫大法中的SCQA架構。

SCQA架構是金字塔模型里面突出的一個論述方法,即“情境(Situation)、沖突(Complication)、問題(Question)、答案(Answer)”。可以幫助我們在陳述事實時條理更為清晰、有效。

SCQA其實只是麥肯錫做了總結。這個方法李清照都在用:

昨夜雨疏風驟,濃睡不消殘酒 (情境)

試問卷簾人,渠道海棠依舊(沖突)

知否,知否(問題)

應是綠肥紅瘦(答案)

文章正文看似一步步回答問題,實際上在講述怎樣去看spring源碼,了解spring原理的一個過程。即:帶著問題去看,debug跟蹤源碼驗證 的方法。

以上就是分析SpringBoot的啟動原理的詳細內容,更多關于SpringBoot 啟動原理的資料請關注好吧啦網其它相關文章!

標簽: Spring
相關文章:
主站蜘蛛池模板: 活性炭厂家-蜂窝活性炭-粉状/柱状/果壳/椰壳活性炭-大千净化-活性炭 | 大型工业风扇_工业大风扇_大吊扇_厂房车间降温-合昌大风扇 | 河南凯邦机械制造有限公司| 产业规划_产业园区规划-产业投资选址及规划招商托管一体化服务商-中机院产业园区规划网 | 郑州爱婴幼师学校_专业幼师培训_托育师培训_幼儿教育培训学校 | 鑫铭东办公家具一站式定制采购-深圳办公家具厂家直销 | 雨燕360体育免费直播_雨燕360免费NBA直播_NBA篮球高清直播无插件-雨燕360体育直播 | 地源热泵一体机,地源热泵厂家-淄博汇能环保设备有限公司 | 中国在职研究生招生信息网| 多物理场仿真软件_电磁仿真软件_EDA多物理场仿真软件 - 裕兴木兰 | 光伏家 - 太阳能光伏发电_分布式光伏发电_太阳能光伏网 | 【星耀裂变】_企微SCRM_任务宝_视频号分销裂变_企业微信裂变增长_私域流量_裂变营销 | 路面机械厂家 | 铝合金重力铸造_铝合金翻砂铸造_铝铸件厂家-东莞市铝得旺五金制品有限公司 | 并网柜,汇流箱,电控设备,中高低压开关柜,电气电力成套设备,PLC控制设备订制厂家,江苏昌伟业新能源科技有限公司 | 印刷人才网 印刷、包装、造纸,中国80%的印刷企业人才招聘选印刷人才网! | 钢结构厂房造价_钢结构厂房预算_轻钢结构厂房_山东三维钢结构公司 | 真空搅拌机-行星搅拌机-双行星动力混合机-广州市番禺区源创化工设备厂 | 珠海网站建设_响应网站建设_珠海建站公司_珠海网站设计与制作_珠海网讯互联 | 篷房[仓储-婚庆-展览-活动]生产厂家-江苏正德装配式帐篷有限公司 | 煤机配件厂家_刮板机配件_链轮轴组_河南双志机械设备有限公司 | 郑州外墙清洗_郑州玻璃幕墙清洗_郑州开荒保洁-河南三恒清洗服务有限公司 | 新疆散热器,新疆暖气片,新疆电锅炉,光耀暖通公司 | 水厂自动化|污水处理中控系统|水利信息化|智慧水务|智慧农业-山东德艾自动化科技有限公司 | 不干胶标签-不干胶贴纸-不干胶标签定制-不干胶标签印刷厂-弗雷曼纸业(苏州)有限公司 | 哈尔滨发电机,黑龙江柴油发电机组-北方星光 | 电镀整流器_微弧氧化电源_高频电解电源_微弧氧化设备厂家_深圳开瑞节能 | 好杂志网-首页 | 济南铝方通-济南铝方通价格-济南方通厂家-山东鲁方通建材有限公司 | 线粒体膜电位荧光探针-细胞膜-标记二抗-上海复申生物科技有限公司 | 合肥升降机-合肥升降货梯-安徽升降平台「厂家直销」-安徽鼎升自动化科技有限公司 | 防火门-专业生产甲级不锈钢钢质防火门厂家资质齐全-广东恒磊安防设备有限公司 | 自清洗过滤器-全自动自清洗过反冲洗过滤器 - 中乂(北京)科技有限公司 | 亳州网络公司 - 亳州网站制作 - 亳州网站建设 - 亳州易天科技 | 无线联网门锁|校园联网门锁|学校智能门锁|公租房智能门锁|保障房管理系统-KEENZY中科易安 | 铝机箱_铝外壳加工_铝外壳厂家_CNC散热器加工-惠州市铂源五金制品有限公司 | 包塑丝_高铁绑丝_地暖绑丝_涂塑丝_塑料皮铁丝_河北创筹金属丝网制品有限公司 | 安徽集装箱厂-合肥国彩钢结构板房工程有限公司 | cnc精密加工_数控机械加工_非标平键定制生产厂家_扬州沃佳机械有限公司 | 悬浮拼装地板_篮球场木地板翻新_运动木地板价格-上海越禾运动地板厂家 | 北京发电车出租-发电机租赁公司-柴油发电机厂家 - 北京明旺盛安机电设备有限公司 |