日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

分析SpringBoot的啟動原理

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

背景

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

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

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

本文就這三個(gè)問題展開論述。

問題1分析

問題1很簡單,啟動后一直跑是因?yàn)閱恿司€程池。原理就是有非deamon的線程在跑。Java虛擬機(jī)規(guī)范定義要等所有用戶線程都運(yùn)行完才會退出。

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

分析SpringBoot的啟動原理

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

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

分析SpringBoot的啟動原理

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

問題2分析

關(guān)于問題2,我們寫個(gè)最簡單的類來debug一下:

分析SpringBoot的啟動原理

進(jìn)入SpringAppication.run的源碼可以看到,里面創(chuàng)建了一個(gè)context,默認(rèn)是AnnotationConfigServletWebServerApplicationContext。一初始化,在Bean定義里就加載了spring開天辟地的5個(gè)Bean。

分析SpringBoot的啟動原理

繼續(xù)向下執(zhí)行走到AbstractApplicationContext的refresh方法,執(zhí)行到onRefresh時(shí),你進(jìn)入方法里發(fā)現(xiàn)實(shí)際上執(zhí)行的是

ServletWebServerApplicationContext的onFresh

分析SpringBoot的啟動原理

這里面實(shí)際只做了一件事:創(chuàng)建web服務(wù)。

分析SpringBoot的啟動原理

進(jìn)入這個(gè)方法,debug到getWebServerFactory

分析SpringBoot的啟動原理

來看一下:

分析SpringBoot的啟動原理

獲取的正式JettyServletWebServerFactory。為啥不是TomcatServlet呢?ServletWebServerFactoryAutoConfiguration的源碼很好的說明了這個(gè)問題。源碼的大意是當(dāng)tomcat依賴存在就用tomcat,不然就按順序找jetty存不存在,不存在再找Undertow存不存在。找到了就返回這個(gè)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); } } }}

至此第二個(gè)問題也真相大白。

問題3分析

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

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

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

<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>

因?yàn)檫x擇servlet容器是類似于使用基于條件的注解方式。因?yàn)楫?dāng)exclusion掉tomcat后,只有jetty滿足條件,所以會加載JettyServletWebServerFactory。

通過getWebServer方法會new一個(gè)WebServer對象,new對象的方法會調(diào)用initialize方法,在這個(gè)方法中會對容器進(jìn)行初始化并啟動。

而容器啟動的基本原理就是創(chuàng)建個(gè)線程池和網(wǎng)絡(luò)套接字。用線程去處理套接字讀寫的內(nèi)容。

總結(jié)

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

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

SCQA其實(shí)只是麥肯錫做了總結(jié)。這個(gè)方法李清照都在用:

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

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

知否,知否(問題)

應(yīng)是綠肥紅瘦(答案)

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

