色五月色开心色婷婷色丁香,五月婷婷丁香花综合网,婷婷丁香五月激情综合在线,五月婷婷六月丁香动漫,婷婷丁香五月激情综合在线,丁香花中文字幕在线观看,播五月色五月开心五月网,开心激情综合网,狠狠色丁香婷婷综合最新地址,丁香视频在线观看,狠狠做六月爱婷婷综合av,久久激情五月丁香伊人

ARTICLE DETAIL

資訊詳情

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

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

SpringBoot啟動流程詳解:從main方法到內(nèi)嵌Tomcat就緒 1. 為什么值得把啟動流程啃透——面試只是最表面的理由如果你搞過一段時(shí)間SpringBoot大概率被問過SpringBoot的啟動流程是什么這類問題。說實(shí)話這個(gè)問題在面試?yán)锍霈F(xiàn)的頻率非常高但它絕對不只是面試題那么簡單。我在實(shí)際生產(chǎn)環(huán)境里排查過好幾次詭異故障——應(yīng)用啟動后端口遲遲不監(jiān)聽、某些Bean在啟動階段莫名報(bào)錯(cuò)、配置項(xiàng)總是被意外覆蓋——最后追根溯源都得回到啟動流程上找原因。SpringBoot的啟動流程本質(zhì)上回答了一個(gè)核心問題一個(gè)只有幾十行代碼的main方法是怎么變成一個(gè)包含內(nèi)嵌Tomcat、數(shù)據(jù)庫連接池、各種自動配置、Bean管理體系、Web接口全部就緒的完整應(yīng)用的。這中間不是SpringBoot自己施法完成的而是SpringFramework的IoC容器啟動邏輯和SpringBoot的自動裝配機(jī)制、環(huán)境準(zhǔn)備機(jī)制、內(nèi)嵌服務(wù)器機(jī)制按特定順序組合運(yùn)行的產(chǎn)物。把這條線理順你對整個(gè)Spring生態(tài)的理解會上一個(gè)臺階。這篇文章我會從SpringApplication的構(gòu)造開始沿著run方法一路往下走把每一步做了什么、為什么在這個(gè)時(shí)機(jī)做、哪些地方容易出問題都拆開講清楚。內(nèi)容偏原理但我盡量用大白話和實(shí)際案例說話保證你能一邊看一邊在腦子里把整個(gè)執(zhí)行鏈路串起來。2. 從main方法到SpringApplication初始化——你以為的起點(diǎn)不是真起點(diǎn)很多人在項(xiàng)目里看到這樣的代碼覺得應(yīng)用就是從這行開始跑的SpringBootApplication public class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } }這句話本身沒問題但啟動流程真正開始的位置要往前推一步。SpringApplication.run是一個(gè)靜態(tài)方法它內(nèi)部先要創(chuàng)建一個(gè)SpringApplication實(shí)例然后再調(diào)用實(shí)例的run方法。也就是說啟動流程的第一段其實(shí)是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。這個(gè)過程用的是ClassNameUtils的預(yù)設(shè)類名集合做存在性檢查不是new出來再看性能開銷極小。加載BootstrapRegistryInitializer從spring.factories中讀取所有BootstrapRegistryInitializer實(shí)現(xiàn)這個(gè)是SpringBoot 2.4.0之后引入的新機(jī)制用于在啟動早期階段做額外注冊。加載ApplicationContextInitializer同樣從spring.factories中讀取這些初始化器會在ApplicationContext準(zhǔn)備完成后、refresh之前被調(diào)用。她們負(fù)責(zé)做一些定制化操作比如設(shè)置Environment的默認(rèn)profile、注冊額外的BeanFactoryPostProcessor等。加載ApplicationListener從spring.factories中讀取所有的ApplicationListener實(shí)現(xiàn)這些監(jiān)聽器會在啟動流程的不同階段收到事件通知比如ApplicationStartedEvent、ApplicationReadyEvent、ApplicationFailedEvent。這四步的共同點(diǎn)是讀取并緩存配置都是在為后續(xù)的run階段做準(zhǔn)備。你可能注意到這里文件都在用spring.factories——雖說SpringBoot 2.7開始推薦用AutoConfiguration.imports文件加載自動配置類但ApplicationListener、ApplicationContextInitializer、EnvironmentPostProcessor這些基礎(chǔ)設(shè)施至今仍主要走spring.factories。2.2 構(gòu)造階段的坑為什么說主啟動類位置不能亂放我在排查一些項(xiàng)目問題時(shí)發(fā)現(xiàn)很多人對主啟動類放哪個(gè)包不太在意。其實(shí)主啟動類的位置直接決定了默認(rèn)的組件掃描根路徑——SpringBootApplication上內(nèi)置的ComponentScan如果不顯式指定basePackages默認(rèn)就以主啟動類所在包為掃描根。所以我見過的情況是把主啟動類放在頂層包結(jié)果掃描范圍一下鋪到整個(gè)項(xiàng)目啟動時(shí)加載了大量不該加載的Bean啟動速度慢不說偶爾還會出現(xiàn)Bean類型沖突。更隱蔽的一個(gè)坑是主啟動類被放在某個(gè)子包里導(dǎo)致兄弟包里的RestController、Service全部沒掃到表現(xiàn)就是啟動成功但接口404。這種問題排查起來最費(fèi)時(shí)間因?yàn)槟愕谝环磻?yīng)不會去懷疑啟動類的擺放位置。實(shí)際上啟動類放在哪本質(zhì)上是配置了掃描邊界這個(gè)邊界在啟動階段直接影響后續(xù)的ComponentScan執(zhí)行范圍。3. run方法的前半段監(jiān)聽器、環(huán)境與Banner如何交織實(shí)例構(gòu)造完成之后SpringApplication.run(String... args)方法就登場了。這個(gè)方法的內(nèi)容在SpringBoot不同版本里略有差異但主干邏輯相當(dāng)穩(wěn)定。我以SpringBoot 2.7.x為例按執(zhí)行順序拆開說。3.1 啟動計(jì)時(shí)與運(yùn)行監(jiān)聽器run方法最先做的事情是創(chuàng)建StopWatch。這個(gè)名字很直白就是個(gè)秒表。之后調(diào)用SpringApplicationRunListeners對象的starting()方法。SpringApplicationRunListeners不是單個(gè)監(jiān)聽器而是一組SpringApplicationRunListener的集合。它和ApplicationListener的區(qū)別在于SpringApplicationRunListener專門監(jiān)聽SpringApplication啟動過程中的九個(gè)階段starting、environmentPrepared、contextPrepared、contextLoaded、started、ready、failed等更偏啟動生命周期ApplicationListener則是SpringFramework的通用事件機(jī)制監(jiān)聽的是ApplicationEvent。這個(gè)階段最常見的用途是實(shí)現(xiàn)啟動耗時(shí)打點(diǎn)。我在自己的基礎(chǔ)框架里就實(shí)現(xiàn)過一個(gè)SpringApplicationRunListener在starting階段記錄啟動時(shí)間、在ready階段計(jì)算總耗時(shí)并輸出到監(jiān)控日志。要注冊這個(gè)監(jiān)聽器還是在spring.factories里加配置org.springframework.boot.SpringApplicationRunListenercom.example.support.CustomRunListener然后寫一個(gè)構(gòu)造方法簽名匹配SpringApplication, String[]的實(shí)現(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í)行。這是非常強(qiáng)大的擴(kuò)展點(diǎn)配置中心、加密配置解密器基本都是靠它實(shí)現(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注意一個(gè)容易被忽略的點(diǎn)同名的application.ymljar包外的配置會覆蓋jar包內(nèi)的。這個(gè)機(jī)制在生產(chǎn)環(huán)境非常有用——不用重新打包就能調(diào)整配置——但也經(jīng)常造成本地跑得好好的服務(wù)器上配置不生效的奇怪現(xiàn)象。3.3 Banner、Headless屬性與ApplicationContext創(chuàng)建環(huán)境準(zhǔn)備完成后run方法會打印Banner。這一步的擴(kuò)展點(diǎn)在Banner接口上你想自定義啟動圖案可以實(shí)現(xiàn)這個(gè)接口并配置spring.banner.location指向自己的banner文件。熱詞里提到的SpringBoot banner生成器就是這樣來的——它生成的其實(shí)就是一個(gè)文本文件SpringBoot啟動時(shí)會把它打印到控制臺。另外spring.main.banner-modeoff可以關(guān)掉它某些生產(chǎn)環(huán)境為了日志干凈會這么設(shè)置。緊接著是一個(gè)不起眼但很重要的小操作configureHeadlessProperty。它會設(shè)置java.awt.headlesstrue確保應(yīng)用在沒有鍵盤鼠標(biāo)顯示器的服務(wù)器環(huán)境下也能正常運(yùn)行某些AWT類。這一步絕大多數(shù)人感知不到但它解釋了為什么Headless模式是SpringBoot的默認(rèn)行為。再往下是createApplicationContext。這個(gè)方法根據(jù)WebApplicationType類型創(chuàng)建對應(yīng)的ApplicationContext實(shí)現(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()整個(gè)流程的實(shí)權(quán)部門——SpringBoot在這里動了什么手腳ApplicationContext創(chuàng)建好以后啟動流程進(jìn)入最關(guān)鍵的一環(huán)refreshContext(context)。這個(gè)方法內(nèi)部調(diào)用的其實(shí)就是SpringFramework中AbstractApplicationContext的refresh()模板方法。如果你讀過Spring源碼就會知道refresh()方法是SpringIoC容器啟動的核心流程一共12個(gè)步驟。SpringBoot的討巧之處在于它不重寫這個(gè)方法而是通過子類覆寫其中特定的模板方法把自己的邏輯塞進(jìn)SpringFramework既有的流程里。這種在不改變骨架的前提下替換零件的設(shè)計(jì)思路是理解SpringBoot與Spring關(guān)系的關(guān)鍵。4.1 12步refresh流程里SpringBoot重點(diǎn)插手的位置refresh()的主要步驟和SpringBoot在其中的角色對應(yīng)關(guān)系如下表步驟方法SpringFramework做的事SpringBoot插手的事1prepareRefresh準(zhǔn)備刷新設(shè)置啟動時(shí)間、活躍狀態(tài)初始化屬性源在這里準(zhǔn)備WebApplicationContext相關(guān)的早期屬性2obtainFreshBeanFactory獲取/創(chuàng)建BeanFactory使用DefaultListableBeanFactory3prepareBeanFactory配置BeanFactory的標(biāo)準(zhǔn)特性比如ClassLoader、表達(dá)式解析器注冊WebApplicationContext相關(guān)的后置處理器4postProcessBeanFactory空實(shí)現(xiàn)模板方法注冊ServletContextAwareProcessor等5invokeBeanFactoryPostProcessors執(zhí)行BeanFactoryPostProcessorConfigurationClassPostProcessor在這里完成配置類解析和自動配置類導(dǎo)入6registerBeanPostProcessors注冊BeanPostProcessor無特殊7initMessageSource初始化MessageSource無特殊8initApplicationEventMulticaster初始化事件廣播器無特殊9onRefresh空實(shí)現(xiàn)模板方法創(chuàng)建并啟動內(nèi)嵌Web服務(wù)器10registerListeners注冊監(jiān)聽器無特殊11finishBeanFactoryInitialization實(shí)例化所有非懶加載的單例Bean完成所有Controller、Service的創(chuàng)建內(nèi)嵌Tomcat開始接收請求的準(zhǔn)備工作12finishRefresh完成刷新發(fā)布ContextRefreshedEvent啟動WebServer調(diào)用生命周期處理器第5步和第9步是SpringBoot影響最大的兩個(gè)位置。第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提供的擴(kuò)展點(diǎn)允許在Bean定義加載完成之后、Bean實(shí)例化之前對BeanDefinition進(jìn)行修改。ConfigurationClassPostProcessor實(shí)現(xiàn)了這個(gè)接口更準(zhǔn)確地說是BeanDefinitionRegistryPostProcessor它負(fù)責(zé)解析配置類上的Configuration、ComponentScan、Import、Bean等注解把這些注解展開成具體的BeanDefinition注冊進(jìn)容器。SpringBoot的自動配置類也是在這個(gè)階段被處理的。SpringBootApplication上的EnableAutoConfiguration注解最終會通過AutoConfigurationImportSelector選擇性地加載一批自動配置類——這個(gè)過程要走Import機(jī)制而Import的解析執(zhí)行者就是ConfigurationClassPostProcessor。所以你看到的效果是SpringBoot應(yīng)用啟動后容器里自動多出了數(shù)據(jù)源配置、MyBatis的SqlSessionFactory、RedisTemplate等Bean定義。實(shí)際上這些都是第5步里后置處理器把EnableAutoConfiguration展開后看到的一個(gè)個(gè)自動配置類再把它們內(nèi)部聲明的Bean方法轉(zhuǎn)為BeanDefinition實(shí)現(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()方法。它要做的決策是從容器里找到一個(gè)ServletWebServerFactory類型的Bean——SpringBoot自動裝配階段如果沒有人為干預(yù)會默認(rèn)注冊一個(gè)TomcatServletWebServerFactory——然后調(diào)用工廠的getWebServer(ServletContextInitializer...)方法。在這個(gè)方法內(nèi)部Tomcat實(shí)例被創(chuàng)建、配置端口、連接器、線程池參數(shù)Context和Servlet容器初始化最后tomcat.start()讓端口真正開始監(jiān)聽。這里有個(gè)非常實(shí)用的排查經(jīng)驗(yàn)如果項(xiàng)目里同時(shí)存在Tomcat的JAR包和Jetty的JAR包SpringBoot不會自己分辨用哪個(gè)而是拋出BeanDefinitionStoreException之類的沖突異常。解決方式是把不用的那個(gè)從依賴?yán)飁xclude掉或者顯式指定spring.main.web-application-type和對應(yīng)的Factory類型。很多人遇到多個(gè)ServletWebServerFactory Bean的報(bào)錯(cuò)就是因?yàn)檫@個(gè)。5. 自動裝配不是魔法Condition與ConfigurationClassPostProcessor的舞蹈既然提到了自動裝配是啟動流程中最關(guān)鍵的環(huán)節(jié)這一節(jié)專門展開講清楚。熱詞里的springboot自動裝配原理是每次面試都繞不開的點(diǎn)而它真正起作用的時(shí)機(jī)就在refresh的第5步。5.1 AutoConfiguration.imports文件的加載鏈路SpringBoot 2.7版本之后自動配置類的索引文件從META-INF/spring.factories遷移到了META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports。這個(gè)文件內(nèi)容的格式很簡單每行一個(gè)自動配置類的全限定類名com.example.starter.autoconfigure.DemoAutoConfiguration com.example.starter.autoconfigure.Demo2AutoConfigurationEnableAutoConfiguration通過AutoConfigurationImportSelector讀取這個(gè)文件然后對列表里的每個(gè)候選配置類做條件化處理。為什么用獨(dú)立文件而不是spring.factories官方給的理由是單獨(dú)文件更輕量、更容易解析而且避免了spring.factories里條目過多、不同模塊之間的干擾。我自己的理解是這也是一種性能優(yōu)化——啟動階段解析文件的開銷雖然不大但能少讀一點(diǎn)是一點(diǎn)。5.2 Conditional注解的評估時(shí)機(jī)與順序每個(gè)自動配置類上都有一堆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)存在某個(gè)BeanDefinition或Bean檢查屬性的條件ConditionalOnProperty指定的配置項(xiàng)是否為預(yù)期值這里有個(gè)容易踩坑的細(xì)節(jié)ConditionalOnBean和ConditionalOnMissingBean的判斷時(shí)機(jī)在配置類解析階段而當(dāng)時(shí)的容器里可能還沒注冊完所有BeanDefinition。所以如果同一個(gè)自動配置類里的兩個(gè)Bean方法互相依賴條件可能出現(xiàn)判斷不準(zhǔn)的情況。解決辦法是在Bean方法參數(shù)上聲明依賴讓Spring自動處理順序而不是靠條件的先后順序。5.3 自定義自動配置類的最小可運(yùn)行示例理解了原理后可以做一個(gè)最小的自定義自動配置類來驗(yàn)證整個(gè)鏈路。假設(shè)我要做一個(gè)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第三步在一個(gè)普通SpringBoot項(xiàng)目里引入這個(gè)包啟動后就能看到DemoService被自動注冊了。這就是SpringBoot啟動流程中第5步解析配置類時(shí)發(fā)生的事——你的自定義自動配置類和SpringBoot內(nèi)置的自動配置類走的是完全相同的通道。6. 從Bean實(shí)例化到Web服務(wù)器就緒——啟動尾段的重要細(xì)節(jié)refresh的第11步finishBeanFactoryInitialization是量變引發(fā)質(zhì)變的節(jié)點(diǎn)。在這之前所有的BeanDefinition已經(jīng)注冊所有的BeanFactoryPostProcessor已經(jīng)運(yùn)行完BeanPostProcessor也準(zhǔn)備好了。從這一步開始容器會遍歷所有非懶加載的單例BeanDefinition逐個(gè)實(shí)例化。6.1 單例Bean的實(shí)例化順序由什么決定Spring在實(shí)例化單例Bean時(shí)并不是按照BeanDefinition的注冊順序盲目new。它會先把滿足條件的BeanDefinition放入一個(gè)List通過AnnotationAwareOrderComparator排序——也就是說實(shí)現(xiàn)了Ordered接口或標(biāo)注了Order注解的Bean可以控制實(shí)例化順序。但大多數(shù)Bean之間其實(shí)沒有顯式順序依賴Spring會按照依賴關(guān)系自動構(gòu)建A依賴B那就先實(shí)例化B再實(shí)例化A。這個(gè)階段最常見的報(bào)錯(cuò)就是循環(huán)依賴。比如A和B互相注入Spring在默認(rèn)情況下單例、非構(gòu)造器注入能通過三級緩存機(jī)制解決——這是Spring閉環(huán)能力的體現(xiàn)。但如果你把其中一方改成了構(gòu)造器注入或者把spring.main.allow-circular-references設(shè)置為false循環(huán)依賴就會直接拋出BeanCurrentlyInCreationException。我處理的幾個(gè)生產(chǎn)故障里有一起就是重構(gòu)時(shí)把字段注入改成了構(gòu)造器注入結(jié)果原本正常的循環(huán)依賴立刻爆雷。實(shí)際經(jīng)驗(yàn)是比起想盡辦法繞過循環(huán)依賴不如從設(shè)計(jì)上消除它——該拆的模塊拆開該用事件驅(qū)動用的用事件驅(qū)動別指望Spring幫你兜底。6.2 onRefresh與finishBeanFactoryInitialization誰先誰后這里有個(gè)順序關(guān)系值得單獨(dú)強(qiáng)調(diào)Web服務(wù)器在onRefresh里先被創(chuàng)建并啟動端口監(jiān)聽但此時(shí)DispatcherServlet等Web相關(guān)的Bean可能還沒完成實(shí)例化。SpringBoot的巧妙處理是Tomcat啟動時(shí)不會馬上對外提供服務(wù)——實(shí)際上這時(shí)候請求進(jìn)來也是能監(jiān)聽到TCP連接的只是業(yè)務(wù)鏈路還沒完全就緒。真正可以接受請求的狀態(tài)要到refresh完成之后、ApplicationReadyEvent發(fā)布之前的那一瞬間才成立。這也是為什么你通過健康檢查腳本探測端口時(shí)端口雖然已經(jīng)通了但應(yīng)用還沒完全ready需要再等一小會兒才返回UP。很多部署腳本踩過這個(gè)坑端口一監(jiān)聽就立刻發(fā)流量結(jié)果應(yīng)用還在執(zhí)行ApplicationRunner或初始化緩存導(dǎo)致首批請求超時(shí)。6.3 ApplicationRunner與CommandLineRunner啟動收尾的鉤子refresh方法執(zhí)行完后run方法會發(fā)布ApplicationStartedEvent緊接著執(zhí)行callRunners。這一步SpringBoot會把容器里所有的ApplicationRunner和CommandLineRunner找出來依次執(zhí)行它們的run方法。兩者的區(qū)別很簡單ApplicationRunner的run方法接收一個(gè)封裝好的ApplicationArguments對象可以方便地獲取參數(shù)名和參數(shù)值CommandLineRunner的run方法接收原始String數(shù)組稍顯原始兩者的執(zhí)行順序同樣可以通過Order注解控制。在實(shí)際項(xiàng)目中我習(xí)慣把數(shù)據(jù)初始化、緩存預(yù)熱、敏感信息加載等操作放進(jìn)ApplicationRunner里做因?yàn)樗膮?shù)處理更友好。但要記住這些Runner的執(zhí)行是同步的如果它內(nèi)部長時(shí)間阻塞應(yīng)用雖然已經(jīng)啟動完成但一直等不到ApplicationReadyEvent健康檢查會一直處于DOWN狀態(tài)。7. 啟動階段高頻故障排查實(shí)錄從現(xiàn)象逆推流程中的斷點(diǎn)講完整個(gè)啟動鏈路我?guī)Т蠹铱磶讉€(gè)真實(shí)場景用從現(xiàn)象反推流程斷點(diǎn)的思路來復(fù)盤。這也是我寫這篇文章的初衷——啟動流程不是背出來的八股文而是排查問題時(shí)的導(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。再看是不是有多個(gè)ApplicationContext。如果引入了某些老框架它可能自己創(chuàng)建了一個(gè)獨(dú)立的WebApplicationContext接口注冊到了另一個(gè)容器里。最后檢查spring.mvc.servlet.path或server.servlet.context-path配置。這個(gè)配置如果被誤設(shè)接口路徑整體加前綴也表現(xiàn)為404。這個(gè)問題的根源本質(zhì)上就是啟動流程第5步的組件掃描邊界出了問題。主啟動類位置決定了掃描根這一點(diǎn)我再強(qiáng)調(diào)一次。7.2 啟動卡在Root WebApplicationContext: initialization completed現(xiàn)象日志停在這一行之后長時(shí)間沒有進(jìn)展進(jìn)程不退出也不報(bào)錯(cuò)。排查鏈路這一個(gè)卡住的階段對應(yīng)的是refresh第9步之后、第11步之前——也就是onRefresh創(chuàng)建Web服務(wù)器之后的Bean實(shí)例化階段。最可能的原因是某個(gè)Bean的構(gòu)造器或PostConstruct方法里有阻塞操作比如等待數(shù)據(jù)庫連接、調(diào)用外部RPC接口超時(shí)、遞歸初始化死循環(huán)。用jstack導(dǎo)出線程棧看阻塞點(diǎn)落在哪個(gè)類的哪個(gè)方法一擊命中。我遇到過的典型案例是一個(gè)連接池預(yù)熱的PostConstruct方法它在啟動時(shí)嘗試建立100個(gè)數(shù)據(jù)庫連接但數(shù)據(jù)庫連接池的最大連接數(shù)配置只有50結(jié)果互相等待直到連接超時(shí)。解決方式是調(diào)整預(yù)熱邏輯把同步預(yù)熱改成異步或者先設(shè)一個(gè)較大的連接池上限。7.3 多個(gè)ServletWebServerFactory的Bean沖突現(xiàn)象啟動直接報(bào)錯(cuò)提示有一個(gè)以上ServletWebServerFactory類型的Bean。排查鏈路檢查classpath里是不是同時(shí)引入了spring-boot-starter-tomcat和spring-boot-starter-jetty。保留一個(gè)排除另一個(gè)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ù)器共存比如一個(gè)負(fù)責(zé)REST、一個(gè)負(fù)責(zé)內(nèi)部管理接口可以手動配置兩個(gè)ServletWebServerFactory并分別指定端口但這是高級玩法不建議新手一上來就嘗試。這個(gè)沖突點(diǎn)發(fā)生在自動裝配階段兩個(gè)Factory都被注冊成Bean了第9步onRefresh要找一個(gè)時(shí)發(fā)現(xiàn)有兩個(gè)候選只能拋異常。理解了流程斷點(diǎn)你看到這種報(bào)錯(cuò)根本不需要翻日志直接去依賴?yán)锊橹丶纯伞?.4 版本太高類問題與啟動日志中的密文配置解密熱詞里有一條springboot版本太高這其實(shí)是真實(shí)存在的問題SpringBoot 3.x要求JDK 17如果項(xiàng)目還在用JDK 8強(qiáng)行升級必然啟動失敗另外某些第三方starter的版本跟不上SpringBoot大版本升級也會出現(xiàn)自動配置類的方法簽名不兼容啟動時(shí)拋NoSuchMethodError、ClassNotFoundException。還有一種情況SpringBoot 3.x里javax.*包換成了jakarta.*包如果你的老代碼里還有import javax.servlet.*啟動時(shí)根本過不了編譯。這些問題都能追溯到啟動流程第1步之前的依賴準(zhǔn)備階段——main方法都還沒進(jìn)呢類加載就失敗了。至于springboot yml密文常見做法是在配置準(zhǔn)備階段用EnvironmentPostProcessor解密帶特定前綴的配置值。解密動作發(fā)生在PropertySource加載完成之后、各Bean真正讀取配置之前這樣保證所有地方拿到的都是明文。如果你打算自己實(shí)現(xiàn)記住EnvironmentPostProcessor要注冊在spring.factories里而且不要在實(shí)現(xiàn)里依賴任何Spring容器的Bean——因?yàn)樗旧韴?zhí)行得很早容器還沒完成裝配。7.5 啟動慢的排查要點(diǎn)再補(bǔ)充一個(gè)所有項(xiàng)目都可能遇到的啟動速度慢。從啟動流程的角度看慢的地方通常是這幾塊ComponentScan掃描的包太多這個(gè)可以用spring-context-indexer生成候選組件索引來緩解finishBeanFactoryInitialization階段實(shí)例化的單例Bean太多可以考慮把不急著用的Bean改為懶加載或者用spring.main.lazy-initializationtrue全局開啟但要注意副作用懶加載Bean在首次使用時(shí)才創(chuàng)建可能把啟動期故障延遲到運(yùn)行期才暴露自動配置類評估了大量ConditionalOnClass雖然每個(gè)檢查很快但量多了也有開銷??梢酝ㄟ^排除用不上的自動配置類來提速比如SpringBootApplication(exclude {DataSourceAutoConfiguration.class})8. 最后再說兩點(diǎn)實(shí)際體會啟動流程我讀了不下五遍每一遍都有新的收獲。第一次讀是背面試題知道run方法會調(diào)refresh、refresh里有12個(gè)步驟第二次是排查線上啟動失敗開始去理解每一步之間誰先誰后、某個(gè)異常出現(xiàn)在哪兩個(gè)斷點(diǎn)之間第三次是寫自己的starter、做公司基礎(chǔ)框架的時(shí)候猛然意識到自動裝配的本質(zhì)就是在特定時(shí)機(jī)把BeanDefinition批量注冊進(jìn)去。這個(gè)境界的提升和具體的技術(shù)細(xì)節(jié)無關(guān)純粹是看問題視角的轉(zhuǎn)變——從用它到駕馭它。如果你也想徹底掌握啟動流程我的建議是不要只看SpringBoot的代碼一定要配合SpringFramework的refresh方法一起讀。SpringBoot本身并沒有發(fā)明一套新的容器啟動機(jī)制它只是在一個(gè)成熟的容器啟動框架上利用模板方法模式在特定位置插入了自己的邏輯。理清哪些是SpringFramework的、哪些是SpringBoot的你就擁有了一張完整的啟動地圖。另外一個(gè)技巧是善用Actuator的/actuator/beans端點(diǎn)如果配置了啟動完成后可以看看哪些Bean被創(chuàng)建了、哪些條件沒滿足被跳過了。這個(gè)端點(diǎn)對理解自動裝配的生效范圍非常有幫助。最終啟動流程不是一個(gè)需要死記硬背的知識點(diǎn)而是一張排查地圖。下次啟動出問題時(shí)對照流程找斷點(diǎn)定位速度會比胡亂試快得多。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
av网站国产主播在线| 蜜桃臀AV在线| 天天性射网| 欧美日韩啪啪电影| 久久综合久久综合人久久夜精品| 97在线视频免费看| 99热这里是精品| 亚洲情色第一页| 老熟女天天操| 国产一级片| 好吊爽好吊爽在线视频,中文字幕精品一区二区日本,国产良妇出轨视频在线观看, | 99草精| 少妇无码av专区线| 亚洲AO在线| 在线观看亚洲成人精品| 中文字幕天天操| 伊人热综合| 精品一区二区三区蜜桃臀赵总 | 无码国产精品96久久久久孕妇| 老子午夜伦不卡影院| 色激情五月天| 亚洲国产综合图区中文字幕| 小草精彩毛片| 加勒比大香蕉视频在线| 欧洲欧美视频一区二区| 少妇无码av专区线| 后入式999| 天天日天天干天天色| 美日韩成人| 亚洲在线A| 亚洲无码免费看| 亚洲av热热色| 日婷婷| 综合网亚| 国产一区二区免费福利片| xxx亚洲午夜天堂| 日韩av在线精品观看| www.97在线| 亚洲欧洲日韩中文字幕一区| 欧美后进式| 五月丁香六月婷| 黄色成年| 人妻加勒比东京热| 91久久久亚洲| 97色操| 免费观看有码高清视频| 性欧美91| 久久精品人妻一区二区| 婷婷五月丁香五月| 无码天天操| 天天影视综合色| 天天干天天做| 日本成人免费一区二区三区| 午夜久久久| 99碰碰| 超碰97久久| 日本啊啊啊啊啊视频| 天天天天天天天天天天干美女| 婷婷精品久久av影视| 性在久久久久久| 91视频女生| 丁香五月激情综合| 亚洲图片激情综合另类| 九九九不卡| 色综合潮| 狠狠色婷婷777| 日韩一级二级三级免费看完整版 | 日本性爱视频一级| 伊人四虎综合| 中文字幕久久精视频久久大全| 激情抓乳插进去啪啪啪日韩 | 欧美青青草视频| 色情综合网| 免费看片黄| 啊灬啊灬啊灬啊灬高潮奶出了免费视 | 国产女同视频在线播放| 变态综合色| 久久久久9999妇女| 成人免费福利在线观看| av爱爱爱| 东京热99999| 熟妇人妻精品一区二区视频色欲| 人人看人人摸人人色| 久久色精品视频在线| 91N综合网在线| www网站黄| 国产男女边吃边摸视频网站| 亚洲国产精品成人久久蜜臀| 亚欧美色图| 日韩精品熟妇| oumeisetu综合| 色狠狠综合| 丰满人妻无码一区二区三区| 99热在线播放| 亚洲色欧| 色哟哟av| 影音资源男人日韩| 亚洲国产ⅴ高清在线观看| 丝袜美腿操av| 日韩一级二级三级免费看完整版国语版 | 青春草莓视频在线观看网址| 男人网站婷婷| 日韩欧美视频青青| 97人妻免费中文字幕| AVE乱伦| 久操国产在线| 欧美激情区| 中文字幕一区二区三区四五区| 天天综合网1| 好淫网一二三视区| 丁香五月社区| www.色五月| 亚洲成av人片色午夜乱码| 久久中文字幕一区不卡| 花花AV导航| 日韩成人人妻网站| 9久9久9久9久视频网站| 欧美色吧综合| 国产又色又爽又舒服的三级视频| 自拍鲍鱼一区在线高清观看免费| 性爱久久| 亚洲中文日韩欧美大香蕉视频| 日韩免费高清大片在线| 超碰成人公开| 免费A V在线播放| 91综合色噜噜| 无码一区二区精品视频久久久春药 | 一本大道不卡一二三区| 九色精品视频导航1| 激情五月综合开心五月| 成人 日本A片无码8888| 国产精品午夜高潮呻吟久久av| 在线人人人人人人精品超| 一级@啪啪视频| 国产1024在线播放| 亚洲第一黄色av网站| 再深点灬舒服灬太大了添视频| 欧美成人四级在线播放| 日本性爱少妇| 国产天天骚| 妇女视频网站| 天天日天天干天天摸天天操| 9国产超碰| 老司机天天操| 国产成人bd在线观看| 日韩女模中文造逼| 偷拍伦理视频| 伊人国产视频| 99热线麻豆 | 日韩性爱电影一区| 亚洲综合有玛| 国产一区二区在线播放,久久亚洲精品中文字幕第一区,亚洲精品在线中文字幕视频 | 国产精选视频| 国模无码人体一区二区三| 欧美18 在线观看| 亚洲系列第一页| 久久久久9| 激情五月天丁香| 日韩丝袜人妻AV| 99在线视频播放| 91亚.色| 久久高潮妇女视频| www.高清无码诱惑一区.com| 偷拍亚洲情色| 国产9l 大屁股| 精品欧美老熟女一二区| 婷婷久久五月| 狠狠2050在线观看| 天天综合欧美| 美女视频尤物网在线看| 婷婷精品视频| 91丝袜美女| 久久华人网| www.色吧5.com| 久久成人国产| 天天干一干| 国产乱弄免费在线视频。| 日韩精品三级片长长久久| 色妺妺AⅤ| 高清无码在线播放网站| 色99色| 伊人精品视频| 尹人免费观看视频在线| 嗯啊不要啊在线| 性爱久久| 偷拍视频青青草在线视频| 久久亚州精品成人Av无| 午夜精品一区二区三区三上悠亚| 色网亚洲人| 日婷婷| 久碰视频| 夫妻AV网站| 久久久久久日韩| 精品久久99| 亚州五月| 五月天社区| 美女让帅哥通她小鸡鸡| 狠狠色噜噜狠狠狠狠狠色综合久久| 欧美制服网站美腿丝袜| 日日骚一区二区三区| 欧美亚洲自拍另类人妻| 91亚洲在线| 日韩av不卡在线观看| 九九成人精品| 丝袜亚洲综合| 亚码激情| 日韩精品在线放| 美女露胸露尿口| 91色香| 日本久久网| 久久久久96| 亚洲一卡二卡在线免费| 欧天美中出| 免费av在线播放二区| 91三级理论片播放器| 性色中出| 亚洲欧综合另类无码一区| 国产免费久久精品99re韩国| 久久这里只有精品9| 色哟哟1区2区| 日韩三级av片| 日韩情色视频| 亚洲一区二区三区春色| 国产午夜视频| 自拍偷拍 高清无码| 欧洲大香蕉| 亚欧无码在线| 亚洲激情久久久伊人综合| 欧洲色色| 啊啊啊啊啊啊啊啊啊在线观看| 91在线免费精品视频| 99热只有这里有精品| 亚欧美色图| 巨爆乳肉感一区二区三区竹菊影视| 婷婷激情五月综合| 色性欧美| 岛国在线免费视频| 欧美激色| 精品熟女一区=区三区| 日本一级真人黄色性爱视频| 国产无遮挡| 国产精品久久天天干| 中文字幕97色| 在线性黄高清免费视频| se吧提供91精品国产91久久久久久| 久草在| 在线人人人人人人精品超| 日韩电影天堂视频二区三区| 国产 v乱码一区二| 欧美激情精品久久久久久| 夜夜操二区| 亚洲中文字幕熟女少妇一区二区| 日韩成人性爱电影在线播放| 天美精品一区二区三区四区在线观看| 日韩性爱再线视频| 日韩av无码网站| 欧美综合 站| 国产日比| 啊啊啊好想要| 加勒比色综合| 五月天色图| 日韩色欲久久一二三四区| 亚洲日韩精品在线播放| 不卡中文字幕aⅴ在线| 国产熟码AV| 神马精品视频| 国产高清无码一区二区三区四区皇冠| 麻豆视频国产一区二区| 亚洲影视高清第一页| 综合久久欧美| 中文字幕日韩精品久久| 久久精品区| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师 | 欧美亚洲AN| 婷婷在线视频| 午夜黄色免费在线观看| 日本丝袜人妻内射| 亚洲人成网站7777| 日日摸日日碰夜夜爽视频| 狠色婷婷久久一区二区三区_| 香蕉在线一区二区三区| 9l视频自拍9l九色成人| 婷婷AV一区二区三区| ,成人免费啪啪视频| 丰满人妻一区二区三区免费 | 无码精品久久| 边做饭边操逼逼| 日日夜夜免费| 蜜臀久久久99久久久久| 另类图片五月天| 乱子伦一区二区三区国产精品| 久久久久久中文字幕中文字幕最新| 日本熟妇人妻中出视频| 极品尤物女神在线观看| 大色综合网| 欧美五十路熟| 国产精品盗摄 偷窥盗摄| 久久久久久人| 欧美熟妇色| 少妇色欲综合网2| 欧美天天综| 蜜臀av一区二区三区免费观看| 日韩黄色成人性爱| 日韩一级成人毛片免费观看 | 精品日韩产品在线,日韩在线不卡视频,欧美日韩免费专区/久, | 69精品| 成人久久久| 欧美91网| av中亚| 欧美性高潮| 天天欧美| 78久久| 精品九九九九| 国产精品露脸在线观看| 富女玩鸭子一级毛片| 爱爱啊啊啊| 91n处女在线观看| 91精品久久久久| 丁香五月天社区| 色婷婷五月天| 色情五月婷婷| 久久熟女人| 人妻精品综合中文字幕在线| 69综合网| 黄久在线| 91综合天天| 欧美日韩久久精品爱爱| 欧洲人妻视频| 91成人精品| 精品人妻15区| 精品日韩| 国产性爱在线视频一区二区| 韩国一级婬片A片AAAAA| 嗯嗯啊啊操死我| 日韩丝袜人妻AV| 四虎影视在线| 一区,二区,三区视频| 丰满搜索结果 -第18页- 久久高清无码 | 婷婷在线视频| 国产精品亚洲四五区在线观看| 久jiu久神马影院| 亚州乱码中文字幕综合久久久| 牛牛久久国产精品视频一二三| 久久国99999| 精久久久| AV一起草在线| 99色在线视频| 亚州色站 日韩电影| 看看日B真人视频| 男人天堂资源| 久草网站免费在线观看| 一区二区偷拍拍视频| 国产精品爱欲| 九九热免费国产视频婷婷伊人五月| 日本A级视频| 国产午夜福利合集| 欧美一级A一级a爱片久久| 影音先锋少妇| 淮穴色AV| 97视频免费在线| 国产中出内射一区二区| 偷看洗澡一二三区美女| 亚洲精品欧洲精品| 男人综合网| 无码精品久久久天天影视| 久久精彩视频| 日日玩天天干| 亚洲,日韩,欧美,成人播放| 26UUU欧美日本| 欧美性生活综合| 亚洲永久永久永久永久一级一级一级精品 | 舔足天天操天天射| 乱抡国产91| 99操逼| 国产五码丝袜屁眼| 欧美性爱精品七区| 亚洲日韩一区电影| 黄色操人| 天天日日夜夜| 国产美女高潮视频| 操屄不卡视频| 大香蕉92| 手机午夜电影神马久久| 97亚洲一区| 日韩无码人妻中字久久三区四区| 日韩激情中文字幕有码| 九九自拍伦理| 浓厚中出中文字幕在线| 爽爽爽免费视频| 91骚熟女| 亚洲成人在线播放| 精品国产乱码久久久久久久久久毛片| 国产精品探花视频| 激情视频一二三| 国产视频一区二区三区在线免费观看| 成人女人国产| 亚洲中文字幕熟女| 国产乱婷婷精品二区三区| 伊人性在线视频| 国产精品女生av| 亚洲综合影片| 中国AV美女| 天天综合欧美综合| 人妻一二三区| 91久热这里只有精品| 日韩干B| 福利色色| 91中出在线| 亚洲欧美在线观看免费| 1.igao73.com 加入收藏 免费专区 国产精品 中文字幕 日韩精品 欧美精品 精彩 | 97伊人网| 色九九九| 交换娇妻呻吟声不停中文字幕| 国产97色在线| 熟女91网站| 激情一区二区三区在线观看| 欧美综合自拍| av麻豆啪啪| 亚洲一区二区久久久久| 亚洲国产综合久久久性感熟妇| 久久久久久九九九| 免费9 1久久| 国产精品久久久久无码A√| 天天天肏屄欧美| 国产日韩区| 日日黄色三级网站| 欧美偷拍区| 亚洲一区亚洲天堂| 日本日逼高清| 中文字幕一品色图| 九九久久久久久爱| 三级精品三级在线观看| 天美传媒精品一区二区三区| 黄视频免费| 人妻少妇久久中文| 无码9区| 色综合V| 美国三级日本三级久久99| 婷婷亚洲天堂| 国产无码精品高清| 精品国产乱码久久久久久免费| 精品国产乱码久久久久久久久1 | 久久超碰98| 天天摸夜夜添无码小视频| julia中文字幕在线观看| 国产精品熟女丝袜一区二区| 亚洲中文字幕在现观看| 亚洲人精品午夜不卡| 99精品在线| 极品另类| 日韩av情韩国爱禁区av一区二区| 97九色人妻| 日本成人免费一区二区三区| 亚洲网污污污污| 色婷婷丁香五月天| 日本操嫩b网| 啊啊啊好想要| 色91综合网| 亚洲天堂AV在线播放| 花花AV导航| 东北女人操比视频| 六月婷婷综合| 免费A V在线播放| 美女天天干| 白丝AV网站| av中文在线| 久久久久亚洲AV无码专区少妇| 熟女少妇视频| 日本一久是| 亚洲中文字幕有码视频一区二区三区| 国产黄色av大片网站| 国产精品无码成人精品| 久这精品中文在线观看视频| 96精品久久久久中文字幕| 五月天色图| www.99中文字幕| 久操91视频| 欧美人妻制服| 怡红院久久老司机| 亚州精人品大香蕉| 中文字幕第页| 激情五月婷婷| 色天使亚洲综合在线观看| 富女玩鸭子一级毛片| 2017天天操| 天天摸天天舔天天操| 色婷婷五月天| 免费人成?大片在线播放| 色黄色美女大长腿午夜视频| 福利社区午夜一区二区| 九九视频黄色片| 天天射天天操天天干天天吃2018 | 人人乐大香蕉| 成人性爱全视频观看| 国产成人午夜视频网址| 亚洲第一精品在线视频| 国产操伦| 亚洲 欧美 精品专区 极品| 亚洲精品97久久中文字幕| 日本久久999| 91欧美另类| 欧美日韩青操| 天堂综合| 国产乱不卡| 91久久精品美女高潮喷水| 蜜桃臀久久| 久久久久亚洲精品| 91丝袜在线视频| www.高清无码诱惑一区.com | 强奸乱伦亚洲第一页| 极品色综合| 亚洲狠狠入| 色区97| 日日夜夜免费| 91久久免费视频互動交流| 小视频国产| 日韩性爱啪啪视频| 黄色人人| 国产黄色视频久久| 国产成人欧美一区二区三区的国产| 欧美另类精品xxxx| 国产日韩精品人妻久久久久色欲网站| 欧美日韩中文视频播放| 2025年A片视频精品| 人妻 丝袜美腿 中文字幕| 先锋影音av先锋一区| 精品成人亚洲午夜电影| 97欧美性爱| 97色婷| 亚洲中文字幕噜噜噜久久久| 香蕉一区二区三区在线视频| 丁香六月啪| 中文字幕五区| 性性欧美| 91欧美经典| 亚欧无码线免费观看视频| 先锋激情∨在线视频播放| 日韩性爱再线视频| 玖玖视频在线资源一区二区三区| 小草精彩毛片| 亚洲精品一卡二卡三卡福利视频网站 | 操少妇很爽av| 囯产精品一区二区三区线|亚洲人成无码网WWW动漫|国产精品免费一级... | 10000部十八禁看电影| 亚洲AV色图一区| 亚洲自拍97| 国产成人综合在线播放| 成人看片网站| 97超碰免费人人性爱| 91亚洲最新在线| 大色网久久| 久久国产逼| 天天日天天干天天整| 澳门人妻久久| 九九超碰综合网| 欧美78P| 欧美黑人精品在线播放| 日韩pv中文| 五月天亚洲网| 岛国在线免费视频| av绯色| 混色激情av| 国产欧美日产一区二区三区 - 国产欧美日| 色妇综合网| 亚欧Av| 91天天综合网,天天综合网| 中文字幕人妻丝袜乱一区三区| 欧美加勒比| 青草草免费网站av| 久久女人视频| 亚洲国产日韩精品久久久| 再深点灬舒服灬太大了添视频| 内射白嫩美女| 人人妻人人爽人人精品| 99久久e免费热视| 欧美亚洲第1页| 精品对白久久不卡| 国产中文精品一区二区在线观看| 熟女中出视频| 人人操人人爽人人操人人| 婷婷丁香成人| 国产少妇内射| 翔田千里A片一区二区| 操逼片中文| 人妻密肉在线观看| 韩国三级三级BD在线| 69精品| 五月天婷婷成人网| 九七超碰人人乐| 免费啪啪啪网站18岁| 台湾肥佬网一区二区三区| 爱干爱射网啊啊啊| 在线视频97| 91亚洲黑人| 欧美少妇色图| 婷婷丁香五月激情啪啪| 欧亚 另类 久| 99精品网| 九热久| 欧美亚洲综合色| 天天搞欧美| 国产精品亚洲无码| 色偷综合| 婷婷丁香成人| 亚州性色| 国产精品乱人伊人网| 亚洲自拍偷拍视频在线 | 97手机日韩| 欧美亚男人的天堂| 一区二区三区亚洲| 懂色av中文字幕一区二区三区天美| 性爱乱伦网址| 欧美激情精品| 精品一区二区啪啪啪| 中文字幕欧美丝袜07资源| 欧美日韩夜夜| 国产亚洲欧美每日在线| 亚洲综合骚逼| 99日韩| 日日AAvv| 又大又黄国产| 熟女熟妇伦久久影院毛片一区二区 | 亚洲日韩少妇一道本视频| 黄片不用下载在线观看| 蜜臀一区二区三区亚洲最新章节在线观看 - 高清蜜臀一区二区三区亚洲全集播放 | 欧美福利视频啊啊啊啊 | 九九久久一区二区伦理| 香蕉精品二区二区 | 在线观看一卡二卡| 强奸乱伦AV一天堂网| 人妻激情在线视频| 激情自拍 校园春色| 国产主播福利| 中文字幕av一区二区三区人妻少妇| 亚洲……91| h无码动漫在线观看| 东京太热男人的天堂久久久| 中文字幕乱码人妻一区二区三区,99精品 | 亚洲精品久| 欧美性爱日韩性爱| 亚洲se91| 天天操狠狠日夜夜干超大胆开放com大香蕉视频在线观看 | 日日躁天天躁狠狠躁| 色女女女导航| 人人操人人摸人 | 欧美日韩国产传媒在线精品| 人人操人人uiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii | 中文字幕黄色片| 91久久免费视频互動交流| 天干天干天干天天做| 久久av色| 九九人人操| 美女极品一区二区三区| 丁香九月婷婷| 欧美性区| 91精品丝袜在线观看| 国产精品第一区第一页| 亚洲熟妇A V黑人| 大香蕉92| 日欧毛片久久| 中文字幕 一区二区 亚洲无码| 黄aaaaaaaaaaaaaaaaaa色网站| 欧美少妇人妻| AV中文字幕三四五| 精品久久九| 亚洲AV资源| 一本道综合色图| 国产精品亚洲一区二区三区四区| 韩国一级婬片A片AAAAA| 国模精品娜娜一二三区| 三男一女不戴套的A片| 99啪啪视频| 亚洲啪啪性视频| 欧美十八禁视频| 欧美大香蕉久| 亚洲天天操| 无码精品啪啪啪一区二区三区三州| 欧美少妇第一页| 91 手机在线播放 绯色| 99人人干| 成人黑料社久久| 岛国片在线播放| 深夜福利黄片| 国内一区二区免费| 人妻少妇精品视频一区二区三区| 香蕉国产97| 破处bbq| 欧美色日| 欧美一区二区三区成人性生活| 一区二区三区亚洲| 黄色操人| 国产精品日韩在线一区| 国产午夜福利专区综合| 97操B| 青青草依人大香蕉| 91n处女在线观看| 精品人妻久久久久一区二区三区| 亚洲校园激情| 91高清欧美| 精品97久久| 蜜臀久久久99久久久久 | 一块操欧美| 日本三级韩三级99久久| 欧美日韩99| 另类小说五月天| 深田咏美亚洲精品福利社| 一区二区三区精品视频| 日本一级一级一级一级| 五月天综合网| 久久久久久久久久久人妻| 亚洲综合另类欧美久久久| 亚洲天堂自拍| 色在线69堂| 拍拍拍拍大尺度黄色三级片拍拍拍拍拍照| 高清孕妇孕交 交孕妇| 亚洲 欧美 日韩另类 麻豆| 台湾佬大香蕉| 国语对白露脸XXXXXX | 99国产精品自在自在| 玖玖超碰熟| 91色夜| 中文字幕丰满子伦无码专区在线视频最新 | 嗯嗯啊啊视频在线看| 裸体女人草逼视频播放一区,二区,三区,四区,五区 | 99亚洲精品| 国产高清免费不卡av| 亚洲精品aa久久伊人| 99这里有精品| 玖玖蜜臀资源网| 亚洲91综合| 一区二区高清视频| 久久久久国产精品久久久| 高清国产无码av| 最新日产中文在线麻豆| 大香蕉伊人色偷偷在线| 亚洲AV不卡在线观看尤物| 啊啊啊 在线观看| 人妻在线大香蕉| 91无摭挡| 97视频在线观看免费高清| 天天日天天干天天操| 色图四区| 69XX一中文字幕人妻91| 亚洲一卡2卡3卡4卡乱码网站 | 99精品九九九九九九| 九九九精品成人免费视频小说| 久久久久久国产无码精品| 大香蕉伊人色偷偷在线| 欧美一区二区三区大综合| 自拍第一页| 国产精品午夜AV完会免费| 国产一区二区三区导航| 欧美日韩222| 日日97| 午夜操逼不卡| 成人精品电影| 亚洲同性aV综合| 亚洲精品一区二区日本| 欧美一区二区三区互相| 五月丁香狠狠爱| 亚洲精品欧洲精品| 亚洲drav色图| yazhouzaixian| 精品久久久久久中文字幕三区| 天天干一干| 国产 三级自拍| 目产99999久久999| 91视频综合| 天天色综合天天操| 亚洲男人综合网| 五月情色天| 俺去俺来也在线www| 77国产精品| 超碰97 线线 在现| 91狼人| 国产精品乱人伊人网| 豆1无夜无码| 极品综合| 色诱中文字幕| 这里只有精品97| www欧美性爱| 狠狠操狠狠燥| 最新的亚洲无吗| 日本最新免费韩国1区2区视频播放| 婷婷久久五月综合激情| 超碰97起碰| 亚洲人妻色图| 九色视频91| 亚洲天堂电影网99999| av日韩手机在线影视| 蜜桃一区二区三区| 久久精品日韩| 人妻在线大香蕉| 国产精品探花色| 青青久操| 高清一区AV无码| 欧美 牲| 亚洲免费成人在线高清无码视频| 精品97久久综合| 欧美日韩另类在线播放| 久久综合女优| 亚州免费啪啪视频| 九一性生活免费视频| 黑人操一区二区| 欧美78| 色情乱伦AV| 日本熟妇自慰性高潮一区二区三区| 久久精品日韩| av线电影| 日韩美女操b| 国产和美国毛片| 国产日本久久免费精品| 国产sv美女内射| 96AV精品| 国产精品一区二区亚洲人成毛片 | 午夜福利 成人 91| 国产毛片精品一区二区色欲黄A片| 99这里都是精品| 6080YYY午夜理论片在线观看| 亚洲精品99| 九九九色| 欧美78| 尹人大香蕉视频在线| 国产老太乱伦一区| 天天享受天天看| 操逼操网| 精品人成视频在线观看| 日韩少妇无吗| 五月天婷婷久久| 翔田千里A片一区二区| 69丨亚洲丨精品丨入口免费播放| 337p大胆噜噜噜噜噜91Av| 夜夜嗨视频| 久久一二三四五六七八九区区| 日本www操操操| 97chaopengongkai| 婷婷情色五月天| 丝袜剧情| 久久精品| 精品乱码在线观看| 区日韩亚洲乱码av电影| 天天看天天在线精品| sewuyueav| 密臀AV在线| 91狠狠色丁香婷婷综合久久| 亚洲一区二区AV| 91综合在线| 97超碰碰| AV在线播放网址| 青青草视频爽一爽| 久久美女福利是上海美女| 午夜成人爽爽爽爽A片李冰冰| 性交一区二区在线播放| 亚洲激情网一二三四区| 亚洲av性爱电影| 欧美综合色站| 日韩一级特黄av毛片| 女人综合网| 蜜桃狠狠色伊人亚洲综合 | 亚洲图片色图欧美另类| 久久久久久久| 好吊爽好吊爽在线视频,中文字幕精品一区二区日本,国产良妇出轨视频在线观看, | 香港成人一级视频在线青青草| 婷婷久热| 中文字幕精品资源在线| 亚洲欧美精品国产一区二区| 亚洲情色 欧美| 老汉网| 天天综合欧美综合| 婷婷综合五月天| 黄色性爱网网| 国产 无码 一区二区| 日本αv| 精品91日日夜夜超清资源| 天天射夜夜| 99黄页网站| 亚州成人a∨| 天天综合网一91网| 夜夜嗨一区二区| 岛国片在线观看视频亚洲| 亚洲成人性| 久久专区| 中文乱码字字幕在线第5页| 97中文热色| 欧美 日韩第一性色| 伊人9| 九热超碰| 色悠久久久av| 性色av一区二区| 亚洲av热热色| 综合干干干av久久久综合网| 欧综合网| 又粗又长又大国产不卡| 亚州综合网| 久久久人妻| 97精品免费| 狠狠超| 色五月AV| 又大又大又大又粗爽高潮观看| 91制服丝袜中文字幕| 四虎AV在线播放| 中文字幕成人乱码熟女精品国50| 亚洲天天自拍| 国产欧美另类久久久精品课程| 男人的天堂久久久| 日日爱99| 不卡av免费在线网址| 亚洲无码国产精品久久| 国产精品一区二区亚洲人成毛片| 亚洲日韩在线a不卡99精品| 亚洲阿v天堂无码z2018| 日韩黄片视频试看| 久操网视频| 日韩精品碰碰| 免费综合亚洲中文| 久久激情五月| 日韩欧美女优电影| 国产久久视频| 国产十八禁视频| 激情小说亚洲图片| 欧美日韩欧美| 亚洲天天操| AV在线性爱| 日韩综合无码色欲vv| 国产亚洲精品玖玖玖在线观看| 国产一区二区三区精品观看啪| 欧美精品日韩一区二区| 啊a一区在线| 欧美亚洲美少妇一区二区| 欧美亚洲综合999| 人人妻人人澡人人爽久久av| 久久久久亚洲| 欧美性生活免费网| 色色热| 天天天乱色综合全| 夜色97| 日本一区二区不卡| 亚洲最新av无码成人精品区| 强奸xx国产| www.高清无码诱惑一区.com | 国产白丝av| 久久久久久久免费A片国产成a人亚洲精∨品无码 | 夜夜人妻爽| 亚洲综合色图欧美| 中文字幕人成乱码熟女香港| 五月天玖玖资源站| 日韩亚洲美女一区久久| 亚洲综合113页| 亚洲综合色图欧美| a片 xxxx受爽视频| 亞洲久久直播| 国产有码一区| 毛片99-全集电影手机免费观看完整-B029AV| 俞拍久久国应视频| 一级特级aaaa毛片免费观看 | 亚洲精品一二牛牛| 第一高清av中文字幕| 乱理日韩中文| 国产熟码AV| 91精品亚洲内射孕妇| 婷婷久久网| 欧美日本天堂| 久操视频在线观看| 亚洲最大的综合性av| 九九九综合精品| 啊啊啊啊免费视频| 日本成人电影资源网| 国产蜜臀精品一区免费尤物| 青青草大香蕉视频| 亚洲无线观看久久| 五月色综合| 亚洲午夜蜜臀| 超清福利精品视频在线| 91 在线亚洲| 亚洲图片小说欧洲| 亚洲天堂中文字| 操操操操操操| 91麻豆天美传媒在线| 欧美婷婷五月天| 熟妇激情| 正在播放国产精品一区| 天天干天天日天天射黄色大片| 久久亚洲欧美一区二区三区-亚洲国产精品第一区二区 | 日韩操逼HD| 亚洲天堂另类小说男人| 超碰97护士| 婷婷久久网| 国产精品第一页国产大屁股视频免费区i| 一级岛国大片| 操穴国产| 超碰97丝袜| 男人的天堂啪啪| 97在线播放 | 蜜臀一区二区三区在线| 无码99| 东京太热男人的天堂久久久| 自偷自拍的亚洲视频| 久久久久久免费电影| 亚洲暴力强奸AV| 视频二区熟女人妻| 无码操逼网| 精品小视频在线| 人人 操人人 操人人| 亚洲天堂另类小说男人| 白丝一区| 91网亚洲| 欧美爱三级日韩久久| 91在线限制级| 五十路六十路素人熟女| 一区二区三区男女操逼黄色小电影| 中文字幕丰满子伦无码专区在线视频最新| 亚洲天堂男人在线| 超碰人妻久久| 中文高清一区二区的| 9色国产精品一区粉嫩 | 久久伊人大香蕉| 欧美最大综合网| 日本午夜久久电影| 欧美成人精品一区| 五月丁香影院| 一起草三级AV电影在线观看 | 婷婷五月丁香五月| 三及片网站| 亚洲精品一区二区三区新线路| 明星性猛交ⅹxxx乱大交| 午夜福利国产欧美日韩夜夜| 久草精品国产蜜臀| 三级网色| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 欧美亚洲首页| 男人的天堂亚洲| 被窝影院午夜看片无码| 久久婷婷亚洲欧| 中日韩熟女| 人妻精品一区二区| 91大神电影天堂| 少妇久久久久久| www.AV有限公司一区| 黑人操一区二区| 香蕉99秘 一区精品蜜桃臀| 91爱综合| 人人 操人人 操人人| 夜夜高潮夜夜爽国产伦精品| 综合熟女| 亚洲国产成人精品久久久国产成人一区二区| 日本最新免费韩国1区2区视频播放| 久操网址| 一二三区精品视频| 激情亚洲天堂| 老司机深夜影院18未满| 91天堂网| 人妻少妇色综合| 日本韩欧美在线播放a| 日本在线观看网址| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师 | 婷婷五月天网| 中文字幕人妻资源在线| 亚洲加勒比色图| 亚洲天堂另类美腿| 日韩黄色成人性爱| 亚洲美女av无码| 亚欧美综合网。| 91xingse| 国产 亚洲 丝袜 制服| 人人妻人人澡人人爽久久av| 青木玲在线不卡| 韩国久久97| www.人人cao| a片久久久久久久久久久久 | 国产成年女人免费视频播放a| 欧美人妻一区二区| 亚洲 图片 欧美 色图| 日本操逼视频导航| 婷婷超| 超碰 国产熟女精品一区| 伊人丝袜美腿高跟在线观看高清| 立川理惠无码一区二区| 日韩激情无码影院| 另类小说欧美激情校园春色| 国产精品视频播放| 思思热免费视频观看| 午夜福利激情在线视频| 2020中文字幕在线观看| 超碰社区97| 久久精品国产99国产精品亚洲| 婷婷综合五月| 思思性爱| 亚洲视频1区| 97色伦97色伦国产欧美| 熟女少妇视频| 欧美91色| 东北操逼| A啊啊在线观看| 色婷婷蜜臀av| 天天做日日做天天欢。| 外国免费性情大片| 中文字幕日韩人妻视频| 女性喷水高潮在线观看| 麻豆一区二区AV天美| 日本道日本道中文字幕日本道最新日本道在线观看 | 国产精品午夜精品| 春色综合网| 2019男人的天堂| 国产女主播视频在线观看| 日韩一级二级在线| 久久99国产综合精品女同| 婷婷五月成人| 五月天激情四射| 婷婷五月天激情小说| WWW黄片COM| www久久99| 深田咏美亚洲精品福利社| 手机在线播放国产福利| 日韩精品人妻一| 日本性爱欧美性爱| 岛国色情视频在线观看| 色翁荡息又大又硬又粗又爽| 东京太热男人的天堂久久久| 国产精品久久泡妞网站| 亚洲欧美综合图片| 久久黄人人爽视频| 97操b| 亚洲欧美日韩中文久久自慰| 天天射夜夜| 欲女人妻性色av| 色噜噜人妻av中文字幕| 国产丁香精品露脸视频| 91高清欧美| 美女9118禁| 国产精品视屏| 午夜国产成人精品视频 | 欧美一级专区免费大片 | 盗摄 精品 另类 一区| 人妻嗯啊啊在线播放| 无码99| 国产精品久久久久绯色| 欧美熟女激情| 日韩精品国模| 日韩综合色网| 天天噜| 精品欧美不卡在线播放| 中国国产精品一区视频| 国产99久久99热这里只有精品15| 成人乱码一区二区三少妇| 婷婷99狠狠躁天天躁| 国产免费一区二区三区最新不卡 | AV天堂国产| 国产精品自在自拍视频| 日本三级大片| 色女99一级片在线观看| 蜜桃久久久久久久久久久久| 精品超碰色| 欧美亚洲高清| 九九九九热| 国产网站在线播放| 97色婷婷| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 午夜国产综合视频在线观看 | 伊人午夜福利视频| 亚洲激情视频|