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
返回資訊列表
91精品激情9| 久久天堂女人| 99久久6| 亚洲国产色婷婷| 色婷婷久久综合| www.色窝| 中文人妻主播久久| 九九久久99精品免费观看www| 在线观看国产高清视频免费网站 | 天天久久婷婷| www.夜夜| 国产激情视频在线观看| 日日操夜夜撸| 思思热99在线视频| 六月五月久久丁香| 永久的网站AAAA| 99爱精品| 久久久99免费视频| 99热97| www.sd-xiangsu.cpm| 色 五月 天 婷婷 丁香 九月| 久久婷婷亚洲| 97色色色色色| 国产9色在线/日韩| 丁香 久久| 久久久久人妻中文| 婷婷激情区| 五月玖玖| 五月婷六月| 婷婷综合丁香| 高清资源站日A美A欧亚…| 色999五月色| 九九热免费| 99色看这里只有精品| 久久婷婷五月天激情四射| 真实的国产乱XXXX在线91| 色播婷婷五月天| 99成人精品视频| 色99视| 中文字幕在线免费观看视频| 人人操插| 99日本精品视频热| 激情综合无码| 日本一级黄色电影| 丁香久久五月婷综合| 91干婷婷| 99久久超级| 久久草大香蕉| 国产美女无遮挡裸体毛片A片| 99在线视频播放| 色婷狠狠| 97影院一级片| 六月丁香五月天| 欧美 日韩 成人在线| 狠狠色综合网| 欧美日本va| 69午夜成人影片| 婷婷丁香色五月天久久88| 新97人人上人人| 日本三级中文字幕| 国产精品久久99| 国产精品成人在线| 激情综合综合综合| 9这里只有精品| 日本婷婷丁香五月| 婷婷丁香视频| 天天色官网| 日韩成人网站精品久久大全| 五月色欧美| xfplayav在线| 亚洲婷婷免费| 欧美色色色| 一区二区免费看| 99热综合在线| 99热国产| 国外亚洲成AV人片在线观看| 97色干| 丁香花五月天激情| 久久草人妻| 色婷婷五月综合在线| 婷婷丁香花五月天| 色色综合日韩| 婷婷激情五月综合| 任你草| 丁香九月婷婷综合| 大色鬼综合| 岛国AAAV| www.五月婷婷久久.com| 狠狠色丁香婷婷基地| 99re思思热在线视频| 婷婷伊人无码| 婷婷瑟瑟五月天| 色综合伊人网| 久久婷婷影院| 日本 色综合| www.久久久久久| 色爱综合网| 婷婷五月天免费小说| 在线观看欧美| site:ornaments52.com| 亚洲成人av在线| 五月婷婷之综合激情| 色五月婷婷五月天| 五月天婷婷狠狠| 91丨九色丨东北熟女| 久久久999精品| 五月激情五月丁香| 久久偷拍综合五月天| 欧美五月婷婷| 色综合久久久综合久久网| 婷婷综合干| 婷婷色九月| 激情六月丁香综合| 日韩欧美骚货| 无码色色色| 狠狠干五月| 成人精品人妻| 夜夜撸日日骑| 国产亚洲99久久精品| 玖玖@三月天天丁香婷婷| 综合视频久久| 六月婷婷网站| 99久久6| 久久婷婷五月综合色丁香花| 狠狠色丁香综合| 99色色色色| 婷婷五月天AV| 五月丁香花视频| 青青五月天婷婷| 婷婷五月天久久| 无码少妇高潮喷水A片免费| 婷婷性爱综合| 严洲天天插| 色99在线视频| 久久九⑨| 五月婷婷丁香综合| 超碰成人公开| 亚洲丁香五月天在线视频| 草五月| 91精品久久久久久综合五月天| 成片免费观看大全| 婷婷综合| 91天天操天天干天天射| 九九大香蕉黄色影院| 99色热视频| 中文字幕永久免费| 亚州综合色| 伊人五月久久| 免费无码毛片一区二区A片| 日本99在线| 日韩久久这里只有精品| 风流少妇A片一区二区蜜桃| 九色91视频| 五月天婷婷成人| 成人国产欧美大片一区| 女人露出p毛视频www网站| xx综合网| 疯狂做受XXXX高潮A片| 婷婷九月狠狠色| 天天干天天干天天干天天干天天| 日本精品人妻无码77777| 色综合偷拍| www.亭亭五月天| 国产成人精品亚洲线观看| 五月久久婷婷| 99爱爱| 97五月婷婷| av婷婷丁香| 欧美视频在线观看噜噜| 99精品免费| 吊色AV男人的天堂| 亚洲午夜一区二区| 婷婷五月天激情电影| 九九性视频| 人妻人人操| 99久在线视频| 99热精品免费| 精品综合久久久久久五月天| 婷婷五月天社区| 天天玩夜夜操天天爽| 婷婷综合色图| 丁香五月在线人妻| 九九色色| 婷婷激情五月综合基地| 狠狠干.com| 中文无码精品一区二区三区| 日韩熟女啪啪视频| 草逼大片| 五月天天堂久久| 俺五月| 日本丁香五月| 日韩av干| 丁香五月ⅤA久久久| 天天综合网亚洲综合网| 激情图片婷婷丁香五月| 色婷婷五月天在线观看| 在线成人网址| 婷婷AV丁香| 五月天色综合| 婷婷五月天激情综合深爱| 色五月情| 六月婷婷在线| 日韩操人| 四川女人毛多水多A片| 婷婷五月天性| 91青娱乐青青草| 色五月婷婷影院| 色狠狠综合入口| 激情VA视频| 人与禽A片啪啪| 99思思在线视频| 天天天天操| 婷婷第六色| 婷婷97狠狠成人网站| Jh7Uf088VHafNm| 99久久婷婷综合| 五月色亚洲| 在线日韩av| 天天插天天插天天插| wwww.色婷婷| 精品99在线| 五六月婷婷| 国产午夜成人免费看片无遮挡| 狠狠五月天激情| 五月天另类图片区99| 99自拍视频在线| 亚洲五月天综合| 天花AV无码| www婷婷| 久久有码| 91性高潮久久久久久久久| 熟妇无码乱子成人精品| 天天色99| 五月丁香六月婷婷亚洲| 婷婷性爱网| 五月天激情国产综合婷婷婷| 婷婷五月色| 五月天激情小说婷婷| 91色呦哟| AV操操操| 五月天偷拍| 欧美激情 日韩无码 婷婷 五月天| 久久精品凹凸分类| 亚洲久热| 久久这里有精品| 成久综合视频| 婷婷五月天丁香激情| 99热免费| 九九热自拍| 婷婷日日天天| 欧美日韩大黄| 久99视频| 啪啪操超碰| 五月色情| 六月婷婷五月丁香| 婷婷综合在线| 天堂色婷婷| 性99网站| 丁香五月天欧美在线| 久久婷综合| 日韩 mm 不卡| www九九免费视频| 中文激情网| 开心深爱激情网| 成人婷婷深爱综合网| 人妻激情在线| 欧美一线视频| ou洲色吧| 九热网站| 九月色婷婷综合| 成人欧美日韩| 亚洲啪| 丁香五月在线播放| 婷婷五月天成人网| 欧美99热| 色热久| 九九色综合九九色| 丁香六月无码播放| 日韩十国产极品久久| 狠狠艹狠狠艹| 99热免费网站| 激情综合5月| 丁香五月天堂| 男女99免费视频| 热婷婷在线视频| 超pen个人视频97| 99热这里只有精品66| pacopacomama 070722_670 素人奥様初撮りドキュメント 103 大久保純子 | 91久热| 五月天婷婷久草丁香| 久久艹 五月天| 五月天婷婷基地| 五月丁香色情| 这里只有精彩视频| 色五月 五月婷婷| 激情综合婷婷| 夜夜操天天干| 超碰在线国产| 婷婷五月花| 99热亚洲| 亚洲乱码精品久久久久.. | 开心激情站| 久久五月天综合| 色色五月天婷婷| 中文字幕,综合,91| 九九热最新视频| 久久婷婷五月| 色五月天丁香婷婷| 欧美内射AA| 激情综合五月| 婷婷五月在线视频| 欧美五月停| 亚洲网站观看视频| 9色免费网| 9 9热这里有精品| www91色网站| 九九综合网| 超碰A V在线| 伊人久久大香线蕉AV最新午夜| 伊人超碰在线| 任你爽精品免费视频6| 黄色片区子| 婷婷丁五月| 激情五月图| 情五月亚洲婷婷| 欧美综合激情五月| 96丁香六月婷婷蜜桃综合久久| 色色a| 网色99| 天天做天天爱高潮片| 黄色五月婷婷| 婷婷色天香| anquye五月| 丁香六月婷婷综合欧美| 色停停香蕉视频| 9l视频自拍九色9l视频在线观看| 热久久91| 婷婷婷婷婷婷婷婷婷婷丁香| 91视频五月丁香| 五月婷婷AV| 丁香婷婷五月天网站| Va另类视频| 婷婷五月中文在线视频| 天天狠狠夜夜狠狠2023| 色婷婷很很十八禁| 99大香蕉| 亚洲狠狠操| 亭亭玉月丁香| 久久久国产精品黄毛片| 99热插| 深爱五月激情网| 久久婷婷婷婷伊人| 成人精品在线| 精品自拍99| 8区视频在线| 五月天无码视屏播放| 99久久综合| 婷婷久久综合| 久久九九Com| 另类图片激情五月| wwW天天干| 天天夜天天色天天| 超碰成人免费| 九九成年视频| 小视频aaa久久久| 99热网站| 三年高清大片免费观看国语| 人妻AV在线观看| 国色天香伊人狠狠色| 久草五月婷婷| 丁香五月婷婷www..com| 日韩99色| 操99| 色婷婷在线影院| 777.色色| www激情| 四色五月婷婷| 色婷婷丁香五月观看| 五月婷婷综合在线| 91九色白丝| 九九日本视频| 91爱操| 激情玖玖综合网| 天天色粽合合合合合合合| 91人人人人人人人| 天天狠狠婷婷在线| 五月丁香六月婷| 国产精品久久久久久久久久| 亭亭色色五月天| 日本五月婷| 男男野外做爰全过程69| 天天爽在线视频| 五月综合婷婷五月| 色色网站日本91| 天天插天天插天天日| 少妇性按摩无码中文A片| 国产69久久久欧美黑人A片 | 91制片厂久久久国产电影| 色综合久久888| 成年人丁香五月| 日本黄色三级片内射| 黄久久久| www开心激情网| 亚洲V国产V欧美V久久久久久| 五月丁香啪啪啪啪| 综合久久影院| 五月丁香福利| 久久久久久激情| 午夜色丁香| 开心五月深爱五月丁香五月激情五月| 欧美三级巜人妻互换| 91操人| 色玖玖综合网| 婷婷五月色| 一起草Av| 伊人久久婷婷| 久久婷婷五月天| 久久婷婷色| 操逼六区| 色色色婷婷五月天| 激情五月天丁香| 天天射综合网站| 亚洲综合五月天婷婷丁香| 综合久久久婷| 久久综合影院| 色色五月天丁香| 五月丁香成人| 婷婷色色狠狠| 中国丰满熟女A片免费观| 激情婷婷色小说| 人妻AV在线| 99视频精品视频| www.色婷婷.com| WWW色五月天| 无人区码一码二码三码医生系列| 久久久久99精品成人片| ww超碰在线| 五月丁香六月激情视频| 亚洲成人在线免费| 亚洲色色色| 狠狠夜夜五月丁香| 久久久精品婷婷五月天| 99热激情| 欧美色色色色色色色| 99热新网址| 热99在线| 99热九九在线| 婷婷娌伦网| www.久久久.com| 久久色情| 色爽干| 激情综合网,婷婷| 91一起操| 玖玖九九99| 99热在线网站| 久99| 激情综合婷婷| 成人网站av免费网站推荐| 婷婷激情人妻| 一本久久亚洲五月婷婷| 九九精品re免费视频| 日本天天操| 婷婷五月天成人五月天| 欧美三级韩国三级日本三斤| 色情久久久| 激情小说五月丁香在线视频观看视频| 97人人妻人人艹| 色色热| 婷婷激情五月天网站| 黄色中文字目| 五月综合激情| 俺也去综合| 亚洲黄3级片网站欧美| 五月天色色网站| 第二色AⅤ| 色五月开心久久网| www超碰| 嫩草综合网| 99久久精品国产色欲| 丁香五月婷婷五月| 天天摸天天透天天舔| 天天开心天天色| 亞洲自怕| 狠狠插狠狠插| 久久综合五月天| 婷婷六月爽| 丁香五月天天| 超碰亚洲欧美| 九九人人操| 久热中文字幕在线线观看| 狠狠爱婷婷| 日本不卡一区二区三区| 色综合综合色| 熟女激情五月天| 欧洲婷婷五月天| 激情五月婷婷啪啪| 婷婷五月色播天| 亚洲第一黄网| 亚洲美女网Va| 激情综合另类| 武则天精品久久| 超碰免费电影| 一本大道熟女人妻中文字幕在线 | 天天干天天干天天| 日韩成人AV在线播放| 天天综合天天玩夜夜玩天天玩夜夜玩| 91碰视频| 色婷婷色综合激情91| 人人摸人人干| 99色天堂| 色婷婷超碰| 俺去啦综合网| 丁香婷五月| 丁香九月婷婷| 中文字幕精品在线观看| 曰本aaaaaa丈片| 曰韩少妇内射免费播放| 丁香婷婷基地| 婷婷中文字幕| 色色五月天网站| 久久九精品| 婷婷狠狠狠爱| 色天天狠狠干| 成人日韩欧美| 六月婷婷七月丁香| 超碰色碰碰| AV在线资源| 大香久久综合网| 婷婷综合五月| 在线免费观看激情视频| 九九9久九9国产视频| 婷婷五月天久久| 原琪琪色影院| 五月天综合激情网| 久大香蕉| AA久久| 99热97| 五月丁香中文字幕| 韩国天天婷婷| 99亚洲精品视频| 婷婷综合色播网| 天天射天天射一道本日本社区| 五月婷婷亚洲天堂激情在线| 天天做天天爱天天摸| www.久久久.com| 97在线刺激| 日本97在线视频| 99爱爱网| 五月婷婷色影院| 欧日韩成人| 色色免费网站| 色婷婷五月天激情| 99热精品在线播放观看| 天天拍夜夜爽日日| 91人妻视频| 婷婷五月天,影院| 色欲香综合网| 色婷婷六月天在线| 五月婷婷开心五月| 超碰在线免费9| 久热一本| 五月婷婷六月丁香| 激情 久久 婷婷| yjzz亚洲国产| 激情五月份婷婷| 91免费看片| 7777激情基地| 日韩无码一区二区三区四区| 天天爱天天做天天爽| 婷婷成人小说综合| 月婷婷婷婷五月| 99re免费视频| 久婷五月| 五月综亚洲| 青青草原精品久久| 丁香九月综合激情| 九热视频在线精品15| 婷婷金品综合视频| 成人无码精品1区2区3区免费看| 99超超碰| 久色五月天| 丁香婷婷久久 | 五月丁香狠狠爱婷婷综合| 六月婷婷日| 午夜成人网站在线观看| 免费精品66| 婷婷丁香人妻天天| 99自拍视频| 成人在线二区| 综合99久久天天综合| 亚洲色五月| 日韩六十路91性交电影| 激情网五月| 激情五月婷婷五月| 丁香啪啪中文字幕| 久久总和99| 99热欧| 色五月天成人| 五月天激情四射| 日日夜夜九九| 五月丁香啪啪网| 26UUU精品一区二区Com| 97色片| 96丁香婷婷九月蜜桃综合久久| 婷婷五月色色| 五月天婷婷爱丁香中文字幕| 99操免费视频| 高清资源站日A美A欧亚…| av最新在线| 九九综合精品| 99色精品| AV亚洲在线| 婷婷色色网| 色丁香影院| 夜夜爽天天爽| 亚洲成人另类| 婷婷开心久久| 国产乱妇无乱码大黄AA片| 婷婷丁香综合| 99综合婷婷五月| www.日本91| 九九一区| 色五月xxx| 激情综合激情综合| 国产成人AV不卡| 日韩另类| 色欲午夜无码久久久久久张津瑜 | 亚洲精色| 99国产精品白浆在线观看免费| 婷婷99丁香| 婷婷五月丁香基| 97资源碰碰| 日本97人人| 婷婷五月深深的爱| 五月天精品视频| 99视频在线啪| 婷婷伊人久久综合| 99激情| 欧美日综合| 欧美性猛交99久久久99| 久久六月综合| 色婷婷五月天在线| 一本道在线电影| 操碰97| 久久总和99| 2021日韩无码| 六月久久狠狠| 九九色色| 色婷婷五月基地在线| 五月婷婷丁香| 91玖玖| 男人的天堂五月丁香| 色欲色香综合网站| 丁香六月无码| 伊人狼人干| 操日本人妻视频| 成人精品视频99在线观看免费| 人妻AV在线| 成人av在线电影| 色婷婷AV在线| 丁香五月天.com| 亚洲色色五月天| 婷婷五月天天天| 天综合日日夜综合7799| 激情五月丁香激情综合网| 亚洲愉拍99热成人精品| 成人网站免费sxj| 曰韩少妇内射免费播放| 日批在线看| 成人综合网站| 婷婷激情欧美| 婷婷中文综合网| 天天干天天射色综合| 任你爽在线视频| 涩婷婷五月天| 亚洲热久| 久久久.COM| 色婷婷丁香| 激情五月天影院| www.天天干.com| 激情视频网址| 日本黄色三级片内射| 桃色激情婷婷伊人网| 99热色精品| 精品在线| AⅤ网站在线看| 伊人五月成人| 9热在线观看| 亚洲AV中文在线| 亚洲黄色影视| 开心五月婷婷| 天天干天天爽天天操| 综合激情九月婷婷,激情综合婷婷中文字| 97色色色色色| 伊人狠狠丁香婷婷综合尤物| 思思热视频在线| 激情亚洲五月| 手机在线视频观看9| 九九这里是免费的视频5| 久久婷婷亚洲| 91 欧美| 久久在线人妻| 欧美三级大片AA在线看| 久久99热在线观看| 久超超碰| 狠狠操狠狠| 亚洲瑟瑟精品在线| 99热在线爱| 久热9| 97深爱伊人综合| 伊人激情网| 99九色视频在线观看| XXXX岛国| 丁香花操逼| 99色热| 天天射天天射一道本日本社区 | 五月丁香激情婷婷综合字幕| 五月丁香狠狠爱婷婷综合| 亚洲天堂大香蕉| AV在线免费网站| 五月天综合| 91久久婷婷人人澡草 | 97精品人人A片免费看| 久久这里只精品| 思思视频这里是精品| 久久久.www| 色五月在线观看| 97色婷婷五月天| 99色干| 久久91久久精品久久| 欧美久久婷婷| 婷婷色5月激情网| 欧美在线97| 爆乳熟妇一区二区三区四区| 操久久网| 久久婷婷五月综合色丁香| 综合久久9| 丁香六月天婷婷| 97精品综合| 99综合网| 九九热视频思思| 五月天堂色| 热久91| 国产精品第一国产精品| 丁香婷婷五月六月久久| 五月婷婷伊人在线| wwW天天干| 大香蕉九九热| 丁香婷婷婷| 99热| 激情综合网五月激情| 天天摸天天舔| 亚洲性爱日韩无码| 激情综合网之激情五月| 91干在线| 不卡成人免费| 精品香蕉99久久久久网站| 九九色影院| 久久九九色| 久久99这里只有精品视频| 天天搞夜夜爽夜夜爽| 91精产一区三区免费观看| 97综合视频在线| 激情婷婷丁香| 精品色色| 午夜丁香| 91一起艹| 久久总和99| 99久久极情精品一区| 99热这里精| 久久视频婷婷视频| 综合色五月| 任你操精品免费| 丁香久久激情俄| 色99综合色88| 久久97久久99久久综合欧美| www色色com| 色99网| 97香蕉碰碰人妻国产欧美| 色色国产| 第四色大香蕉| 99久超碰| 99精品在线观看视频| 激情五月天网| 亚洲另类日本| 色婷亚洲| 思思热精品在线| 天天色亚洲| 高清无码入口| 亚洲激情另类| 五月丁香六月激情在线| 另类视频五月天| 欧美五月丁香| 色色色热热热| 婷婷五月天影院| 久久久久网站| 天天综合网91| 伊人五月天在线| 久机视频这只有精品| 美女五月天| 六月丁香激情网| 综合久| 97精品人人A片免费看| 99热这里都是精品| 久久激情中文| 五月天婷婷无码| 五月天婷婷激情四射综合| 午夜激情久久| 99久在线精品99re5热视频| 色婷婷婷婷五月天| 色五月婷婷网| 亚洲超碰在线| 天天天天干| wwwav大香蕉| 超级97碰碰| 91九色欧美| 国产成人网站在线观看| 天天做综合| www.五月天。com| 99热中国| 人人九色| 五月婷婷六月色| 九九九九操逼| 久久五月天免费网站| 欧美综合123区| 激情综合播播| 伊人久久五月天| 常久最新免费的色吊丝| 激情綜合網址| 九九热AV| 3DAV亚洲香蕉久久 一区二区| 高清国产AV| 综合激情五月天| 韩国婷婷丁香五月| 五月婷婷丁香六月| 色婷婷电影网| 婷婷激情五月天桃花网| 97人凄人人操人人爽| 亚洲激情校园| 五月花婷婷最新| 五月久久婷婷天堂视频| 丁香五月色| 激情五月天情色| 亚洲天堂99| 日日操,夜夜爽| 亚洲综合另类| 国产亚洲成AV人片在线观黄桃| Caoporn公开| 久久丁香| 五月天精品视频| 激情五月影院| 成人龟情网丁香五月| 五月天丁香网站| 亚洲婷婷激情888精品久| 亚洲天堂大香蕉| 亚洲亚洲人成综合网络| 久操干| 《》【无码】想被搞到爽AV应募而来的超M素人 西纯子 10musume-011723-01 | 99在线观看视频精品| 五月开心深深爱激情综合| 亚洲精品影视| www天堂99| 婷婷婷久久久| 亚州AV超碰人人操| 一本色道久久综合狠狠躁小说| 亚洲永远av在线播放| 丁香 婷婷 激情 综合 五月| www夜夜操com| 五月天激情综合网| 亚洲综合另类| 色五月婷婷成人视频| 丁香激情五月天| 91狠狠色丁香婷婷综合久久狠丁香综合久久精品 | 日本啪啪网| 丁香六月天婷婷色| 日韩免费乱轮网站| 99视频这里有精品| av操逼网| 婷婷午夜| 激情五月天婷婷| 五月天色婷婷基地| 九九99免费理论| 最近中文字幕在线中文视频| 婷婷五月丁香香蕉| 亚洲人妻五月丁香婷婷| 久久色情| 成人在线视频网| 五月天婷婷综合免费| 日韩国产在线精品| 无码地址| 丁香色色网| 97干婷婷| 日日.c| 婷婷在线网| 丁香六月婷婷综合色| 亚洲综合五月天| 丁香六月婷婷操逼网| 乱女乱妇熟女熟妇综合网站| 久久超级碰碰| 亚洲第一影院高清无码网站| 色婷婷色五月综合| 欧美成人一区二区三区在线视频| 天天插天天插天天操| 婷婷综合视频| 国精产品一区二区三区| 婷婷五月六月激情| 亚洲六月色| sisi热国产| 天天干天天拍| 五月丁香六月婷婷综合在线| 色丁香五月婷婷| 天天色五月婷婷91久久久久久久| 日本成人噜噜噜噜噜| 五月丁香| 美女婷婷六月色| 亚洲五月天激情| 九九热亚洲中文在线观看免费| 欧美久久婷婷| 超碰成人电影| AV操逼网| caop在线视频| 色区久久| 欧美情月伍月天| 99热网站| 可以免费观看的av网址| 六月婷婷开心| 噜噜狠狠| 免费观看的av| 五月激情网五月综合网| 九九这里是免费的视频5| 9久久久| 在线观看亚洲AV| 欧美日比视频| 9l视频自拍九色9l视频自拍九色9l社区| 色综合视频| 丁香婷婷五月六月久久| 99日本黄站| 亚洲色99| 六月丁香深深爱| 搡BBBB搡BBB搡18 | 久久99美女精彩视频| Av中文在线| 深爱综合网| 九九综合色综合| 久久xxxx| 99热精品10| 亚洲色无码A片一区二区麻豆| 色五月视频无码播放| 91久女| 狠狠五月天| 99ri国产在线| 亚洲婷婷五月天| 亚洲啪啪视频| www,com,五月色色| 超碰免费在线| 强辱丰满人妻HD中文字幕| 色99热| 丁香婷婷色情| 亚洲九九视频| 99aese| 91日精品| 在线播放中文字幕| 开心五月丁香综合久久| 北条麻妃伊人 | 九九视频精品在线免费| 操操操97| 六月丁香五月天| 九色视频91疯狂| 精品国产乱码久久久久久免费| 丁香五月综合网亚洲综合欧美狠狠| 操婷婷基地| 婷婷在线视频| 色婷婷五月天小说网| 99热精品超碰| 日本九九视频| 五月丁香激情综合六月涩涩爱| 潮汕成人AV片在线| 另类专区在线观看| 69er小视频| 玖玖五月丁香| 免费观看的av| 五月婷婷婷| 久鲁鲁色网| 久久久九九九 99| 久久99热这里只有精品| 九九热视频免费观看| 五月丁香毛片| 日本欧美成人片AAAA| 婷婷六月啪啪| 欧美精品999| 狠狠干五月| 久久99久久99精品免视看婷| 婷婷日日天天| 先锋五月婷婷丁香草草| 另类图片五月天| 婷婷五月激情视频| 久久五月天色婷婷| 熟女色色一区二区| 色综合丁香| 天天摸天天日天天舔| 亚洲中文字幕av| 婷婷伊人综合| 婷婷六月天| 99视频在线观看网址| sS丁香五月婷婷| 婷婷五月无码| 99无码| 操日视频| 99热99热不卡| www.夜夜操.con| 天天综合 99久久婷婷| 亚洲国产精品VA在线看黑人| 狠狠色97| 婷婷丁香色情五月天| 色久婷婷五月| 91丨九色丨国产在线| 免费无码毛片一区二区A片| 色玖玖综合网| 99免费在线| 婷婷五月天激情亚洲小说| 中文字幕在线日亚州9| 亚洲人人艹| 精品一二三区久久AAA片| 亚洲成人免费电影| 欧美婷婷成人| 欧美激情 日韩无码 婷婷 五月天| 熟女激情网| 黄色五月婷| 色逼综合网| 极品少妇高潮啪啪AV无码| 激情五月丁香亭亭| 狠狠操狠狠做| 五月天婷婷色播| 天天干,天天舔| AA久久| 日韩五月婷婷久久| 成人美女网| av中文在线| 国产 码在线成人网站| 91日日日| 99久久这里只有精品| www.色擼擼.com| 婷婷成人综合五月| 蜜桃婷婷丁香五月天狠狠久久综合| 久婷五月| 人人性久久| 丁香六月婷| 99日在线观看视频| 婷婷丁香黄色| 九九久久玖玖爱| 97碰精品| 97碰碰草| 久久人人添人人爽添人人片αV | 五月天激情国产综合婷婷婷| 中文av网| 亚洲色婷婷| 九九色99| 亚洲区视频| 婷婷激情综合| 大香蕉520| 狠狠色综合网| WWW,五月| 五月天伊人网| 婷婷五月天综合网| 久久总和99| 色色色色色色网站| 五月丁香香蕉| 五月天社区| 色婷婷成人做爰A片免费看网站 | 夜夜操夜夜姧| 九九免费在线视频| 五月婷婷花| 99热这里只有精品在线播放| 久久有码| 亚洲综合成人网站| 丁J香六月首页| 国产黄色av| 久久在线92| 日本三级中国三级99| www久久99| 麻豆科斗777| 丁香无月在线观看| www.伊人天堂偷偷婷婷| 九九热99精品在线| 色欲AV导航| 五月婷婷丁香六月| 欧美va视频| 五月婷婷久久综合| 老妇六区| 91人无码久久久久久| 婷婷啪啪| 日本WwW色偷偷丁香花久久久京东热| 色五月天 丁香| 色色丁香色五月| 五月99久久| 婷香五月网在线| 亚洲欧洲自拍图片专区五月天| 伊人久久五月天| 久久激情网| 99无码视频| 色综合激情图区| 99 福利 导航| 欧美久热| 26uuu欧美亚洲日韩| 久热网在线视频| 欧美在线97| 性爱综合网| 91热在线观看视频| 97香蕉久久超级碰碰高清版| 无码九九| 婷婷五月天另类网站| 97se视频在线| 久久五月视频| 欧美经典片免费观看大全| 免费成片在线观看| 婷婷性爱| aaa日韩| 久操97| 天天射影院| 综合网网欲色| 9九热视频| 亚洲成人五月| 九色91视频| 亚洲乱码日产精品BD| 欧美日韩日韩成人| 久热久色| 五月天激情小说欧美激情| 99在线播放视频| 色婷婷丁香五月| 丁香婷婷老司机久操| 久久五月天婷婷| 夜夜做夜夜愛| 超碰狠狠操| 久久日婷婷| 婷婷色婷婷亚洲成人| 婷婷开心六月| 五月丁香综合激情网| 熟女少妇内射日韩亚洲| 婷婷趴趴| 日日干干天天干| 99热碰碰热| 久9综合| 操日视频| 九九热10| 婷婷天堂综合| 五月丁香婷久久| 婷婷丁香六月五月天| 播四月婷婷六月丁香| 丁香五月自拍| 激情婷婷。| 99九九久久| 99热这里只有精品55| 无码少妇高潮喷水A片免费 | 色色色色色色色色网站| 99久久综合网| www,婷婷,com| 梁铮版蜘蛛女在线观看| 五月婷婷六月激情| 99久操视频| 丁香五月天激情网址| 成人短视频在线免费观看| 中文字幕婷婷9月天| ww超碰在线| α久久| 五月婷婷五月天| 神马欧美精| 九九性视频| 桃色成人网| 99久久丝| 97在线视频人妻九色| 激情国产五月| 久久久久综合激动五月天| 成人短视频在线| 久久婷婷亚洲无码一起| 丁香女人五月天| 国产免费一区二区在线A片视频| 一区二区传媒视频| 六月五月婷婷| 国产精品涩涩涩视频网站| 丁香婷婷激情综合五月激情| 五月综合婷婷开心网| 色爽九九| 婷婷久久性爱| 亚洲另类日本| 极品嫩草| 精品三区影院| 亚洲乱码日产精品BD| 激情网站五月| 久久这里只有精品热在99| av五月天婷婷丁香| 亚洲另类久久| 婷婷情色开心五月天99| 色五月婷婷狠狠撸| 99热只有这里有精品| 思思99热热热99| 激情久久久久久久久| 99亚洲精品| 这里只有精品,日韩视频| 久热这里只有精品视频免费观看| 中文AV网| 丁香六月啪啪| 99精品在这里| 综合玖玖性爱免费视频| 超碰在线国产| 99在线69| 亚洲九九视频| 噜噜操操| 91人人操人人爱| 丁香五月色网| 强伦轩人妻一区二区电影| 婷婷不干网| 人妻系列久久久久久久久久久| 国产精品久久久久久妇女6080| 99热99思午夜精品| 国外亚洲成AV人片在线观看| peg 2区三区四区的| 国外亚洲成AV人片在线观看| 婷婷丁香射射| 亚州色婷婷| 精品久色| 超碰狠狠操| 五月婷婷六月爱| 亚洲AV影片在线观看| 五月婷婷影| 秋霞丝袜啪啪啪| 99热亚洲精品| 久操热线| 久色网| 天天色天天舔天天爱天天爽| 日韩日比视频在线| 五月天开心激情综合网| av免费在线网站| 婷婷丁香97| 99热精品在线播放| 天天射综合网站| 《诡秘之主》在线观看| 色婷婷成人做爰A片免费看网站| 日本色婷婷五月天成人电影| 丁香五月综合激情久久潮喷| 激情五月天之六月婷婷| 国产一区二区三区影院| 亚洲十月婷婷综合| 色婷婷狠狠18yy| 激情综合五| 亚洲九区| 丁香六月综合激情| 激情丁香社区| 激情99| 激情五月天激情综合网| 欧美色必爱| 婷婷六月天天| 久久9热| 99re在线观看| 天天天天天天噜| 97久人人| 99热在线播放| 深夜激情网| 九九色天堂| 激情五月天在线视频| 成人婷婷五月| 五月丁香婷婷婷激情爱爱| 在线日韩视频| 79亚洲精品少妇| 亚洲成人电影在线免费观看| 五月婷婷色综图片| 五月天亚洲最大成人|