以上就是分析SpringBoot的啟動原理的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot 啟動原理的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
蜜臀久久久久久久| 婷婷成人av| 亚洲精品自拍| 国产一区国产二区国产三区| 亚洲综合国产| 日韩视频免费| 国产中文在线播放| 91综合网人人| 久久精品国产精品亚洲毛片| 日韩精品免费一区二区夜夜嗨| 亚洲综合图色| 尹人成人综合网| 日韩亚洲一区在线| 精品国产不卡| 国产精品美女在线观看直播| 麻豆精品久久| 国产精品亚洲四区在线观看 | 日本不卡的三区四区五区| 久久国产亚洲| 欧美.日韩.国产.一区.二区 | 老司机久久99久久精品播放免费| 人人草在线视频| 久久婷婷一区| 久久久久99| 91精品国产乱码久久久久久久| 五月激情久久| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 欧美精品国产白浆久久久久| 国产情侣一区| 国产欧美自拍一区| 国产日韩欧美一区二区三区在线观看| 国产精品久久久久久久久免费高清| 最近国产精品视频| 午夜精品成人av| 狠狠爱www人成狠狠爱综合网| 激情久久五月| 免费成人在线观看| 亚洲精品综合| 亚州av日韩av| 久久免费精品| 91综合视频| 午夜av一区| 欧美日韩国产欧| 在线亚洲成人| 国产情侣久久| 精品视频久久| 精品视频在线观看网站| 欧美亚洲国产精品久久| 久久视频一区| 日本不卡视频一二三区| 国产精品黄色片| 精品一二三区| av成人国产| 丝袜美腿一区二区三区| 国产精品亚洲综合色区韩国| sm久久捆绑调教精品一区| 三上悠亚国产精品一区二区三区| 日韩中文字幕1| 久久精品72免费观看| 国产精品成人一区二区不卡| 久久久久免费av| 免费视频最近日韩| 精品理论电影在线| 日韩欧美少妇| 亚洲午夜久久久久久尤物| 亚洲欧美在线综合| 欧美激情精品| 亚洲影视一区二区三区| 国产剧情在线观看一区| 91亚洲人成网污www| 日韩中文字幕区一区有砖一区 | 欧美有码在线| 日韩在线免费| 91精品国产自产观看在线| 成人综合一区| 国产免费成人| 久久国际精品| 日韩大片在线观看| 91精品国产一区二区在线观看| 91一区二区三区四区| 偷拍欧美精品| 久久91视频| 亚洲高清影视| 91日韩免费| 免费高清在线一区| 国产丝袜一区| 亚洲欧美日韩国产一区| 久久99精品久久久久久园产越南| 中文亚洲欧美| 麻豆精品蜜桃视频网站| 精品成人免费一区二区在线播放| 日韩av在线播放中文字幕| 成人台湾亚洲精品一区二区| 亚洲精品福利| 日韩精品专区| 日韩av一区二区在线影视| 亚洲国产日韩欧美在线| 麻豆精品视频在线观看| 青青伊人久久| 黄色日韩在线| 97精品资源在线观看| 亚洲自啪免费| 久久久久久夜| 日韩二区三区在线观看| 影音先锋久久| 日韩电影免费网站| 国产毛片精品| 久久国内精品视频| 免费久久99精品国产自在现线| 国产精品成人a在线观看| 国产精品www.| 男人的天堂久久精品| 亚洲国产一区二区三区在线播放| 久久免费影院| 亚洲bt欧美bt精品777| 日韩视频精品在线观看| 吉吉日韩欧美| 久久精品国产99国产| 日韩精品免费视频人成| 亚洲综合精品| 91精品蜜臀一区二区三区在线| 日韩精品一级| 久久国产精品亚洲77777| 91九色精品| 国产不卡一区| 久久99国产精品视频| 欧美视频二区| 综合国产在线| 综合亚洲自拍| 香蕉成人久久| 蜜桃av一区二区在线观看| 亚洲第一精品影视| 国产精品视频3p| 国产探花一区在线观看| 日精品一区二区三区| 日本成人一区二区| 欧美专区一区二区三区| 在线亚洲国产精品网站| 精品一区三区| 日韩精品首页| 伊人久久在线| 成人片免费看| 国际精品欧美精品| 麻豆国产精品视频| 国产精品伦一区二区| 国产亚洲字幕| 丰满少妇一区| 精品国产亚洲一区二区三区在线| 亚洲精品国产日韩| 亚洲精品在线a| 亚洲影院天堂中文av色| 只有精品亚洲| 中文精品电影| 国产精品亚洲人成在99www| 日韩高清二区| 青草国产精品| 久久精品国产一区二区| 欧美国产日本| 天堂√中文最新版在线| 成人欧美一区二区三区的电影| 99久久精品费精品国产| 欧美亚洲精品在线| 欧美日韩国产一区精品一区| 亚洲色图国产| 久久精品xxxxx| 日韩福利一区| 久久视频一区| 蜜桃视频一区二区三区 | 日韩一区亚洲二区| 久久午夜视频| 亚洲人www| 国产欧美69| 久久久久久久欧美精品| 午夜久久黄色| 亚洲激情五月| 国产亚洲字幕| 国产成人精品三级高清久久91| 欧美日韩一二三四| 不卡一区2区| 国产欧美在线| 波多视频一区| 红桃视频国产一区| 欧美日韩在线精品一区二区三区激情综合| 国产日韩高清一区二区三区在线| 国产自产自拍视频在线观看| 在线日韩中文| 久久久久国产精品一区三寸| 男女性色大片免费观看一区二区 | 欧美日韩黄网站| 在线天堂资源www在线污| 欧美日韩国产在线观看网站| 欧美日本一区| 久久久久久一区二区| 久久亚洲一区| 国产欧美丝祙| 91亚洲国产| 亚洲a级精品| 福利视频一区| 美女网站久久| 久久xxx视频|