99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜AV-亚洲一级无码一区二区一-免费国产成高清人在线视频-中文字幕乱码免费观看-国产毛片精品妇女久久久

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
返回資訊列表
五月激情久久| 亚洲综合五月天婷婷| 久热9热| 五月天全国最大成人网| 久久久欧美精品sm网站| 五月丁香啪| 66久久视频在线| 超91热| 野战毛片三一3| 色五月超碰| 亚洲九区| 色了色综合| 91久久九色| 99色婷婷视频| 99热这里只有精品免费| 99视频在线观看欧| 欧美久草在线日本一级特黄大片做受9在线观看韩国电影《两个女人》未删减-毛片 | 五月天色在线| 欧美性久| 久久看九九90| 亚洲精品久久久久久久久久飞鱼| 婷婷亚洲欧美丁香五月| 婷婷综合网在线| 97热九九| 人人综合久| 婷婷五月天Av| 色色色地址| 亚洲国产精品二二三三区| 五月激情六月综合| 天天综合在线网| 久久久人妻不卡| 97久久超视频| 一区=区操屄高清大全av| 深爱激情五月婷婷| 五月婷婷色| 综合网五月| 欧洲精品欧洲情| 色婷婷啪啪| 欧美性做爰大片免费看办公室| 秋霞A V毛片| 这里有精品2| 五月丁香激情综合网官网| 《丁香激情综合久久伊人久久》影视在线观看 -高清预告手机免费播放 -三妹影院 | 九热免费视频| 99ri视频在线播放| 思思热在线| 99re热久久| 亚洲午夜精品久久久久久人妖| 涩涩激情五月婷婷| 欧美怡红院黄站| 亚洲综合另类| 久久精品99| 久久久99视频| 99综合久久| 狠狠干五码| 天天爽天天日人人爱 | 五月天激情美女久久| 激情亚洲网| 亚洲午夜一区二区| 久久婷婷五月天| 97色女人在线| 国产激情综合五月久久| 99ri精品| 激情五月综合| 色yeye欧美| 丁香五月瑟瑟| 视频久久9| 激情图片婷婷丁香五月| 97干在线| 色天天综合色| 色婷婷五月天不卡| 中文AV在线观看| 五月天婷婷综合免费| 99re热视频| 婷婷五月天99| 国产精品VA在线| 国产在这里只有精品| 激情图片五月天| 五月天色婷婷网| 婷婷丁香激情| av色婷婷| 99人妻碰碰久久久禁片| 婷婷成人在线| 激情五月深爱五月| 思思热国产| Www,五月天| 色五月婷婷在线观看| 丁香五月天在线| 男女久久婷婷五月天| 热久久国产视频| 欧美综合丁香网| 久久这里有精品99| 五月天丁香成人| 日日噜噜夜夜狠狠久久丁香六月| 色婷婷综合网| www.91AV.COM| 激情综合播播| 99在线小视频| 久久九九综合| aaaa.黄| 精品网站:999WWW| 五月开心婷婷网| 99九九在线精品热动漫| 九九热在这里只有精品| 免费黄色视频网址| 丁香花狠狠婷婷亚洲中文字幕| 91丨九色丨首页| 日本人妻伦在线中文字幕| 婷婷五月久久| 色99久草在线| 伊人色综合久久久| 久久久国产精品黄毛片| 青草性爱视频| 五月在线| 国产精品涩涩涩视频网站| 狠狠爱丁香婷| 天天日夜夜高潮| VfJxEwPH| 婷婷丁香18| 97色97干| 日本va欧美va欧美va| 六月撸婷婷| 99九九久久| 久久九九热38| 深爱激情四射| 五月天婷婷视频| 雪千夏麻豆| 色情五月婷婷| 停停五月色宗合| 婷婷成人五月天成人文学| 99热香港| 人妻内射麻豆视频| 色婷婷小说| 激情综合网激情五月俺也去| 丁香五月天激情五月天激情五月天激情网| 在线只有精品| 丁香婷婷六月| 天天干天天 亚洲| 色婷婷综合网站| 国产av网| 久久99久久99精品免观看软件| 日本一级| 婷婷激情五月呦呦| 夜夜夜夜做天天天做无码视频| 亚洲免费观看高清完整版AV线| 色色欧美色色色| 日韩成人av在线| 色五月丁香婷婷在线观看| 99色在线| 激情伊人五月婷婷久久| 色婷婷成人做爰A片免费看网站 | 五月天色婷婷图片| 日韩免费视频| 操逼123网| 开心激情五月天网| 激情五月天久久丁香| 久碰婷婷视频| 97色婷婷成人综合在线观看| 成人在线精品| 99操99| 另类激情五月在线视频欧美| 亚洲精品成人片在线播| 精品久久人妻| 久久婷丁香五月| 五月婷婷,六月丁香| 天天干天天av天天射| 思99热精品久久只有精品| 中文字幕在线免费观看视频| 丁香五月婷婷成人色区| 99自拍视频在线观看| 伊人久久婷婷| 大地9中文在线观看免费高清 | 91色久| 日本超碰在线| 国产精品VIDEOSSEX久久发布| 99久超碰| 五月丁香六月色| 久久9久| 超碰免费99| 色五月婷婷影院| 人妻久久久久久久久久| 五月天激情啪啪| 991精品在线视频| 免费播放片大片| 婷婷色在线播放| 超碰97色| 婷婷99狠狠| 天搞天天天天天| 婷婷五月激情综合| 成人中文网| 夜夜躁狠狠| 五月婷婷六月激情| 五月婷婷免费看| 色色色色色色五月婷婷| www夜夜操| 99热国产国产| 9热在线视频精品| 久久精品人妻| 99热这里只有精品国产免费| 31色区视频免费看| 99热官网精品在线| 久8色色| 日韩久久日| 九九这里只有精品| 婷婷成人综合免费视频| 久久大香免费| 少妇大叫太大太粗太爽了A片| 深爱激情久久| 99色热视频| 色99视频| www.9797国产| 99亚洲色| 天天综合网、天天综合色 | 激情五月婷婷| 99热激情| 五月丁香色婷婷熟女| 91天堂网综合| 另类在线免费视频| 天天精品视频免费观看| 色噜噜狠噜噜视频| 丁香激情婷婷网| 91精品又长又大又粗又爽又猛| 亚洲综合激情五月久久| 丁香五月天啪啪a日本| 日韩成人av在线| 99干日日干| 性生活视频98791| 91狠狠综合久久| 91久女| 五月丁香好婷婷A片网| 99'无码| 婷婷激情四射五月天| www.色99| www.jiujiujiu| 丁香五月天BBw| 婷婷天堂综合| 综合狠狠干| 一级AV片| 日本三级中国三级99人妇网站| 久久丁香五月婷| 快乐激情五月色婷婷| 五月婷婷之综合激情在线| 99久久网站| 天天操天天操天天操天天操天天操| 五月丁香猫咪久久婷婷综合视频激情四射网入口 | aaaaa黄色| 99九九这里有免费视频| 香蕉人妻AV久久久久天天| 九九热精品| 色久免费| 久久99久久99精品免观看软件| 丁香六月婷婷综合激情欧美| 99热久草| 大香蕉婷婷五月| 亲子乱av一区二区三区的| 天天色粽合合合合合合合| 色婷婷伊人| 俺去也五月天婷婷| 天天噜噜| 婷婷五月天伊人| 激情九九这里只有精品| 婷婷在线免费| 婷婷色情六月| 天天干夜夜想| 久久综合影院| 久久久久久久97| 五月丁香六月婷| 五月丁香六月婷婷操操操| 六月婷婷私欲| 婷婷激情五月色综合| 色色亚卅| 婷婷色五月天在线观看| 噜噜在线| 五月天婷婷色综合| 亚洲妇女熟BBW| 日本强伦片中文字幕免费看 | 色婷婷小说| 日韩高清成人| 天天狠狠夜夜狠狠2023| 天天弄天天操| 五月婷婷久草| 婷婷六月色情| 婷婷99狠狠| 日本人妻A片成人免费看片| 亚洲在线资源| 色五月aV| 日日夜夜狠狠操| 国产激情综合五月久久| 激情综合色| 五月天激情小说网| 久草丁香婷婷1024| 99re热在线观看| 影音先锋一区| 96性爱视频| 婷婷五月天亚洲精品| 欧美综合在线五月天色婷婷| 熟女激情五月天 | 青青草五月天| 91性高潮久久久久久久久| 婷婷五月天成人| 影音先锋自拍网| 久热A片| 九九超日本| 伊人色综合久久久| 久久99热这里只有精品23| 互月天综合| 玖玖精品视频| 色色国产| 丁香五月大香蕉AV| 五月丁香婷婷在线| 婷婷五月综合视频| 五月婷婷激情久久| 日韩 mm 不卡| 五月总合激情网| 久久66精品| 婷婷色亚洲| 婷婷丁香五月久久| 婷婷情色五月天| 五月婷婷深深爱| 黄色AAAA韩国guochansanji| 亚洲精品视频在线| 婷婷天天婷婷天天澡| 91久久久久久久久| 色综合五月| 在线成人网址| 五月婷婷丁香综合网| 一级二级色大片| 操操啪| 色婷婷另类| 九九Av| 亚洲五月天婷婷在线| www.91.com黄| www.99riav99| 97干婷婷五月天| 色婷婷国产精品综合在线观看| 99热这里是精品| 婷婷五月a| 免费视频舔| 亚洲五月花| 大地资源色婷婷视频在线| 中文在线成人| 五月婷婷色激情| 亚洲超碰在线| 色五月激情综合网| 五月婷婷日| 婷婷丁香色无五月| 人妻熟女一区二区AV| 欧美图片丁香五月天| 久久伊人日日夜夜| 五月激情在线| 亚洲婷婷视频| 免费黄色片子| 激情四射婷婷| 操九色| 亚洲中文字幕翔田千里| 这里只有国产精品在线| 色五月激情五月| 六月婷婷色综合| 久久98热re| 开心五月婷婷伊人| 丁香婷婷中文字幕| 六月丁香婷婷爱| 色综合色欲综合天天免费| 色色色色色色色色网站| 天天激情5月天亚洲| 操逼巨乳91| 91婷婷丁香| 夜色热久| 天天综合天天玩夜夜玩天天玩夜夜玩 | 激情综合网,婷婷| 五月天激情四射| 黄久久久| 日日干天天射| 九九无码| 丁香婷五月天| 国产美女无遮挡裸体毛片A片 | 五月激情偷拍| 久热视频A.| 玖玖热视频| 亚洲综合在线视频| 亚洲V国产V欧美V久久久久久| 99思思在线视频| 狠狠综合网| 激情丁香婷婷五月天| 日本色色色| 99热20| 激情五月天婷婷| 密臀久久| 综合五月激情| 亚洲婷婷久久综合| 丁香六月色香蕉视频| 99亚洲精品| 日本大人久久| 日日夜夜婷婷| ww久久| 99这里只有| 激情av| 极品少妇高潮啪啪AV无码| 婷婷丁香午夜综合影视| 午夜在线成人网站免费观看| h亚洲| 九九九九国产| 日本人人超碰| 任你操精品免费| 9l视频自拍9l九色成人| 五月天色小说| 久综合| 亚洲一个色| 中文字幕 中文字幕明步| 91精品久久久久久综合五月天| 在线99精品| 五月天激情影院| 色综合色综合色综合高潮| 91妻人人爽人人看片| 99爱在线观看视频| 97成人丁香婷婷| 色五月丁香五| 色五月网址| 五月丁香直播| 色婷天天| 超极99精品| 蜜臀av粉嫩av懂色av| 亚洲中文无码成人| 亚洲欧洲午夜成人精品av| 亚洲视频99| 六月丁香成人| 综合99视频| 国产精品久久久久9999小说| 五月婷婷六月丁香综合| 女高怪谈在线观看| 成人婷婷深爱综合网| 五月婷婷激情在线| 日本人妻伦在线中文字幕 | 亚洲色综合| 天天综合色综合| 视频一二区| 丁香婷婷九月在线| 婷婷视频网| 99精品视频网站| 婷婷丁香熟妇综合网| 五月天天综合网色婷婷| 亚洲乱码日产精品BD| 婷婷中文字幕| 亚洲激情网站| www。五月天。com| 欧美99| 九九超碰人人| 久久久婷婷五月天| 天天干,天天日| 婷婷五月激情中文字幕| 激情深爱五月| 成人丁香婷婷五月天| www.色9| 超级碰碰一区| www.seqingwuyuetian| 五月婷婷影院| 综合五月婷婷| 天天拍天天做视频| 超碰色综合| 91九色无码内射| 青草视频在线观看视频| 久综合网| 色婷婷六月| 六月撸婷婷| 婷婷丁香色五月| 678五月丁香亚洲综合| 久久99久久99精品免视看婷| 丁香五月色网| 成人综合AV| 五月天婷婷涩涩| 蜜桃婷婷丁香综合久久开心亚洲| 99ER热精品视频| 五月丁香激情啪啪| 日韩成人精品中文字幕| 九九av| 人人爱国产| 激情另类综合| 91色欲综合| 五月婷婷,六月丁香| 激情四射婷婷| 五月婷婷第四色| 五月丁香久久| WWW五月婷婷| 日本色色图| 激情综合网亚洲色图| 99色精品| 五月婷婷激情综合| 99九九精品| 99区视频| 激情五月com| 五月丁香六月色| 丁香婷婷影院| 丁香五月综合在线视频| 亚洲色色色色色色色色色| 九九一区| 亚洲无码黄色| 亚洲精品无人区| 天天爽天天操| 亚洲av| 六月色丁香婷婷| www激情| 天天玩天天摸| 超碰猛烈的性猛交| 五月婷婷丁香六月| 99丁香五月婷| 欧美啄木乌丝袜人妻系列| 亚洲成人在线免费| 五月婷视频在线观看| 五月激情婷婷丁香| 欧美激情VA永久在线播放| 日本人妻丁香婷婷久久寝取熟女五月| 精品人妻在线| 蜜臀av粉嫩av懂色av| 伊人综合网4| 国产ava| 最近中文字幕2019视频1| 99久在线观看| 五月天久久综合婷婷| 内射丰满人妻| 国产夫妻操逼内射视频| 婷婷综合在线| 丁香婷婷六月天| 综合九九久久| 久久久久九九九九视屏小说88| 婷婷精品| 99精品网| 色99视频| 91九九| 色婷婷亚洲| 五月天网站免费欧美| 99热777| 天天综合干| 99热情这里只有精品在线播放| 欧洲亚洲午夜| www,奇米影视| 色婷婷网大全在线| 色婷婷激情Av久久久| a在线观看| 网站免费一站二站| 99成人| 99综合网| 99啪啪视频| 免费黄色AV| 天堂综合久| 久久精品五月天| 九色视频91疯狂| 91久久精品无码一区二区三区| 激情四射婷婷| 久久曰曰| 激情五月深爱五月| 97干视频| 欧美情月伍月天| 噜噜狠狠| 天天舔天天摸天天射| www.婷婷网| VA色婷婷| 久久在线视频只有这里有精品| 99ri精品视频在线观看| 变态另类9| 久九色| 99热91| 日韩AV片| 五月刺激丁香月综合| 伊人狼人干| 欧美日韩精品一区二区三区钱| 色综合色综合色综合| 色色丁香色五月| 色婷婷狠狠禁久久| 九九色天堂| 性爱五月婷婷| 久久综合干| 五月婷丁香花| 五月激情久久综合| 婷婷婷婷色| 婷婷五月天激情网| www.99色| 少妇搡BBBB搡BBB搡毛茸茸| 婷婷六月色丁香视频在线观看| 狠狠色丁香| 一级韩国产精品毛| www.热99热| 成人精品视频99在线观看免费 | 伊人久久婷婷| 伊人婷婷五月天| 婷婷久久五月天| 天天射天天插天天干| 超碰99成人在线| 五月婷婷激情| 99热精品网| 丁香五月天天高清在线| 五月丁香婷婷综合久久| 激情五月天网站| 人人操AV| 中文字幕精品无码一区二区| 蜜乳人妻一区二区三区| 婷婷99中文字幕| 激情五月天之六月婷婷| 五月天开心网| 丁香六月激情综合| 99玖玖人人| 久久亚洲A| 思思综合热| 五月婷综合| 午夜大香蕉| 深夜婷婷 丁香| 四月婷婷五月丁香| 综合亚洲五月天| 丁香六月情| 天天日天天色| 丁香五月自拍| 久久精品国产一区二区三区四区| 五月丁香AV在线| 日本婷久久| 男人天堂亚洲综合| 思思热视频| 久9热| 人人操超碰| 色吊丝永久访问网址| 婷婷五月天 偷拍| 丁香五月婷婷综合精品素人| 情欲禁地| 九九激情综合| 婷婷五月天堂网| 丁香五月成人社区| 国产精品第一国产精品| 怕怕視頻| 亚卅毛片| 久婷自拍视频| 久色五月| 国产精品人成A片一区二区| 1024成人在线观看| 婷婷丁香五月综合激情小说| 亚洲欧洲中文日韩久久AV乱码| 六月婷婷综合激情| 日本色爽| 玖玖@三月天天丁香婷婷| 91欧美日韩综合| 婷婷五月激情视频在线| 中文AV网站| 婷婷丁香五月基地| 日韩成人电影在线播放| 色婷婷五月网| 久久五月六月| 丁香午月AV中文字幕| 丁香五月综合激情啪啪| www.五月婷| 婷婷激情五月色综合| 日本精品久久久久中文字幕| 五月婷婷啪啪| 五月丁香色| AV在线观看网站| 国产婷婷综合| 91精产一区三区免费观看| 丁香五月五婷| 五月激情视频| 五月色色色| 婷婷欧美综合| 久久精品9| 久久五月天色婷婷| 最新色色五月天| 丁香五月激情网| 成人免费在线电影| 精品99在线观看| 91精品综合久久婷婷九色| 色婷婷亚洲五月天| AV在线收看| 神马欧美精| 伊人碰碰婷婷| 久热欧美| 五月天丁香六月综合| 中文字幕 码精品视频网站| 九九热10| 久久色亭亭五月天| 婷婷欧美激情综合| 91视频综合网| 日本三级大片| 久激情网| 天天肏夜夜肏| 99综合99| 激情五月天情色| 夜色综合网| 久久久久久久久久91| 色综合综合色| 久久这里只有国产| 狠狠精品干练久久久无码中文字幕| www.91有码.com| 综合网啪| 色色日韩| 亚洲精品一区中文字幕乱码| 日日干日日s| 午夜AV网| 色香久久| 26uuu国产色| 强辱丰满人妻HD中文字幕| 情婷婷五月天| 丁香五月先锋| 噜噜噜狠狠色综合| 逼逼AV| 操草草草| 91丨九色丨43老版熟女| 开心四月婷婷在线色播播| 五月天婷婷狂暴白浆| 日日操日日撸| 九九黄色网| 久久久久9| 色婷婷六月| 五月天色色色| 538在线精品| 精品九九久久| 婷婷五月色综合| 久久这里在精品视频| 丁香五月丁香伊人| 色色色色色色网站| 91碰| 国产免费性爱| 99色干| 精品九九视频在线观看| 九月婷婷色色| 香蕉久久国产AV一区二区| 丁香五月天亚洲视频| www.激情| 五月丁香婷婷狠狠操| 九九色99| 狠狠五月天激情| 色色五月天激情| 色九九中文字幕| 97天堂| 99热这里只有免费| av 一区三区四区| 日韩AV在线电影| 六月婷婷五月天| 日本婷婷色日| 国产色色网址网站| 国産精品| 亚洲性爱AV| 丁香六月婷| 99热精品在线观看| 激情五月婷在线精品| 天天久久狠狠色综合| 国产亚洲精品久久久久久久久动漫| 91青娱乐青青草| 狠狠色无码| 久久永久网址| 玖玖色资源| 香蕉影院色| 天天弄天天操| 超碰人人超碰| 91人人爽久久涩噜噜噜| 激情五月婷婷网在线观看| 色婷婷AV在线| 激情亚洲五月| 亚洲中文字幕网| 久久婷网| 色五月激情网| 激情五月天色婷婷| 天天拍久久| 五月丁香爱婷婷深深| 九色91视频| 婷婷五月丁香激情图片| 亚洲无码性爱| 国产99久久久国产精品免费看 | www.金莲av| 大香蕉五月天婷婷| 久久9视频| 激情综合五月婷婷丁香| 玖玖资源站中文| www,五月丁,com| 亚洲婷婷月丁香五月| 日韩啪啪视频| 婷婷久久亚洲| 中文字幕人妻在线| 99@久久@99精品视频| 欧美成人AAA片一区国产精品| 91Chinese在线| 97碰久久| 色噜噜狠狠色综合成人99| 婷婷五月天影视首页| 99er精品视频| 色婷婷亚洲精品天天综| 四色AVwww| 另类五月激情| 丁香六月婷婷姐网| 99r这里| 五月婷婷自拍视频| 激情五月色综合| 久久这里有精品99| 五月天基地| 色婷婷五月天综合网| 五月天激情综合10p| 五月色情网| 狠狠狠狠狠草| 午夜婷婷五月天| 久久五月婷综合网| 9999色色色色| 五月丁香色婷婷综合| 婷婷五月天亚洲丁香| 久色国产| 强伦轩人妻一区二区电影| 日日夜夜天天综合| 丁香五月成人网| 五月欧美丁香在线观看| 丁香婷婷色色| 91色综合| 99色热| 香蕉久久国产AV一区二区 | 欧美婷婷成人| 免费黄色AV| yellow视频在线观看91| 99热97| 天天日天天插| 四虎99热在线观看网站| 激情色情五月天| 九九综合网色全集 | 激情婷婷九月| 99热综合网| 久婷婷五月激情| 青青草蜜臀| 激情六月日韩| 五月天婷婷綜合院| 狠狠色噜噜狠狠狠狠综合| 99热综合| 色综啪啪啪啪啪啪| 丁香五月情| 综合激情五月丁香9999久久精| 天天日日天天| 这里只有精品1| 96精品久久久久久久久| 五月婷婷影院| 99re久热| 色综合色综合网| www.狠狠操.con| 欧洲亚洲精品| 九月色婷婷| 丁香五月婷婷色综合| 亚州第一A片| 依人大香蕉| 色情一区二区播放| 中文AV在线播放| 五月天综合网| 影音先锋天天日| 精品视频这里只有精品| 天天搞天天色综合| 亚洲操逼片| 日韩限制级大尺度黑料泄密大尺度视频一区二区在线观看 | 99热欧美| 婷婷六月丁综合| 色五月超碰| 综合激情五月丁香| 五月天桃色深爱网| 99色视频| 天天综合网~91| 久久在这里有精品| 婷婷综合成人| 久草热8精品视频在线观看| AV中文字幕夜夜操b天天摸bb| 久久六月天| 综合久久五月| 人人摸人人搞| 七七色综合| 五月花综合网| 五月婷婷五月色| 欧美三9久九观看| 强伦轩人妻一区二区电影| 99爱视频在线免费观看| 9久国产精品| 色综合中文综合网| 婷婷欧美色| 九九热99熟女| 欧美熟女视频 色婷婷| 日本久久99| 天天做天天爱天天要| 99精品视频在线观看| 9999热在线观看| www.五月激情红色| 成人午夜无码视频| 欧美三级级99久久| 精品九九视频| 久久伊人大香蕉| 97婷婷狠狠久久综合9色| 色了色综合| 开心激情网五月天| 丁香五月婷婷av| 深爱1激情网| 99精品视频在线观看| 91精品在线看| 96丁香六月婷婷蜜桃综合久久| 欧美顶级少妇做爰HD| www色婷婷| 日本熟女二区| 亚洲人成网站999综合| RenRenSe在线视频网站| 久久天天| 九九亚洲视频| 91九色精品| 伊人综合婷婷| 婷婷综合色五月天| 婷婷丁香红五月91C| 婷婷激情丁香五月天综合| 另类专区在线| www.日本91| 色狠狠婷婷| 国产特黄色精品一区二区三区精品无广告| 欧美综合婷婷欧美综| 任你艹| 久久HD| 六月丁香中文字幕| 99人人干人人| 精品久久这里热66| 亚洲超级碰| 五月狠狠| 丁香五月综合久久| 51国精产品自偷自偷综合| 色婷婷精品视频在线播放| 激情5月天天天| 无遮挡国产高潮视频免费观看| 蜜乳.comcom| 激情综合网五月婷婷| 久久久中文| 久久色婷婷| 丁香五月婷婷啪啪| 色婷婷久久| 大香蕉久久伊人婷婷五月丁香| 欧美色色色色色色| 婷婷丁香五月天影院 | 婷婷丁香五月基地| 日日夜夜小色哥| 色爱爱综合网| 综合久久人妻| www.com任你艹| 久久精品性爱| 国产三级片91| 琪琪色五月天| 第四色婷婷日本| 99亚州综合精品成人网| 色之综合网| 亚洲情欲| 少妇激情五月婷婷| 久久九网| 五月婷av| 香蕉婷婷色五月| 婷婷香蕉| ji'qing'luan'ren'lun| 99热网精品| 色婷婷狠狠干芒果TV| 九九九九九九九九九九九九九九九九九九九在线视频 | 色色色视频免费无码 | AV九九| 人人干Av| 超级碰 久久9| 亚洲色图五月丁香| 天天色播| 屁股翘好撅高迎合跪趴| 五月天婷婷激情春色小说| 精品导航在线x不卡| 五月天久久综合婷婷丁香| 五月丁香少妇| 九九热精品| 天天操九九插| 丁香五月天天| 97人人操人人爽| 五月婷婷这里都是精品| 91热视频| 色婷婷www| 97五月天婷婷午夜| 欧美一黄一色一乱一伦| 99re免费精品视频| 日本va网站| 色色婷婷色色| 五月婷激情| 久久五月激情| www.五月婷婷.com| 九九99久久精品| 激情中文在线| 天堂爱爱| 停停综合色色| 这里有精品| 涩涩涩五月天| 99在线观看| 日碰日| www.婷婷| 亚洲色综久久五月| 中文字幕av在线| 亚洲精品无AMM毛片| 国产无人区大片| 99色啊| 丁香五月激情网| 亚洲国产精品VA在线看黑人| 人人操AV| 色综合性视频| 99日精品视频| 激情婷婷丁香| 国产激情AV| 五月天六月婷| 天天日日人| 九九热内射| 超碰在线99| 99亚洲无码| 激情欧美婷婷| www99xxxx五月丁| 婷婷久热| 99综合| 婷五月天在线草| 九九色之九九色88| 天天影院色| 五月激情六月| 欧美在线操| 九色亚洲| 欧美人与性动交CCOO| 泰州成人视频| 色五月激情五月丁香五月婷婷啪啪综合 | 99在线观看免费精品视频| 综合日本婷婷| 五月婷婷很很色| 亚洲综合色婷婷| 国内外色色色色色成人视频| 综合色综合| 色色色激情| 99久久精品国产色欲| 五月丁香啪| 男女99免费视频| 色色亚洲视频| 婷婷网五月| 色欲婷婷夜夜| 99在线视频精品| 四色五月视频| 第四色色六月色综合| 五月天激情网站| 超碰碰碰碰| 无码网| 99九色视频在线观看| 日本三级毛片| 激情五月婷婷色综合| 久久精品国产AV一区二区三区 | 九九精品热播| www,setingting| 国产高清av黄色看片| 久久久久人妻精品| 91婷婷色| 亚州操操| 婷婷色综合| 色色色综合色| 91婷婷五月天嫩女| 五月丁香激情六月| 国产精品久久久60086| 婷婷色五月激情| 美女天天久久| 亚洲婷婷五月天综合| 人妻22p| 色啪网| 久久九区| 超碰亚洲天堂| 天天日天天舔天天摸| 国産精品| 成人短视频在线| 99碰网站| 99精品久久久| 婷婷色导航| 欧美一级色| 99热免费网站| 欧美精品久久久久久视频观看| 这里只有精品视频视频在线观看| 婷婷伊人綜合中文字幕| 久久久WWW| 99热福利| 99热国产国产| jiujiu无码五区| www.minyis.com【JT】国内CDN落地页保证转化QQ2101460746 | 激情五月丁香六月综合AVXXXX| 影院久久久| 爱iii做iiii日日| 六月婷婷青青青视频| 狠狠干在线| 婷婷va| 丁香五月日韩| 色五月丁香六月资源站| 亚洲一个色| 久久久婷丁香五月| Va另类视频| 亚洲天堂aaa| 狠狠狠狠狠狠| 97色天堂| 色色com| A片试看120分钟做受图片| 五月激情丁香啪啪| 久热99久热| 五月丁香网站| 《诡秘之主》在线观看| 91dy.av| 丁香五月激情婷婷| 噜噜狠狠色综合久| 99色网站| 日本精品人妻无码77777| 91九色精品女同系列| 91中文在线| 激情丁香五月| 啪啪操网| 五月丁香六月激情综合| 亚洲午夜精品久久久久久人妖| 婷婷五月天深爱| 天天舔天天摸视频| 91肏| 国产真人做爰视频免费| 偷拍九九热| XX久久| 玖玖在线视频| 操啊操av| 99热久草| 美日韩成人| 色婷婷五月综合色婷婷| 激情婷婷在线中文字幕| 丁香色六月| 大陆肏屄视频| 狼人久草| 六月婷婷毛片| 永久免费视频| 99色视频在线观看| 99热综合网| 五月婷婷基地| 久久久久久9热不雅视频| 4399在线日本A片| 天插天啪天啪天啪| 丁香五月偷拍| 五月天激情网站| 五月五月婷婷| 丁香五月天欧洲在线| 五月婷婷色激情| 五月天伊人| 九热av| 六月婷婷五月丁香首页| 久久99热这里只有精品| 五月激情小说| 四色五月婷婷| 亚洲成人无码免费| www.激情.com.| 久久九九免费视频| 99色综合| 日韩黄色电影| 亚洲婷婷婷| 亚洲色五月| 国产超碰av| 综合激情五月综合激情五月激情1| a久久| 97亚洲视频在线| 日韩成人电影AV| 欧美婷婷成人| 欧美激情性做爰免费视频| 五月丁香综合激情网| 在热视频精品| 丁香五月天色婷婷| 在线观看免费狠狠色丁香香综合| 怡红院精品视频久久久久久久久| 丝袜人妻| 卡视频1区2区| 色色99色色| 天天操天天插| 婷婷五月天成人视频| 天天日天天插天天操| av人人干| 欧美一级a| 色五月婷婷久久爱| 色你久久| 久久久精品99| 色5月婷婷| 色色操| 五月丁香色情| 夜夜大香蕉婷婷丁香| 日韩野外 无套| 五月激情综合激情五月| av色色国产| 五月激情综合网| 久久人人看| 999精品乱码77777| 丁香婷婷六月| 六月五月婷婷| 日本人妻伦在线中文字幕| 97av在线视频| 在线天堂9| 久久婷婷丁香视频网| 婷婷五月丁香综合人妻| 久久五月婷6 9| 五月人人丁香婷婷五月人人丁香| 综合久久婷婷| 大香蕉五月天婷婷丁香91| 26uuu在线观看| 图片区 小说区 区 亚洲五月| 色很很96| 婷婷五月天开心网| 亚洲殴洲精品Av在线| 久久欧洲综合网| 天天日天天肏天天奸| caopeng97日韩| 99久热| wwW天天干| 成人无码精品1区2区3区免费看| 在线成人网址| 久热人妻| 激情五月天婷婷图| 久操人妻| 亚洲网视屏| 天天操比比| 综合五月草| 激情影院丁香五月| 婷婷欧美偷拍综合| 99精品视频在线观看| 欧美激情五月综合| 思思热在线视频精品| 日日操,日日爽| 少妇高潮呻吟A片免费看软件| 婷婷婷色五月| 思思re最新视频| 婷婷五月AV| 丁香婷婷五月天激情四射| 婷婷精品免费久久| 色婷婷亚洲综合网站| 亚洲尤物在线| 色婷婷网| 久久黄色免费视频| 庭庭久久内射| 亚洲欧洲国产精品| 91日视频| 人妻爽爽爽久久久久久久久| 熟妇无码乱子成人精品| 色色色丁香| 久久丁香五月天| 伊人色综合影院视频| 五月丁香六月婷婷久久| 99re热视频这里只精品| 欧美激情综合色综合啪啪五月| 激情文学第四色婷婷丁香五月| 婷婷在线精品| ss五月天激情| 熟妇内谢69XXXXXA片| 99思思热只有在这里看| 99热第一页| 日本欧美国产| 天天爽天天爽天天爽天天爽天天爽| 99国产精品久久久久久久久久久| 嫩草AV久久伊人妇女超级a| 久久久久视剧HD| 99A级片| 欧美婷婷六月丁香综合色连续高潮抽搐| 久久这里都是精品| 99热香港| 色五月天 丁香| 激情人妻综合| 欧美99热| 色色综合热| 97性视频| 天天舔天天摸天天射| 九色视频入口91| 丁香大香蕉| 五月激激网w'w'w| 97碰碰叉| 日良久久| 操逼福利视频| 婷婷五月精品中文| 日韩黄黄| 97婷婷丁香五月| 超碰不卡在线| 午夜丁香婷婷| 日本五月天一页| 伊人大综合| www.色9| caobi四区| 停停五月色宗合| www.婷婷|