免费国产精品自在自线-91精品国产色综合久久久浪潮-99热久久免费频精品-国产精品国模在线观看-久久亚洲国产精品成人?V秋霞-久久国产一级A片免费播放-亚洲国产欧洲综合97久久-久久国产白嫩美女呻吟高潮

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運營的一線實戰(zhàn)洞察。

SpringBoot啟動流程詳解:從main方法到內(nèi)嵌Tomcat就緒

SpringBoot啟動流程詳解:從main方法到內(nèi)嵌Tomcat就緒 1. 為什么值得把啟動流程啃透——面試只是最表面的理由如果你搞過一段時間SpringBoot大概率被問過SpringBoot的啟動流程是什么這類問題。說實話這個問題在面試?yán)锍霈F(xiàn)的頻率非常高但它絕對不只是面試題那么簡單。我在實際生產(chǎn)環(huán)境里排查過好幾次詭異故障——應(yīng)用啟動后端口遲遲不監(jiān)聽、某些Bean在啟動階段莫名報錯、配置項總是被意外覆蓋——最后追根溯源都得回到啟動流程上找原因。SpringBoot的啟動流程本質(zhì)上回答了一個核心問題一個只有幾十行代碼的main方法是怎么變成一個包含內(nèi)嵌Tomcat、數(shù)據(jù)庫連接池、各種自動配置、Bean管理體系、Web接口全部就緒的完整應(yīng)用的。這中間不是SpringBoot自己施法完成的而是SpringFramework的IoC容器啟動邏輯和SpringBoot的自動裝配機制、環(huán)境準(zhǔn)備機制、內(nèi)嵌服務(wù)器機制按特定順序組合運行的產(chǎn)物。把這條線理順你對整個Spring生態(tài)的理解會上一個臺階。這篇文章我會從SpringApplication的構(gòu)造開始沿著run方法一路往下走把每一步做了什么、為什么在這個時機做、哪些地方容易出問題都拆開講清楚。內(nèi)容偏原理但我盡量用大白話和實際案例說話保證你能一邊看一邊在腦子里把整個執(zhí)行鏈路串起來。2. 從main方法到SpringApplication初始化——你以為的起點不是真起點很多人在項目里看到這樣的代碼覺得應(yīng)用就是從這行開始跑的SpringBootApplication public class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } }這句話本身沒問題但啟動流程真正開始的位置要往前推一步。SpringApplication.run是一個靜態(tài)方法它內(nèi)部先要創(chuàng)建一個SpringApplication實例然后再調(diào)用實例的run方法。也就是說啟動流程的第一段其實是SpringApplication對象的構(gòu)造過程。2.1 SpringApplication構(gòu)造階段的關(guān)鍵推斷邏輯SpringApplication的構(gòu)造函數(shù)會做四件關(guān)鍵事情推斷WebApplicationType通過classpath下是否存在org.springframework.web.reactive.DispatcherHandler、org.springframework.web.servlet.DispatcherServlet、org.springframework.web.context.ConfigurableWebApplicationContext等類將應(yīng)用類型判定為NONE、SERVLET或REACTIVE。這個過程用的是ClassNameUtils的預(yù)設(shè)類名集合做存在性檢查不是new出來再看性能開銷極小。加載BootstrapRegistryInitializer從spring.factories中讀取所有BootstrapRegistryInitializer實現(xiàn)這個是SpringBoot 2.4.0之后引入的新機制用于在啟動早期階段做額外注冊。加載ApplicationContextInitializer同樣從spring.factories中讀取這些初始化器會在ApplicationContext準(zhǔn)備完成后、refresh之前被調(diào)用。她們負(fù)責(zé)做一些定制化操作比如設(shè)置Environment的默認(rèn)profile、注冊額外的BeanFactoryPostProcessor等。加載ApplicationListener從spring.factories中讀取所有的ApplicationListener實現(xiàn)這些監(jiān)聽器會在啟動流程的不同階段收到事件通知比如ApplicationStartedEvent、ApplicationReadyEvent、ApplicationFailedEvent。這四步的共同點是讀取并緩存配置都是在為后續(xù)的run階段做準(zhǔn)備。你可能注意到這里文件都在用spring.factories——雖說SpringBoot 2.7開始推薦用AutoConfiguration.imports文件加載自動配置類但ApplicationListener、ApplicationContextInitializer、EnvironmentPostProcessor這些基礎(chǔ)設(shè)施至今仍主要走spring.factories。2.2 構(gòu)造階段的坑為什么說主啟動類位置不能亂放我在排查一些項目問題時發(fā)現(xiàn)很多人對主啟動類放哪個包不太在意。其實主啟動類的位置直接決定了默認(rèn)的組件掃描根路徑——SpringBootApplication上內(nèi)置的ComponentScan如果不顯式指定basePackages默認(rèn)就以主啟動類所在包為掃描根。所以我見過的情況是把主啟動類放在頂層包結(jié)果掃描范圍一下鋪到整個項目啟動時加載了大量不該加載的Bean啟動速度慢不說偶爾還會出現(xiàn)Bean類型沖突。更隱蔽的一個坑是主啟動類被放在某個子包里導(dǎo)致兄弟包里的RestController、Service全部沒掃到表現(xiàn)就是啟動成功但接口404。這種問題排查起來最費時間因為你第一反應(yīng)不會去懷疑啟動類的擺放位置。實際上啟動類放在哪本質(zhì)上是配置了掃描邊界這個邊界在啟動階段直接影響后續(xù)的ComponentScan執(zhí)行范圍。3. run方法的前半段監(jiān)聽器、環(huán)境與Banner如何交織實例構(gòu)造完成之后SpringApplication.run(String... args)方法就登場了。這個方法的內(nèi)容在SpringBoot不同版本里略有差異但主干邏輯相當(dāng)穩(wěn)定。我以SpringBoot 2.7.x為例按執(zhí)行順序拆開說。3.1 啟動計時與運行監(jiān)聽器run方法最先做的事情是創(chuàng)建StopWatch。這個名字很直白就是個秒表。之后調(diào)用SpringApplicationRunListeners對象的starting()方法。SpringApplicationRunListeners不是單個監(jiān)聽器而是一組SpringApplicationRunListener的集合。它和ApplicationListener的區(qū)別在于SpringApplicationRunListener專門監(jiān)聽SpringApplication啟動過程中的九個階段starting、environmentPrepared、contextPrepared、contextLoaded、started、ready、failed等更偏啟動生命周期ApplicationListener則是SpringFramework的通用事件機制監(jiān)聽的是ApplicationEvent。這個階段最常見的用途是實現(xiàn)啟動耗時打點。我在自己的基礎(chǔ)框架里就實現(xiàn)過一個SpringApplicationRunListener在starting階段記錄啟動時間、在ready階段計算總耗時并輸出到監(jiān)控日志。要注冊這個監(jiān)聽器還是在spring.factories里加配置org.springframework.boot.SpringApplicationRunListenercom.example.support.CustomRunListener然后寫一個構(gòu)造方法簽名匹配SpringApplication, String[]的實現(xiàn)類即可。3.2 Environment準(zhǔn)備階段配置來源的合并順序接下來是配置準(zhǔn)備的重頭戲。prepareEnvironment方法會做以下這些事根據(jù)啟動參數(shù)創(chuàng)建ApplicationArguments對象供后續(xù)代碼通過getApplicationArguments()獲取main方法的原始參數(shù)。創(chuàng)建或獲取ConfigurableEnvironment對于Servlet類型的Web應(yīng)用通常是StandardServletEnvironment。配置環(huán)境的一些必要屬性spring.main.*系列配置會在這一步被讀取并應(yīng)用比如spring.main.web-application-type、spring.main.lazy-initialization等。如果有EnvironmentPostProcessor會在這里統(tǒng)一執(zhí)行。這是非常強大的擴展點配置中心、加密配置解密器基本都是靠它實現(xiàn)的。很多人在這一步栽過的跟頭是配置覆蓋順序搞混。SpringBoot的PropertySource是有優(yōu)先級的大概從高到低是這樣優(yōu)先級配置來源最高Devtools全局配置~/.spring-boot-devtools.properties高TestPropertySource注解測試場景高命令行參數(shù)--server.port8081這種高SPRING_APPLICATION_JSON內(nèi)嵌JSON中ServletConfig / ServletContext參數(shù)中JNDI屬性中Java System PropertiesSystem.getProperties()中操作系統(tǒng)環(huán)境變量中RandomValuePropertySourcerandom.*占位符低jar包外的application-{profile}.properties/yml低jar包內(nèi)的application-{profile}.properties/yml更低jar包外的application.properties/yml最低jar包內(nèi)的application.properties/yml注意一個容易被忽略的點同名的application.ymljar包外的配置會覆蓋jar包內(nèi)的。這個機制在生產(chǎn)環(huán)境非常有用——不用重新打包就能調(diào)整配置——但也經(jīng)常造成本地跑得好好的服務(wù)器上配置不生效的奇怪現(xiàn)象。3.3 Banner、Headless屬性與ApplicationContext創(chuàng)建環(huán)境準(zhǔn)備完成后run方法會打印Banner。這一步的擴展點在Banner接口上你想自定義啟動圖案可以實現(xiàn)這個接口并配置spring.banner.location指向自己的banner文件。熱詞里提到的SpringBoot banner生成器就是這樣來的——它生成的其實就是一個文本文件SpringBoot啟動時會把它打印到控制臺。另外spring.main.banner-modeoff可以關(guān)掉它某些生產(chǎn)環(huán)境為了日志干凈會這么設(shè)置。緊接著是一個不起眼但很重要的小操作configureHeadlessProperty。它會設(shè)置java.awt.headlesstrue確保應(yīng)用在沒有鍵盤鼠標(biāo)顯示器的服務(wù)器環(huán)境下也能正常運行某些AWT類。這一步絕大多數(shù)人感知不到但它解釋了為什么Headless模式是SpringBoot的默認(rèn)行為。再往下是createApplicationContext。這個方法根據(jù)WebApplicationType類型創(chuàng)建對應(yīng)的ApplicationContext實現(xiàn)如果是SERVLET類型創(chuàng)建AnnotationConfigServletWebServerApplicationContext如果是REACTIVE類型創(chuàng)建AnnotationConfigReactiveWebServerApplicationContext如果是NONE類型創(chuàng)建AnnotationConfigApplicationContext這些類都是GenericApplicationContext的子類其中Servlet版本就繼承了內(nèi)嵌Web服務(wù)器的能力。SpringBoot語境里的啟動流程在創(chuàng)建ApplicationContext這一步開始與SpringFramework重疊了。4. refresh()整個流程的實權(quán)部門——SpringBoot在這里動了什么手腳ApplicationContext創(chuàng)建好以后啟動流程進(jìn)入最關(guān)鍵的一環(huán)refreshContext(context)。這個方法內(nèi)部調(diào)用的其實就是SpringFramework中AbstractApplicationContext的refresh()模板方法。如果你讀過Spring源碼就會知道refresh()方法是SpringIoC容器啟動的核心流程一共12個步驟。SpringBoot的討巧之處在于它不重寫這個方法而是通過子類覆寫其中特定的模板方法把自己的邏輯塞進(jìn)SpringFramework既有的流程里。這種在不改變骨架的前提下替換零件的設(shè)計思路是理解SpringBoot與Spring關(guān)系的關(guān)鍵。4.1 12步refresh流程里SpringBoot重點插手的位置refresh()的主要步驟和SpringBoot在其中的角色對應(yīng)關(guān)系如下表步驟方法SpringFramework做的事SpringBoot插手的事1prepareRefresh準(zhǔn)備刷新設(shè)置啟動時間、活躍狀態(tài)初始化屬性源在這里準(zhǔn)備WebApplicationContext相關(guān)的早期屬性2obtainFreshBeanFactory獲取/創(chuàng)建BeanFactory使用DefaultListableBeanFactory3prepareBeanFactory配置BeanFactory的標(biāo)準(zhǔn)特性比如ClassLoader、表達(dá)式解析器注冊WebApplicationContext相關(guān)的后置處理器4postProcessBeanFactory空實現(xiàn)模板方法注冊ServletContextAwareProcessor等5invokeBeanFactoryPostProcessors執(zhí)行BeanFactoryPostProcessorConfigurationClassPostProcessor在這里完成配置類解析和自動配置類導(dǎo)入6registerBeanPostProcessors注冊BeanPostProcessor無特殊7initMessageSource初始化MessageSource無特殊8initApplicationEventMulticaster初始化事件廣播器無特殊9onRefresh空實現(xiàn)模板方法創(chuàng)建并啟動內(nèi)嵌Web服務(wù)器10registerListeners注冊監(jiān)聽器無特殊11finishBeanFactoryInitialization實例化所有非懶加載的單例Bean完成所有Controller、Service的創(chuàng)建內(nèi)嵌Tomcat開始接收請求的準(zhǔn)備工作12finishRefresh完成刷新發(fā)布ContextRefreshedEvent啟動WebServer調(diào)用生命周期處理器第5步和第9步是SpringBoot影響最大的兩個位置。第5步里ConfigurationClassPostProcessor會解析所有配置類把spr自動配置類通過Import導(dǎo)入進(jìn)容器第9步里Servlet容器被創(chuàng)建并啟動端口開始監(jiān)聽。4.2 第5步為什么是自動裝配的關(guān)鍵戰(zhàn)場很多講SpringBoot啟動流程的文章講到invokeBeanFactoryPostProcessors就是一句執(zhí)行BeanFactory后置處理器帶過但這里是理解為什么SpringBoot能自動配置的重中之重。BeanFactoryPostProcessor是SpringFramework提供的擴展點允許在Bean定義加載完成之后、Bean實例化之前對BeanDefinition進(jìn)行修改。ConfigurationClassPostProcessor實現(xiàn)了這個接口更準(zhǔn)確地說是BeanDefinitionRegistryPostProcessor它負(fù)責(zé)解析配置類上的Configuration、ComponentScan、Import、Bean等注解把這些注解展開成具體的BeanDefinition注冊進(jìn)容器。SpringBoot的自動配置類也是在這個階段被處理的。SpringBootApplication上的EnableAutoConfiguration注解最終會通過AutoConfigurationImportSelector選擇性地加載一批自動配置類——這個過程要走Import機制而Import的解析執(zhí)行者就是ConfigurationClassPostProcessor。所以你看到的效果是SpringBoot應(yīng)用啟動后容器里自動多出了數(shù)據(jù)源配置、MyBatis的SqlSessionFactory、RedisTemplate等Bean定義。實際上這些都是第5步里后置處理器把EnableAutoConfiguration展開后看到的一個個自動配置類再把它們內(nèi)部聲明的Bean方法轉(zhuǎn)為BeanDefinition實現(xiàn)的。4.3 第9步的onRefresh內(nèi)嵌Web服務(wù)器在這里被創(chuàng)建對于Web應(yīng)用來說onRefresh是SpringBoot啟動流程里最讓人興奮的環(huán)節(jié)之一。以Tomcat為例ServletWebServerApplicationContext重寫了onRefresh方法并在其中調(diào)用createWebServer()方法。它要做的決策是從容器里找到一個ServletWebServerFactory類型的Bean——SpringBoot自動裝配階段如果沒有人為干預(yù)會默認(rèn)注冊一個TomcatServletWebServerFactory——然后調(diào)用工廠的getWebServer(ServletContextInitializer...)方法。在這個方法內(nèi)部Tomcat實例被創(chuàng)建、配置端口、連接器、線程池參數(shù)Context和Servlet容器初始化最后tomcat.start()讓端口真正開始監(jiān)聽。這里有個非常實用的排查經(jīng)驗如果項目里同時存在Tomcat的JAR包和Jetty的JAR包SpringBoot不會自己分辨用哪個而是拋出BeanDefinitionStoreException之類的沖突異常。解決方式是把不用的那個從依賴?yán)飁xclude掉或者顯式指定spring.main.web-application-type和對應(yīng)的Factory類型。很多人遇到多個ServletWebServerFactory Bean的報錯就是因為這個。5. 自動裝配不是魔法Condition與ConfigurationClassPostProcessor的舞蹈既然提到了自動裝配是啟動流程中最關(guān)鍵的環(huán)節(jié)這一節(jié)專門展開講清楚。熱詞里的springboot自動裝配原理是每次面試都繞不開的點而它真正起作用的時機就在refresh的第5步。5.1 AutoConfiguration.imports文件的加載鏈路SpringBoot 2.7版本之后自動配置類的索引文件從META-INF/spring.factories遷移到了META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports。這個文件內(nèi)容的格式很簡單每行一個自動配置類的全限定類名com.example.starter.autoconfigure.DemoAutoConfiguration com.example.starter.autoconfigure.Demo2AutoConfigurationEnableAutoConfiguration通過AutoConfigurationImportSelector讀取這個文件然后對列表里的每個候選配置類做條件化處理。為什么用獨立文件而不是spring.factories官方給的理由是單獨文件更輕量、更容易解析而且避免了spring.factories里條目過多、不同模塊之間的干擾。我自己的理解是這也是一種性能優(yōu)化——啟動階段解析文件的開銷雖然不大但能少讀一點是一點。5.2 Conditional注解的評估時機與順序每個自動配置類上都有一堆Conditional相關(guān)注解比如AutoConfiguration ConditionalOnClass(RedisOperations.class) ConditionalOnMissingBean(name redisTemplate) public class RedisAutoConfiguration { Bean ConditionalOnMissingBean(name redisTemplate) public RedisTemplateObject, Object redisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplateObject, Object template new RedisTemplate(); template.setConnectionFactory(redisConnectionFactory); return template; } }這些條件注解的評估不是隨手就做的而是由ConditionEvaluator在配置類解析期間執(zhí)行。評估的核心邏輯是檢查類的條件ConditionalOnClassclasspath下有沒有指定類檢查Bean的條件ConditionalOnMissingBean/ConditionalOnBean容器中是否已經(jīng)存在某個BeanDefinition或Bean檢查屬性的條件ConditionalOnProperty指定的配置項是否為預(yù)期值這里有個容易踩坑的細(xì)節(jié)ConditionalOnBean和ConditionalOnMissingBean的判斷時機在配置類解析階段而當(dāng)時的容器里可能還沒注冊完所有BeanDefinition。所以如果同一個自動配置類里的兩個Bean方法互相依賴條件可能出現(xiàn)判斷不準(zhǔn)的情況。解決辦法是在Bean方法參數(shù)上聲明依賴讓Spring自動處理順序而不是靠條件的先后順序。5.3 自定義自動配置類的最小可運行示例理解了原理后可以做一個最小的自定義自動配置類來驗證整個鏈路。假設(shè)我要做一個DemoService的自動配置包第一步編寫自動配置類AutoConfiguration ConditionalOnClass(DemoService.class) ConditionalOnProperty(prefix demo, name enabled, havingValue true, matchIfMissing true) public class DemoAutoConfiguration { Bean ConditionalOnMissingBean public DemoService demoService() { return new DemoService(auto-configured-demo); } }第二步創(chuàng)建META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件內(nèi)容為com.example.demo.autoconfigure.DemoAutoConfiguration第三步在一個普通SpringBoot項目里引入這個包啟動后就能看到DemoService被自動注冊了。這就是SpringBoot啟動流程中第5步解析配置類時發(fā)生的事——你的自定義自動配置類和SpringBoot內(nèi)置的自動配置類走的是完全相同的通道。6. 從Bean實例化到Web服務(wù)器就緒——啟動尾段的重要細(xì)節(jié)refresh的第11步finishBeanFactoryInitialization是量變引發(fā)質(zhì)變的節(jié)點。在這之前所有的BeanDefinition已經(jīng)注冊所有的BeanFactoryPostProcessor已經(jīng)運行完BeanPostProcessor也準(zhǔn)備好了。從這一步開始容器會遍歷所有非懶加載的單例BeanDefinition逐個實例化。6.1 單例Bean的實例化順序由什么決定Spring在實例化單例Bean時并不是按照BeanDefinition的注冊順序盲目new。它會先把滿足條件的BeanDefinition放入一個List通過AnnotationAwareOrderComparator排序——也就是說實現(xiàn)了Ordered接口或標(biāo)注了Order注解的Bean可以控制實例化順序。但大多數(shù)Bean之間其實沒有顯式順序依賴Spring會按照依賴關(guān)系自動構(gòu)建A依賴B那就先實例化B再實例化A。這個階段最常見的報錯就是循環(huán)依賴。比如A和B互相注入Spring在默認(rèn)情況下單例、非構(gòu)造器注入能通過三級緩存機制解決——這是Spring閉環(huán)能力的體現(xiàn)。但如果你把其中一方改成了構(gòu)造器注入或者把spring.main.allow-circular-references設(shè)置為false循環(huán)依賴就會直接拋出BeanCurrentlyInCreationException。我處理的幾個生產(chǎn)故障里有一起就是重構(gòu)時把字段注入改成了構(gòu)造器注入結(jié)果原本正常的循環(huán)依賴立刻爆雷。實際經(jīng)驗是比起想盡辦法繞過循環(huán)依賴不如從設(shè)計上消除它——該拆的模塊拆開該用事件驅(qū)動用的用事件驅(qū)動別指望Spring幫你兜底。6.2 onRefresh與finishBeanFactoryInitialization誰先誰后這里有個順序關(guān)系值得單獨強調(diào)Web服務(wù)器在onRefresh里先被創(chuàng)建并啟動端口監(jiān)聽但此時DispatcherServlet等Web相關(guān)的Bean可能還沒完成實例化。SpringBoot的巧妙處理是Tomcat啟動時不會馬上對外提供服務(wù)——實際上這時候請求進(jìn)來也是能監(jiān)聽到TCP連接的只是業(yè)務(wù)鏈路還沒完全就緒。真正可以接受請求的狀態(tài)要到refresh完成之后、ApplicationReadyEvent發(fā)布之前的那一瞬間才成立。這也是為什么你通過健康檢查腳本探測端口時端口雖然已經(jīng)通了但應(yīng)用還沒完全ready需要再等一小會兒才返回UP。很多部署腳本踩過這個坑端口一監(jiān)聽就立刻發(fā)流量結(jié)果應(yīng)用還在執(zhí)行ApplicationRunner或初始化緩存導(dǎo)致首批請求超時。6.3 ApplicationRunner與CommandLineRunner啟動收尾的鉤子refresh方法執(zhí)行完后run方法會發(fā)布ApplicationStartedEvent緊接著執(zhí)行callRunners。這一步SpringBoot會把容器里所有的ApplicationRunner和CommandLineRunner找出來依次執(zhí)行它們的run方法。兩者的區(qū)別很簡單ApplicationRunner的run方法接收一個封裝好的ApplicationArguments對象可以方便地獲取參數(shù)名和參數(shù)值CommandLineRunner的run方法接收原始String數(shù)組稍顯原始兩者的執(zhí)行順序同樣可以通過Order注解控制。在實際項目中我習(xí)慣把數(shù)據(jù)初始化、緩存預(yù)熱、敏感信息加載等操作放進(jìn)ApplicationRunner里做因為它的參數(shù)處理更友好。但要記住這些Runner的執(zhí)行是同步的如果它內(nèi)部長時間阻塞應(yīng)用雖然已經(jīng)啟動完成但一直等不到ApplicationReadyEvent健康檢查會一直處于DOWN狀態(tài)。7. 啟動階段高頻故障排查實錄從現(xiàn)象逆推流程中的斷點講完整個啟動鏈路我?guī)Т蠹铱磶讉€真實場景用從現(xiàn)象反推流程斷點的思路來復(fù)盤。這也是我寫這篇文章的初衷——啟動流程不是背出來的八股文而是排查問題時的導(dǎo)航地圖。7.1 端口能通但404——問題多半出在ComponentScan現(xiàn)象應(yīng)用日志顯示啟動成功Tomcat端口正常監(jiān)聽但訪問任何接口都返回404。排查鏈路先確認(rèn)DispatcherServlet有沒有被創(chuàng)建。如果在日志里看不到RequestMappingHandlerMapping注冊的接口信息說明Spring MVC的配置沒有生效。檢查SpringBootApplication所在類的位置。如果主啟動類放在com.example.admin而Controller在com.example.web默認(rèn)的組件掃描就掃不到Controller。再看是不是有多個ApplicationContext。如果引入了某些老框架它可能自己創(chuàng)建了一個獨立的WebApplicationContext接口注冊到了另一個容器里。最后檢查spring.mvc.servlet.path或server.servlet.context-path配置。這個配置如果被誤設(shè)接口路徑整體加前綴也表現(xiàn)為404。這個問題的根源本質(zhì)上就是啟動流程第5步的組件掃描邊界出了問題。主啟動類位置決定了掃描根這一點我再強調(diào)一次。7.2 啟動卡在Root WebApplicationContext: initialization completed現(xiàn)象日志停在這一行之后長時間沒有進(jìn)展進(jìn)程不退出也不報錯。排查鏈路這一個卡住的階段對應(yīng)的是refresh第9步之后、第11步之前——也就是onRefresh創(chuàng)建Web服務(wù)器之后的Bean實例化階段。最可能的原因是某個Bean的構(gòu)造器或PostConstruct方法里有阻塞操作比如等待數(shù)據(jù)庫連接、調(diào)用外部RPC接口超時、遞歸初始化死循環(huán)。用jstack導(dǎo)出線程??醋枞c落在哪個類的哪個方法一擊命中。我遇到過的典型案例是一個連接池預(yù)熱的PostConstruct方法它在啟動時嘗試建立100個數(shù)據(jù)庫連接但數(shù)據(jù)庫連接池的最大連接數(shù)配置只有50結(jié)果互相等待直到連接超時。解決方式是調(diào)整預(yù)熱邏輯把同步預(yù)熱改成異步或者先設(shè)一個較大的連接池上限。7.3 多個ServletWebServerFactory的Bean沖突現(xiàn)象啟動直接報錯提示有一個以上ServletWebServerFactory類型的Bean。排查鏈路檢查classpath里是不是同時引入了spring-boot-starter-tomcat和spring-boot-starter-jetty。保留一個排除另一個dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId exclusions exclusion groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-tomcat/artifactId /exclusion /exclusions /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-jetty/artifactId /dependency如果你需要兩種服務(wù)器共存比如一個負(fù)責(zé)REST、一個負(fù)責(zé)內(nèi)部管理接口可以手動配置兩個ServletWebServerFactory并分別指定端口但這是高級玩法不建議新手一上來就嘗試。這個沖突點發(fā)生在自動裝配階段兩個Factory都被注冊成Bean了第9步onRefresh要找一個時發(fā)現(xiàn)有兩個候選只能拋異常。理解了流程斷點你看到這種報錯根本不需要翻日志直接去依賴?yán)锊橹丶纯伞?.4 版本太高類問題與啟動日志中的密文配置解密熱詞里有一條springboot版本太高這其實是真實存在的問題SpringBoot 3.x要求JDK 17如果項目還在用JDK 8強行升級必然啟動失敗另外某些第三方starter的版本跟不上SpringBoot大版本升級也會出現(xiàn)自動配置類的方法簽名不兼容啟動時拋NoSuchMethodError、ClassNotFoundException。還有一種情況SpringBoot 3.x里javax.*包換成了jakarta.*包如果你的老代碼里還有import javax.servlet.*啟動時根本過不了編譯。這些問題都能追溯到啟動流程第1步之前的依賴準(zhǔn)備階段——main方法都還沒進(jìn)呢類加載就失敗了。至于springboot yml密文常見做法是在配置準(zhǔn)備階段用EnvironmentPostProcessor解密帶特定前綴的配置值。解密動作發(fā)生在PropertySource加載完成之后、各Bean真正讀取配置之前這樣保證所有地方拿到的都是明文。如果你打算自己實現(xiàn)記住EnvironmentPostProcessor要注冊在spring.factories里而且不要在實現(xiàn)里依賴任何Spring容器的Bean——因為它本身執(zhí)行得很早容器還沒完成裝配。7.5 啟動慢的排查要點再補充一個所有項目都可能遇到的啟動速度慢。從啟動流程的角度看慢的地方通常是這幾塊ComponentScan掃描的包太多這個可以用spring-context-indexer生成候選組件索引來緩解finishBeanFactoryInitialization階段實例化的單例Bean太多可以考慮把不急著用的Bean改為懶加載或者用spring.main.lazy-initializationtrue全局開啟但要注意副作用懶加載Bean在首次使用時才創(chuàng)建可能把啟動期故障延遲到運行期才暴露自動配置類評估了大量ConditionalOnClass雖然每個檢查很快但量多了也有開銷??梢酝ㄟ^排除用不上的自動配置類來提速比如SpringBootApplication(exclude {DataSourceAutoConfiguration.class})8. 最后再說兩點實際體會啟動流程我讀了不下五遍每一遍都有新的收獲。第一次讀是背面試題知道run方法會調(diào)refresh、refresh里有12個步驟第二次是排查線上啟動失敗開始去理解每一步之間誰先誰后、某個異常出現(xiàn)在哪兩個斷點之間第三次是寫自己的starter、做公司基礎(chǔ)框架的時候猛然意識到自動裝配的本質(zhì)就是在特定時機把BeanDefinition批量注冊進(jìn)去。這個境界的提升和具體的技術(shù)細(xì)節(jié)無關(guān)純粹是看問題視角的轉(zhuǎn)變——從用它到駕馭它。如果你也想徹底掌握啟動流程我的建議是不要只看SpringBoot的代碼一定要配合SpringFramework的refresh方法一起讀。SpringBoot本身并沒有發(fā)明一套新的容器啟動機制它只是在一個成熟的容器啟動框架上利用模板方法模式在特定位置插入了自己的邏輯。理清哪些是SpringFramework的、哪些是SpringBoot的你就擁有了一張完整的啟動地圖。另外一個技巧是善用Actuator的/actuator/beans端點如果配置了啟動完成后可以看看哪些Bean被創(chuàng)建了、哪些條件沒滿足被跳過了。這個端點對理解自動裝配的生效范圍非常有幫助。最終啟動流程不是一個需要死記硬背的知識點而是一張排查地圖。下次啟動出問題時對照流程找斷點定位速度會比胡亂試快得多。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
五月丁香婷婷色色色| 综合五月天| 99久久亚洲国产| 欧美五月婷婷| 五月丁香拍拍激情综合| aa久久| 99色天堂| 久久久久久久97| 五月天激情网图片 - 百度| 五月婷婷很很色| 97操视频| 性爱久久| 五月天网站免费欧美| 再綫Av免费視品| 婷婷六久久| www.婷婷五月| 99噜噜| 日韩av大全| 91婷婷在线观看| 国产毛片精品一区二区色欲黄A片| 操一操| 五月玖玖| 五月丁香久久激情综合| 婷婷99狠狠躁天天久久久九九九| 五月激情小说| 开心五月婷婷| 五月天另类视频| 婷婷射丁香| 狠狠色官网| 91碰碰视频| 色色欧美色色色| 综合久久9| 色青青视频| 成人精品人妻| 大香线蕉伊人| 97亚洲婷婷| 日韩在线看AV| 久久久婷婷五月天| 七七婷婷综合| 亚洲乱码日产精品BD| 亚洲不卡| 色五月成人| 色婷婷色五月天| 美女亚洲五月丁香| 99热这里只有精品21| 六月丁香大香蕉| www.爱婷婷.com| 在线播放人妻| 五月激情婷婷四射| 碰碰碰91| 久久精品噜噜噜成人A∨色欲| 五月天激情国产综合婷婷婷| 国产毛片精品一区二区色欲黄A片| 五月丁香综合啪啪| 亚洲精品99| 国产操碰| 色婷婷五月天| 五月激情综合网| 色色色免费视频| 性视频久久| 99热思思| 婷婷精品| 欧洲MV日韩MV国产| 97婷婷五月丁香| 无人区码一码二码三码医生系列| 狠狠爱丁香婷| 久九九热| 婷婷五月丁香av网站| 99在线观看| 日韩精品999| 大伊香蕉玖玖爱| 婷婷色基地在线看 | 精品久久99| 激情综合99| 久久加勒比| 激情五月天99色| avv在线| 五月丁香天堂| 99久久久免费| 亚洲色爽| 丁香五月电影| 在线成人网站| AA片在线观看视频在线播放| 伊人丁香五月婷婷潮吹| 久久九九@| 九九99热久久精品66中文字幕| 天堂亚洲 在线| 五月天激情啪啪| 欧美日韩国产一区| 狠狠草婷婷| 亚洲性爱99在线| 亚洲性爱区无码区| 色天堂A| 99操逼| 五月丁香狠狠爱| 婷婷伊人五月天| 久热这里| 91视频久久久| 日日夜夜青青草| anquye五月| 四色99久久| 丁香六月激情| 激情综合网激情五月婷婷| 日韩AC在线免费观看| 去色色五月天| 99热日韩这里只有精品| 大婷婷色呦呦噜噜色呦呦噜噜| 92久久| 五月玖玖| 日逼影音先锋AV男人资源站| 最新日本A片| 狠狠擼综合| 五月婷天天搞视频| 99精品久久| 久草视频大香蕉99| 精品一区二区三区四区五区六区介绍 | 99国产精品久久久久久久久久久| 婷婷成人在线| 九九热视频免费观看| 亚洲春色奇米影视| 六月婷婷天天操夜夜爽视频| 思思热AV| 日本视频不卡123区| 婷婷成人av| 九洲一级A片| 五月婷婷丁香| 少妇综合网| 天天做天天爽| 超碰成人电影| 在线综合网| 色色色网站| 色婷婷色综合久久精品V| 色玖玖玖| 中文AV网站| 五月色综合| AV免费在线网站| 高潮毛片遮挡费高一百度| 色爱终和网| 91色综合| 五月丁香婷婷成人版| 综合狠狠五月婷婷| 狠狠色综合网| 性一交一乱一交A片久久四色| 丁香色情五月综合网站| 深爱激情五月天| 一本色道久久88加勒比—| \\五月天婷婷激情| 亚洲精品视频在线播放| 99在线视频播放| 色色 9| 欧美经典片免费观看大全| 九九九九大香蕉| 五月天激情中文字幕| 国产成人+综合亚洲+天堂| 久久久.www| 激情五月综亚网| 丁香六月综合激情| 久久久999精品| 久久99性爱| 亚洲网站观看视频| 五月丁香六月激情综合网| 色婷婷aV四虎| 全部老头和老太XXXXX| 婷婷五月成年人| 韩国久久少妇视屏| 最近中文字幕2019视频1| 亚洲超碰中文字幕| 情婷婷五月天在线| 啪啪一区| 99久久人妻精品无码二区| 亚洲视频另类| 久久只有18视频| 五月丁香成人日| 色噜噜,噜噜色| 精品色情一区二区三区四区| 天天摸天天肏| 国产欧美熟妇另类久久久| 五月丁香亭亭| 久久A极片| 97色色视频| 久热伊人91| 亚洲AV成人无码电影| 狼人婷婷久久| 久久99热 这里有精品| 色情五月| 丁香六月狠狠| 五月天综合在线观看视频| 9久久婷婷国产综合精品性色| 五月丁香人妻| 激情五月瑟瑟| 蜘蛛女免费观看完整版高清电影| 欧美中文五月天| 涩五月婷婷| 青柠影视免费高清电视剧| 超碰婷婷五月| site:hcxsz888.com| 99热在线中文字幕| 99思思| 免费看欧美成人A片无码| 好大好粗嗯啊-一级黄色大片免费观看-成人AV| 丁香五月天啪啪| 五月天狠狠干| 色色色色综合| 亚洲无码99| 99婷五月| 9九热视频| 色停停五月天| 国产成人片| 91av视频在线观看最新网址| 国产精品-第3页-91JQ就要激情网91JQ5.JQJQ926.XYZ | 热99在线精品| 婷婷五月丁香基| 五月婷婷色色色| 五月天婷婷影院影院| 看全色黄大色大片| 丁香操逼| 狠狠人人| 大香蕉婷婷| 五月天婷婷无码| 性色欲情 网站| 欧美爆乳一区二区三区| 蜜桃人妻无码AV天堂三区| 97在线日本| 亚洲性爱干干| 久久只有18视频| 色色色五月天激情资源| 欧美综合五月丁香六月婷| 久久多色| 九月婷婷综合网| 99热日本| 97操操| 中文字幕综合色| 六月婷婷深深爱| 99热综合在线| www激情婷婷com| 成人精品视频99在线观看免费| 婷婷五月天丁香社区| 色婷婷丁香五月色综合网| 五月天婷婷久久视频| 日本97人人| 五月婷婷成人w| 97色婷婷| 天天肏夜夜肏| 中文字幕在线免费| 色97啪啪| 精品无吗va视频免费观看| 一本道在线电影| 久久五月婷| 96丁香六月婷婷蜜桃综合久久| 丁香五月花影院| 激情丁香久久| 4399成人黄A片| 五月丁香福利| 日本99在线视频| 久久一伦| 婷婷五月在线视频| 综合一区二区三区| 成人婷婷| 99九色视频在线观看| 激情五月婷婷| 亚洲啪啪网| 婷婷九月丁香| 99热99美国在线观看| 色五月色五天免费视频| 六月激情丁香一道本7777| 99精彩视频在线观看| 99热在线播放| 亚洲精| 麻豆WWWCOM内射软件| 玖玖99婷婷| 婷婷丁香五月视频| 国产亚洲成AV人片在线观黄桃| 激情五月天噢美| 日日爽夜夜爽| 成人欧美一区二区三区在线观看| AA片在线观看视频在线播放 | 國語久久婷| 亚洲婷婷激情综合激情999精品| 婷婷五月中文在线视频| 中文久久婷婷| 五月天啪啪啪| 天天噜日日噜综合无码| 97五月天| 天天拍夜夜爽| 中文字幕高清av| 亚洲aV写真天天综合网久久| 91在线日本| 久久婷婷丁香| 婷婷六月丁香在线| 欧美成人精品A片免费一区99| 婷婷丁香五| 第四色在线观看| 天天干天天玩天天夜天天射天天操天天日蜜臀少妇 | 九九XX视频| 草做免费在线观看| 色色综合激情| 99热这里只有精| 草美女在线观看视频在线播放| 丰满老熟妇BBBBB搡BBB | 婷婷五月天影院| 五月婷婷开心亚洲无| 婷婷五月天激情小说| 青青操成人福利| 色综合激情| 婷婷五月天网址| 337p大胆噜噜噜噜噜91Av| 色色五月婷| 久青草影院| 色五月婷婷啪啪五月| 91干99| 激情www| 第五婷婷伊人丁香色| 伊人啪啪网| 情欲综合网| 爱iii做iiii日| 五月丁香色婷婷| 亚洲综合视频网| 色九区| 丁香六月天之亚州热女| 99在线69| 色综合99色| 四虎成人精品永久免费AV九九| 婷婷五月天 偷拍| 99热爆在线| 久色| 九九草热在线观看| AV在线免费网站| 五月激情综合网| 狠狠色噜噜色狠狠狠综合久久成人波 | 日韩成人AV在线| 极品少妇XXXX精品少妇偷拍 | 日韩成人电影Av| 另类激情中文| 九九99一区| 久操热线| 综合久久六月| 国产亚洲精品AAAA片APP| Www.狠狠| 五月丁香激情婷婷综合字幕| 亚洲色碰| 在线99热| 九九精品在线观看视频6| 成人噜噜网| 97超碰在线观看免费| 这里只有精品视频在线| 激情爱爱网站超大免费| 国产日韩亚洲欧美在线观看| 激情五月丁香色婷婷| www.henhenl| 影音先锋一区二区资源站| 夜夜操夜夜操| 超碰免费大香蕉| 激情六月一二| 久久99久久99精品免视看婷婷| 丁香六月婷婷久久高清| 久久综合婷| 97超碰免费超级在线观看| 亚洲精品成人| www,色婷婷| 丁香五月婷婷欧美成人色图| 五月天婷婷青青| 亚洲综合99| 黄色五月婷| 成人丁香婷婷| 影音先锋男人女人| 国外亚洲成AV人片在线观看| 亭亭五月丁香五月天激情| 九九这里有精品| 久色网五月| 99久久99热| 久久久www| 99丁香五月婷婷在线| 亚洲狠狠色丁香婷婷综合久久| 五月婷婷大香蕉| 成人视频在线免费播放| 思思热99热| 99热这里只有的精品视| 色噜噜在线| 情五月亚洲婷婷| 视频这里只有精品| 天天做天天爱天天爽夜夜揉| 色婷婷成人做爰A片免费看网站| 久久激情五月天| 色婷婷婷婷| 婷婷丁香五月综合网上 | 伊人久久大香线蕉亚洲五月天,| 婷婷在线网| 日日夜夜干| 婷婷五月天激情小说| 久久ww| 久久伊人婷婷| 大香蕉九九| 91在线日| 日日操日日撸| 依人大香蕉| 五月天激情久久| 九九久久99| 另类激情综合| 天天干天干| 99久久婷婷| 99精品自拍| 亚洲成人网站在线观看| 99精品综合| 色五月婷婷五月天| 国产欧美性成人精品午夜| 婷婷五月天社区| 丁香五月影院| 色色色com| 永久天堂日本| 久久久久网站| 色五月天.con| www.伊人天堂偷偷婷婷| 精品,99| 欧美婷婷精品激情| 色婷婷五月色| 大香蕉九九| 亚洲综合另类| 91re色综合视频| 99久久婷婷综合| 久久婷婷六月综合综合| 亚洲熟女色| 久久五月天色婷婷| 久久婷婷东京热大香樵| 色九月婷婷丁香| 日韩不卡DvD| 玖玖在线视频福利| 激情丁香五月激情婷婷| 丁香五月天啪啪a日本| 在线只有精品| 99视频这里有精品| 激情5月婷婷| 日本天堂网站99| 1区2区视频| www.色99| 1010日日无码| 色五月婷婷av| 99人妻碰碰久久久禁片| 任你日热视频| 久热这里这里有精品| 天堂婷婷丁香六月网| 色播播婷婷| 色狠狠综合| 亚洲乱码日产精品BD在线观看| 五月J香蕉婷婷| 婷婷伊人五月丁香天堂网| 日韩在线9| 99热这里只有精品10| 人人人人人人人草| 婷婷天堂综合| 五月婷婷电影院| 98永久精品| 26UUU成人网| 五月天综合图片| 超碰免费99| 性按摩玩人妻HD中文字幕| 婷婷基地成人五月天| 亚洲综合九九| 五月天综合图片| 丁香婷婷久久 | 初夜av| www.五月丁香| 欧美叉叉叉BBB网站| 99热在线爱| 欧美久草在线日本一级特黄大片做受9在线观看韩国电影《两个女人》未删减-毛片 | 久久婷婷五月综合激情国产| 九九婷婷五月天影视| 五月天淫乱视频| 国产毛片精品一区二区色欲黄A片| www.1024久久| 亚洲 激情 中文| 五月天激情综合网| 综合福利网| 成人av在线电影| 日本成人小说婷婷六月| 六月丁香激情网| 碰久久精品w| 精品视频这里只有精品| 九九热精品视频在线观看| 婷婷五月天av| 久久久香| 色五月婷婷一二| 午夜少妇在线观看视频| 97操在线视频| 天天操天天操天天操天天操天天操| 极品人妻VIDEOSSS人妻| 五月激情啪啪啪| 激情欧美五月丁香| 在线18av | 无码啪啪| 国产九九一区二区三区| av婷婷丁香| 人妻内射麻豆视频| 婷婷开心激情| 精典久久| 五月天四色房丁香亭亭| 综合色图婷婷| 婷婷亚洲丁香五月| 天天爽天天干| 97人人操在线| 人妻久久婷婷| 九九99在线| 可以免费看的av网站| 99亚洲视频| 超碰在线9| 激情丁香五月天图片| 亚洲亚洲人成综合网络| 成人羞羞啪啪 全 视频| 开心深爱激情网| 五月天婷婷基地综合网| 日日噜噜夜夜狠狠久久丁香五月| 丁香六月婷婷基地| 五月婷婷激情色情网| 色色色热| 99色在线视频观看| 色婷婷五月天偷拍| 如何安全看伊人婷婷| 九九这里是免费的视频5| 色玖玖网| 五月情色天| 日本一级淫| 国产va在线视频| 亚洲五月婷| 色色五月天婷婷| 91碰| 婷婷九月激情| 色射影院| 婷婷五月天AV| 亚洲综合五月| 99视频色在线观看| 狠狠精品干练久久久无码中文字幕 | 狠狠ri| 色婷婷色五月丁香| 国产露脸150部国语对白| 欧美99热| 精品一二三区久久AAA片| 色婷婷激情小说网| 在线18av | 亚洲婷婷婷| 97色婷婷| 99性爱视频网站| 超碰成人影视| AV性爱在线| 9热久久| 丁香婷婷六月男男| 色婷天天| 思思久久99| 五月天色婷婷激情综合| 中文字幕欧美日韩VA免费视频| 色五月久久成人婷婷| 第四色在线观看| 欧美色色色| 久久久亚洲成人无码A片| 婷婷丁香色五月| 欧美在线视频9| 丁香婷婷性久久| www、丁香五月天| 在线色色| 5月丁香婷婷| 亚洲最大成人综合网720P| 嫩BBB槡BBBB搡BBBB视频| 天天色中文字幕女优AV| 99亚洲精品视频| 91porn一起草| 五月天激情婷婷| 激情五月综合免费| 激情婷婷在线| 日本婷久久| 欧美丁香婷婷天天操| 极品少妇XXXX精品少妇偷拍| 婷婷丁香色情| www.色色五月天.com| 五月激情影视| 五月天伊人手机在线播放AV| 91热视频色网站| 狠狠狠狠狠狠狠狠| 青青草婷婷综合五月| αV电影| 亚洲成人高清在线| 丁香五月天殴美激情| 97男人天堂| AA久久| 色色色视频免费无码| 五月婷婷 激情按摩| 丁香五月婷婷AV在线| 五月天色图| 日本熟妇乱妇熟色A片蜜桃| 婷婷丁香激情综合色情| 五月婷婷久久综合| 色婷婷五月天av在线| 综合99久久天天综合| 开心五月天私房婷婷| 99操九九网| 黄色成人网站在线播放| 天天综合色综合| 五月丁香久久综合色| 色无码| 色女伊人| 天天操夜夜啊| 欧美成人日韩| 免费观看欧美成人AA片爱我多深| 五月婷婷五月天| XXXX岛国| 99人人操人人操人人精| 欧美成人一区二区三区在线视频| 色女人久久| 五月天小说激情| 激情文学第四色婷婷丁香五月| 538在线精品| 五月天激情国产综合婷婷婷| 思思热精品免费视频| 色欲五月婷婷| 9 7总站超级碰免费视频| 在线中文字幕视频| 久久五月天激情| 热九九在线| 五月花激情网| 久久久天堂国产精品女人| 99久热在线精品| 亚州AV超碰人人操| 亚洲VA欧美VA| 五月丁香激| 久久久精品婷婷五月天| 99在线精品观看99| 久久性操| 狠狠色综合精品视频在线| 欧美激情 日韩无码 婷婷 五月天| 色婷婷操逼网| 激情综合色婷婷啪啪五月天| AA丁香综合激情| 99精品无码| 婷婷丁香基地在线| 国产裸舞福利资源在线视频| 激情综合网五月丁香| 九九色插| 99热个人在线| 丁香六月综合激情| 日日综合网| 婷婷色五天| 这里只精品热在线18| 日本人妻丁香婷婷久久寝取熟女五月| 五月激情婷婷综合| 综合五月丁香六月婷婷| 大香蕉婷婷婷| 激情四射亚洲| 天天射网站| 91日本在线观看| 黄色片区子| 婷婷娌伦网| 婷婷综合五月天亚洲综合| 天天综合色综合| 草操AV在线| 五月大香蕉| 91人人网| 激情丁香九九五月综合网| 美女xx不卡| 久久XX日本综合| 亚洲V国产V欧美V久久久久久| 色播播五月天| 99热免费观看| 亚洲综合五月天婷婷| 综合久久综合久久| 热99精品视频五月| 丁香六月激情| 武则天精品久久| 六月婷久久| 97超碰在线免费观看| 91久久1118| 激情无码网| av第一二区| 久久丁香社| 丁香熟女乱| 夜夜AVV| 五月激情久久| 99丁香五月婷婷在线| 色婷婷亚洲综合av| 亚洲天堂九九九| 性爱五月婷| 青青日韩| 五月停停色| 国产熟女大叫受不了| 九九热大香蕉| 五月婷婷性爱| 色情·com| 午夜丁香六月婷| 亚洲激情视频网| 天天狠狠色| 天天综合网网欲色| 婷婷深爱五月天| 婷婷激情人妻| 激情五月综合网最新| 色播五月丁香| 日本色婷婷| 久热在线中文字幕色999舞 | 99久久婷婷精品视频| 欧美高潮9| 九色地址91视频| www.色五月| 蜜桃人妻无码AV天堂三区| 国产欧美日韩综合精品一区二区| 激情五月婷婷色综合| 噜噜五月天综合| 97热九九| 99久久婷婷国产综合精品青桔| www。狠狠干。com| 严洲天天插| 综合网视频| 五月天激情久久| 九九热在线视频| 欧美性生交XXXXX无码小说| 丁香花狠狠婷婷亚洲中文字幕| 激情婷婷五月少妇| 狠狠色丁香久久久婷| 操逼福利视频| 四色五月婷婷| 五月婷婷之综合激情| 亚洲av无码精品色午夜| 狠狠色综合久久| av在线免费网站 | 99在线免费观看| 黄色热99| 色狠狠综合| 国外亚洲成AV人片在线观看| 99热成人| 天天色粽合合合合合合合| 婷婷久久五月| 亚洲国产精品VA在线看黑人| 停停六月 综合| 无码色| 综合天堂AV久久久久久久| 婷婷丁香色性爱| 婷婷五月激情综合| 亚洲色综合性| 国产精品成人在线| 激情综合视频| 9 1超碰九色| 热99re| 在线观看的av| 思思久久99热只有频精品66| 99久操| 五月丁香网站在线播放| 99∨VTV| 国产亚洲精品久久久久久郑州| 综合婷| 五月婷婷激情四季| 99热综合网| 久久免费精彩视频| 国产AV不卡福利| 五月花成人网| 99热这里只有精品1025| 91精品91久久久久77777| www999日韩精品| 五月天激情.com| 色色操| 日韩操啪| 五月色丁香婷婷中文字幕| 免费啪啪亚州视频| 五月激情综合婷婷| 色婷婷五月六月丁香综合视频| 五月激情婷婷在线| 亚洲亚洲人成综合网络| 伦乱天堂| 狠狠干夜夜干| 亚洲深喉aV| 婷婷性爱| 婷婷五月色播| 色图亚洲91| 性色播| 色色色婷婷五月| 99在线看视频| 色天天久婷婷| 色吧五月婷婷| 五月丁香色婷婷色| www.五月天社区| 99色热| 久久9精品| 久久美女五月天| 久草婷婷网| 色情·com| 五月婷婷久久久| 91av视频在线观看最新网址| 日日夜夜爽爽| 九九AV| 超碰人人色| 天天爽天天操| 久色大香蕉| 婷婷五月天激情综合深爱| 激情五月激情综合网| 色天堂A| 久久偷拍综合五月天| 在线播放人妻| 色播五月天天| 性爱综合网| 丁香五月成人| 91Chinese在线| 亚洲婷婷久久综合| 五月丁香婷婷色色色| 国产精品人人妻人人爽| 性爱激情久久| 五月中旬婷婷丁香六| 99在线精品免费视频| 再次出发二| 六月天婷婷| AV大香蕉| 在线观看中文字幕| 久久久久婷婷| 日韩无码专区| 天天看A片| 日韩成人AV在线| 热久国产| 久久多色| 91爱操| 中文字幕在线免费观看视频| 99操逼视频| 成人网址在线观看| 亚洲av免费在线| 激情综合无码| 超碰成人免费| 五月婷婷片| 婷婷五月天受日本法律保护| 26uuu在线观看| 入口五月婷婷六月香| 五月婷婷成人| 五月天天天操天天爽夜夜操| 婷婷综合网站| 五月丁香婷婷五月色| 性做爰1一7伦| 综合久久五月| 五月婷婷黄网站大全| 99精色| 久久精品99久久久久久久久| 婷婷五月天电影网| 五月天丁香综合久久国产| 婷婷丁香激情综合色情| 91精品久久久久| 婷婷爱五月| 六月丁香婷啪射| 丁香综合| 婷婷深爱五月丁香| 天天综合 99久久婷婷| 五月婷婷色影院| 五月天狠狠网站| 亚洲精品又粗又大又爽A片 | 欧美激情 日韩无码 婷婷 五月天 久久婷婷丁香五月一二三 | 五月丁香婷婷啪啪| 99热99日…..| 久久se 综合网| 第四色婷婷丁香五月| 七七色色综合| 五月婷婷综合激情| 欧美婷婷五月激情| 99视频综合网| 亚洲碰碰碰| 欧美极品999| 激情五月婷婷| 成人丁香五月| 91在线日| 中文字幕日产A片在线看| 天天摸天天日天天舔| 91视频综合网| 丁香五月婷婷网| 亚洲日比视频| 亚州操操| 日韩一区二区三区无码| 婷婷丁香婷婷97| www色五月| 成人色五月天| 婷婷成人在线| www.婷婷五月天| 五月天激情美女久久| 在线不卡中文字幕| 成人av免费观看| 99成人免费视频| www.久久爱.com| 99国产精品久久久久久久久久久| 国产精品香蕉| 99精品久久久久久久婷婷| 男男野外做爰全过程69| 网站免费一站二站| 99热永久在线观看| 91操女| 99熟女| 五月婷婷狠狠干| 另类精品视频在线观看| 99精品偷自拍| 丁香五月先锋| 亚洲无码成人性爰网| 国产九九一区二区三区| 国产肥白大熟妇BBBB视频| AV性爱在线| 婷婷五月天视| 在线99精品| 极品少妇XXXX精品少妇偷拍| 99只有这里有精品在线视频| 热九九在线| 欧洲区自拍| 九九热精品在线| www.五月天婷婷| 色婷婷4| 99亚洲视频| 狠狠婷婷色| 婷婷五月电影院| 免费视频这里只有精品| 激情婷婷五月天| 婷婷六月久久| 五月天婷婷综合| www.9797国产| 天天擼久久擼在线| 99re这里只有精品99| 婷婷基地成人五月天| 亚洲九九夜夜| 99ri视频在线播放| 丁香五月第四色88| 丁香五月天堂网| 丁香五月婷婷高清| 少妇人妻人伦A片| 中文字幕在线免费观看视频| 99热费观看| 五月色无码| 亚洲精品成人| 久xxxx| 青青草原亚洲久| 91久操| 亚洲综合网 665566| 激情网婷婷婷| 色情·com| 最新色色五月天| 久久婷婷六月综合综合| 久久综合99综合| 我爱大香蕉| 久久五月激情| 人人播| 国产婷婷五月天| 六月香五月婷| 婷婷六月色| 色爽九九| 久久婷婷五月丁香网| 色综合色综合网| 狠狠色性| 国产精品久久99| 色99在线视频| 97丁香五月| 色婷婷玖玖影院| 狠狠色综合久久久久| 亚洲精品国产A久久久久久| 丁香五月天色婷婷| 欧美久久婷婷| 国产精品色婷婷久久久精品| 天天综合亚洲| 永久地址 色| 5月婷婷性视频| 色必久悠悠影院| 丁香五月天无码AV| 99热最新网址| av网址在线| 五月丁香花视频| 91chinese 在线| 色婷婷影音| 色九月丁香婷婷蜜桃在线观看| 成人综合视频网址| 精品亚洲国产成AV人片传媒| 高清无码网址| 五月婷婷五月天| 婷婷在线视频| 成人看片网站| 狠狠操狠狠插| 欧美三级A做爰在线观看| 五月婷婷无码| 九九色色| 免费视频WWW在线观看网站| 日本天天色| 成人做爰A片免费看网站找不到了 噼里啪啦在线观看免费完整版视频 | wuyuedingxiang| 久草免费福利视频| 亚洲AV日韩在线观看| 亚洲av另类在线观看| 亚州男人天堂婷婷五月| 第九色区AV在线| 丁香五月 性爱| 亚洲国产黄色电影| 国产在线视频1234| se.久久视频在线观看| 啪啪东京热| 狠狠色丁香久久| 久99综合婷婷| 91丨九色丨国产打屁股| 丁香色五月婷婷17C| 成人精品一区二区三区四区五区 | 色色婷婷丁香| 免费无码毛片一区二区A片| 桃色成人网| 五月婷婷影视| 天天久久婷婷| 久久的爱大香蕉| 色在线99| 欧美精品99久久久| 蜜臀av无码久久久久久久久| 激情久久天天| 另类综合婷婷五月天欧美视频| 色综合色综合色综合色综合| 可以免费观看的av| 色播婷婷五月天| 婷婷丁香六月| 艳妇野外情欲放荡HD| 国内精品99| 丁香花成人区| 日韩婷婷| 日韩抽插操逼| 丁香五月天的网址。| 99只有这里有精品在线视频| 色欲久久综合| 无码AV免费精品一区二区三区| 69凹凸成人综合网| 91丨九色丨老农村| www.99视频| 97涩涩丁香五月天| 日本颜色视频人人爱| 9热精品| 深爱激情五月天| 婷婷丁香无码专区| 99.N在线视频| 色VA| 婷婷五月花西瓜| 狠狠色五月| 色色色999| 婷婷丁香五月社区亚洲| 九九99热| 欧美99热| 五月丁香中文| 婷婷深爱五月天| 91黄色五月天视频| 婷婷99中文字幕| 色五月av伊人| 五月天偷拍| 国产一级片| 色级婷婷| 婷婷久久五月天| 五月丁香无码| 九九精品自拍| 综合色五月亭亭| 亚洲色图五月丁香| a v色婷婷| 婷婷激情六月视频| 婷婷在线视频| 五月天丁香婷婷社区| 天天搞夜夜叫| 欧美激情综合五月色丁香| 九九热视频精品| 午夜成人av在线| 婷婷六月色开| 亚洲丁香五月| 色婷婷丁香五月| 五月婷狠狠| 噜噜噜噜婷婷五月天| 亚洲色色香蕉| 丁香五月天激情综合| 婷婷五月欧美| 五月色情婷婷开心五月天| 欧洲亚洲精品| 中文字幕无码人妻少妇免费视频| 精品九九网| 色综合久久伊伊婷婷五月| 亚洲成人在线综合| 91中文狠狠综合| 久久作爱| 丁香婷婷婷五月| 色综合色色| 婷婷丁香五月色偷偷| 婷婷色色播五月天| 久久久网站| 九九热99精品| 天天 日综合| 色五月婷婷基地| 色色图五月天| 日本婷婷综合精品| 丁香六月色婷婷| 久久久.www| 另类图片激情五月天| 九九99九九99九九99视频网| 丁香av网| 天天日人人| 色情综合网| 久久九九99桃花视频| 少妇人妻凹凸视频| 久久精彩视频| 婷婷射图五月天| va婷婷| av一级棒av| 五月丁香亚洲校园欧美| 五月天停婷基地| 丁香五月玖玖| 高清无码 一区 二区 三区| AV在线资源| 婷婷丁香社区| 996日日爱| 又大又粗九一在线| 婷婷激情五月天天天开心| 九九AV在线| 成人在线视频男人的天堂4399| 五月激情基地| 国产精品久久久久久久久久| 欧美99热| 久久总和99| 9九色首页| 26UUU欧美| 婷婷五月丁香激情| 婷婷深爱五月天在线| 日本三级韩三级99久久| 香蕉综合在线| 五月婷婷啪啪啪| 久操97| 久热这里| 日本色色影院| 91精品久久久久久综合五月天| 国产精品久久久爽爽爽麻豆色哟哟| 日韩色色色99| 婷婷99狠狠躁天天躁| 婷婷五月激情欧美| 久久婷五月综合| 色婷婷情片| 亚洲美女网Va| 色九月综合网| 五月激情六月综合| 大香人妻| 五月婷婷激情视频| 综合激情九月婷婷,激情综合婷婷中文字| 国产精品蜜臀99| 色五月亚洲| 五月丁香啪啪综合网| 影音先锋91网站在线观看| 日本va网站| 99国产精品白浆在线观看免费| 婷婷久久婷婷色五月| 欧美在线干| 丁香五月婷婷综合视频| 91丨九色丨国产打屁股| 色婷婷五月天天天天天| 深爱激情五月天| 五月天婷五月天综合网小说首页-五月天激激婷婷大综合,婷婷亚洲综合五月天小说 | 欧美成人猛片AAAAAAA| 婷婷中文字幕| 九九热10| 嫩草AV久久伊人妇女超级A| 久久亚洲网| 欧美交换配乱吟粗大25P| 久热这里有精品视频| 国产亚洲精品久久久久久郑州| 热久久思思热思思| 无码少妇高潮喷水A片免费 | AV在线不卡播放| 婷婷激情啪啪| 色色综合五月| 五月婷婷免费在线视频| 骚五月婷婷| 99在线69| 欧美激情五月天婷婷| 成人做爰高潮A片免费视频| 天天爽人人爽| 丁香五月桃花在线激情综合| 五月天天爽| 综合色吧| 啊V视频在线观看| 五月婷婷在线丁香| 亚洲精品久久久久久久久久吃药| 天天日人人| 亚洲精品无码A片一区二区| 婷婷六月丁香欧美视频在线| 六月婷婷九月丁香| 综合色播| 色婷婷五月天激情久久| 成人五月天综合网| 直接看的av| 亚洲精品亚洲人成人网| 色婷五月天| 精品色色色| 99WWW免费视频| 色吧五月婷婷| 丁香五月激情站| 亚洲99一级无嗎特制在线| 99a级片| 亚洲色精彩| 久久婷婷五月综合色丁香花| 思思热精品在线| 色综合久久44| 开心激情站| 毛片毛片毛片毛片| 99热99精品| 激情五月婷| 色色五月婷婷丁香| 九九热99免费视频| 开心五月天激情网| 丁香五月激情五月开心五月| 天天射天天干天插色综合| 丁香五月社区| 开心激情播播五月天| 欧美大香蕉视频| 亚洲精品一区中文字幕乱码| 日韩精品二三区| 色色婷婷丁香| 欧美日韩二区在线| WWW.17C亚洲精品| 色五月婷婷激情综合网| 性爱激情久久| 97色婷婷成人综合在线观看| 天天日人人| 色婷婷AⅤ| 色婷婷电影网| 天天干狠狠| 五月丁香六月综合情在线观看| 狠狠ri| www.色99| 婷婷五月六月丁香综合| 8区视频在线| 日本大人久久| 国产成人AV在线| 人妻尝试久久久久久久久久久久| 另类激情四射| 婷婷色情 | 伊人激情综合网| VA婷婷亚洲| 亚洲AV成人在线| 婷婷五月综合丁香久久| 五月婷婷激情综合网| 夜夜骑天天玩天天日| 激情视频婷婷五月花| 偷拍99在线视频观看| 色五月激情五月开心五月| 五月婷婷婷婷| 安息电影在线观看完整版| 色婷婷在线影院| 丰满少妇乱A片无码| 一起草无码| 婷婷五月激情在线| 五月天激情黄色小说在线观看| 碰久久精品w| 日本天天色| 五月丁香网av| 69色婷婷| 国产毛片精品一区二区色欲黄A片| 人人操人人干AV| 综合图区激情| 日日天天天| 1024操逼视频| 67194中文在线| 婷婷五月天激情网| www,com,五月色色| 五月婷婷六月基地| 狠狠干天天内射| 91视频精品99| 欧美日韩精品一区二区三区钱| 婷婷激情五月综合| 99啪| 中文av网站| 99re这里有精品手机在线| 无码九九| 亚洲无线视频| 日韩 mm 不卡| 亚洲网综合在线| 99性爱| 五月丁香婷婷综合久久| 欧美成人色婷婷| 久久草婷婷丁香网站| 激情五月,色五月| 人人操插| 激情图片99| 丁香婷婷午夜| 久久电影五月天丁香电影|