久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码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
返回資訊列表
天天摸天天操视频| 影音先锋视频在线| 97人肏| 91成人久久| 色哟哟 日韩精品| 青青草中文字幕| 天美久久久久| 久久久偷拍| 精品在线78| 极品肉射| 久久久久久久九九九九| 白丝av| 国产高清自拍视频| 欧美成人A√在线一区二区| 嗯嗯啊好大| 蜜臀AV成人精品蜜臀| 情色AV电影| 99精品丰满人妻无| 伊人991| 2020中文字幕在线| 色五月AV| 超碰欧美在线欧美| 色九久| 国产精品亚洲日韩骚欢乐谷最新地址发布页huanieguty性屋娱乐妖精视频 | 欧美天天| 淫荡网址| 在免费jIzzjIzz在线视频| 国产精品伦理| 亚洲一区中文字幕久久,果冻传媒一区二区天美传媒 | 玖玖在线视频| 亚洲中文字幕精品久久久久久直播| 亚洲成人在线高清| 香一区二区三区| 亚洲在高跟鞋自慰久久在色线| 最近2018中文字幕在线高清第一页| 欧美天天影院| 九九AV| 在线播放成人高清免费视频| 色97干| 欧美国产操逼| 婷婷香网站| 中文字幕亚洲欧美在线不卡| 夜夜操老骚逼视频网站| 成人小电影网站tex| 精品久久久久久亚洲| 日本一区二区三区四区免费观看| 国产操偷| 夜色五月天| 激情综合97| 天天弄天天操| 毛片中心9视频99| 五月天激情小说网| 欧美亚洲丝袜人妻制服99| 在线观看黄色电话| 大香交伊人网| 亚洲日产专区婷婷| 97精品视频| 国产一区自拍欧美日韩| 正在播放:深夜激情大战,自带黑丝袜全力输出骚穴 | 99精品在线观看| Julia在线播放亚洲久久| 色吧综合网| 一区二区激情国产熟女| 欧美性暴力猛交XXXX| 欧美色图99| 国产2.3.4区| 超碰九区| 强奸国产在线| 天天影视综合网欧美精品| 熟女人妻av在线资源,黄色的资源| 精品射1999| 久日91在线| 亚洲资源吧| 三级精品三级在线观看| 美女国产一区二区久久| 偷窥自拍亚洲色图| 欧美丝袜美女电影一二三四区| 精品国产99999| 免费日韩黄片| 六月丁香五月婷婷| 久热一区二区| 99久久婷婷| 91殴美大片| 亚洲九九视频| 污污汅18禁网站在线永久免费观看| 思思性爱| 中文字幕88av在线| 99无码| 日本性爰一道本| 欧美午夜精品久久久久久超碰| 日韩丝袜人妻AV| 男女香蕉一区二区| 老熟女搡BBBB搡BBBB视频| 人人操人人狠狠操| 五月天加勒比啪| 97爱综合| 九九av| 国产第11页| 无码高清操逼| 97色色视频| 99国产精品自在自在| 天天综合97| aⅴ日韩成人电影av在线免费看av大全 | 97色伦欧美| 智利AV在线网| 久久亚洲AV无码专区国产精品| 内射日韩大臀美女| 熟女人妻一区二区三区| 国产日韩欧美三级片| 大香蕉一人在线| 亚洲欧美日韩偷拍色图| 国产不卡片| 啊啊啊啊好多水| 亚洲欧美国产日本一区二区三区 | 久久久久九九九| 亚州色国| 岛国片国产成人亚洲播放| 成人精品视频一区二区| 日欧操屄| 区一二区日韩亚洲乱码av电影| 日本加勒比无码专区| 女人高潮大叫一级毛片| 大香蕉日韩欧美| 久久久久久久国产视频| 国产外初女出血视频| 波多野结衣被操50分钟免费视频| 97伦乱| 久久东京伊人一本到鬼色| 久草新免费| 国产精品露脸在线观看| 久偷拍| 大香蕉www.超碰| 欧美白嫩女HD| 国产精品无套内谢| 精品久久久久成人码免| 六月婷婷综合| 日韩一二三区| 情色av电影| 人人做天天爱| 女优大全 - 91n| 中文字幕二区日韩天堂| 日韩精品一区二区日韩| 亚洲在线观看| 狂操嫩妻视频一区二区三区| 色综合av综合久久| 午夜综合在线| 婷婷久久久| 日本操逼视频免费| 中出20p| 无码免费一区二区三区啪啪| 欧美成熟性爱精品| 久久大香蕉97| 久久av网| 新版天堂中文资源8在线| 老鸭窝成人免费毛片视频| 日本久操视频| 欧美日韩操逼动图| 亚洲精品免费中文字幕| 少妇熟女视频一区二区三区| 欧美久久九九| 国产三级多多影院2022国产AA一级毛片无码| 久久久女人| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 中文字幕97| 亚洲中文电影| 狠狠五月天| 韩国手机不卡无码三级视频| 偷拍导航视频网站| 久湿久久 | 亚洲AV色图一区| 婷婷伊人| 搡老女人老妇女AAA一VU麻豆 | 五月丁香综合激情| 国产精品女久久久久av爽| 啊啊啊慢点| 国产亚洲色婷婷99精品91| 中文字幕av乱伦| 丁香六月激情| 东京热一区二区中文字幕| 日韩欧美天堂| 懂色av中文字幕| 一道本东京热加勒比一区二区三区| 超碰国产精品久| 日韩中文字墓| A片A5445444| 久久久精精精| 国产suv一区二区三区6| 日本中文字幕熟妇| 蜜屁Av| 国产性感骚丝袜在线| 色婷婷99| 日韩免费看黄片| 亚州一区二区成人片免费| 日日夜夜精品视频| 美女裸体无遮挡永久免费观看网站| 78m成人视线| 九一性生活免费视频| 97人人中文网| 亚熟在线| 无码人妻精品一区二区三区九九| 中美日韩毛片| 天天天乱色综合全| 日韩欧美丝袜诱惑| 国模91| 狠狠干妹子| 先锋音影AV| 熟妇亚洲一区二区三区| 亚洲欧洲美腿丝袜| 91色爽欧美| 这里是精品| 中文字幕精品人妻丝袜| 国产a级精品| 中文久久一区| 激情文学 亚洲图片| 96免费视频在线| 夜夜 中文视频rt| 欧美人妻色| 九九九影院| 天堂伊人久久| 欧美色图在线视频少妇| 乱人乱色一区二区三区免费| 亚洲欧美人妻| 日韩一区二区精彩视频| 高清国产性猛交xxxx乱大交| 六月丁香久久| 久久久久成人蜜桃精品| 天天摸夜夜摸| 日欧毛片久久| 好吊色综合| 日本在线观看网址| 福利在线黄片| 95精品在线| 国产精品网站www| 欧美人妻色| 日日日大屁股骚女人精品| 色偷偷男人的天堂麻豆| 人妻精品视频一区二区三区| 曰韩精品视频一区二区| 熟女一区二区| 亚州精品人妻一二三区| 伊人网青青| 久久久麻豆精品| 花野真衣| 亚洲中文字幕久久无码精品| 日本一级特级毛片视频| 国产欧美精选自拍一区| 九九香蕉网| www老逼91| 精品美女久久一二三| 久久成人东京热人妻| 亚洲欧美首页| 午夜福利精品| 中文字幕精品乱码| 久久在肏| 99热伊人| 亚州欧美一区| 欧美精品成人一区二区在线观看| 天天视频综合在线观看视频| 97在线免费看| 久久久极品| 日韩人妻一区二区| 综合色色婷婷| 亚洲天堂日本| 久久精品一区二区一8| 色色香蕉| 麻豆久久久久久久久丝袜| 夜夜骑日日| 午夜视频黄| 激情av| 亚洲色图第一页| 少妇综合网| 九月丁香婷婷| 国产欧美日产一区二区三区 - 国产欧美日 | 中文字幕第23区| 国产久久久久久| 色官网色综合| 日本 免费 一区二区三区 久久香蕉 | 久久久久久国产精品免费网站| 91欧美高清| 日本精品一区二区三| 国产精品露脸在线观看| 天堂日本亚洲欧美| 中文字幕乱码在线| 亚洲综合97中文网| 精品国产AV一区天美传媒| 岛国片国产成人亚洲播放| 欧美日韩人人早| 97亚洲精品| 五月天综合在线| 久久机热| 色综合久| 亚洲资源站| 自拍鲍鱼一区在线高清观看免费| 黑人精品久久97| 亚洲一区二区三区不卡国产欧美| 久操九九九九九九九九九九九九九九九九九九九九九九九九九九九九 | 97超碰欧美精品| 极品尤物在线观看| 超碰色大香蕉| 天天干2区3区| 91香蕉视频在线观看免费| 九九九综合精品| 亚洲中文字幕熟女| 欧美天天综| 成人免费看吃奶视频网站| 操人妻逼91| 亚洲97成人在线观看| AV老汉| 九九视频黄色片| 狠狠热这里都是精品| 欧美性爱日韩高清| 精品中文一区二区| 狠狠操狠狠爱| 天天视频黄| 97超碰巨乳| 中文字幕aⅴ在线视频| 5252色欧美在线男人的天堂| 成人综合色网| 天天草夜夜草高潮片| 日产成人久久| 国产搭汕a级片| 一二三啪啪专区| 亚洲伊人a线观看视频| 久久99草| 色综合五月天| 国产精品4p在线观看| 天操老女人| 综合欧美日韩在线观看| 26uuu最新| 91精品国产乱码| 日本久久99| 人妻一区二区三区四区视频| 天天内射| 亚洲精品一区二区三区新线路| 尤物视频一区| 九九九国产| 97色色国产视频| 欧美日韩性爱操大逼| 91网站18禁| 色偷偷色偷偷欧美日韩| 激情五月婷婷| 91艹B视频| 骚女天天综合网| 久久人爽| 欧美18禁91| 97干在线| 五月综合婷婷久久网站| 欧美性爱18观看| 精品大全99999| 妇女视频网站| 91 亚洲 欧洲| 人妻熟女av国产网站| 亚洲一区二区三区春色| 欧美激情在线观看视频| 97视频新免费| 后入式在线免费观看60秒| 日本九九九九| 九九香蕉网| 手机在线中文字幕国产| 精品国产Av无码久久久亚洲| 外国91| 97 国产精品| 熟女欧美日韩综合婷婷| 尻女朋友一夜| 熟妇人妻精品一区二区视频色欲| 亚洲色诱惑| 91九色蝌蚪在线观看| 国产精品白丝| 搡老女人老91妇女老熟女| 97超碰伊人| 亚洲综合一| 人人澡综合涩| 亚州中文字幕超碰97| 一区二区三区网站日日骚| 综合激情五月天| www久久99| 秋霞欧美性爰视频| 久久久九九网站| 天天干天天狼在线视频| 亚洲国产麻豆一区二区三区| 欧美日韩国内不卡| 亚洲av影院在线观看| 久久久久久亚洲Av无码精| 人人操人人摸人人看人人插| 操www| 亚洲精品无码成人久久久99| 亚洲日本韩国在线| 夜色五月天| 夂久色| 日韩超碰精品综合| 亚洲欧美不卡线| 色播五月婷婷| 国产怡红院在线| 一级@啪啪视频| 熟女人妻av在线资源,黄色的资源 粉嫩国产精品久久粉嫩 | 婷婷四五区| 久久久亚洲熟妇资源| 色操逼网| 日韩人妻精品| 亚洲一区二区三区不卡国产欧美| 日本三级久| 立川理惠被中出无码| 天天爽爽爽爽| 国产高清自拍视频| 九九热免费在线国产视频伊人五月| 丝袜AV一区二区三区| 欧美v亚洲v日韩v最新在线二区| 色呦呦、国产精品| 亚欧免费| 加勒比海成人视频网| 亚洲97久久精品亚洲| 欧美啪啪色吧在线| 国产AV线| 成人日韩欧美| 久久老熟女| 伊人AAA| 青操影院| 亚洲欧洲综合视频在线| 成人免费性爱视视| surenchaopeng| 91neishe| 国产欧美精选激情视频| 限制级中的三级片中的黑粗大屌屌日人妻熟女| 8050午夜少妇无码| 欧美99999| 欧美性爱网97| 欧美九九爱| 色色网91| 超碰人妻久久| 特色a在线上| 国产不卡片| 国产激情综合五月久久| 凸凹视频在线观看| 自拍偷拍第26| 91视频伊人| 超碰在线91| 久久精品操| www久久精品| 国产精品久久久九九九| 麻豆影音天美视频| 密臀视频一区二区三区| 国产噜噜噜噜噜久久久久久久久| 97人人中文网| 亚洲熟女av日韩熟女| 亚洲性爱无码乱伦av| 久综合网| 欧美中文字幕一区| 裸体美女久久久| 久草精品热视| 九色婷婷| 国产日韩手机视频在线| 中文字幕人妻丝袜乱一区三区| 亚洲人妻久久久| 熟女高潮精品一区二区| 丝袜亚洲综合| 国产在线强奸视频| 色人久久| 中文字幕天天天天天| 蜜桃色院一区久久| 天天看天天日天天操| 男人天堂网址| 免费看国产曰批40分钟怎么下载| 激情看片网站| 亚洲色图加勒比| 精品乱码在线观看| 亚洲黄色| 亚洲AV秘 精品久久老牛影视| 午夜男女爽爽爽在线视频| 7777欧美成是人在线观看| 天综合网| 人乳av| 人人摸人人入| 亚洲国产一区二区三区四区国产| 久操操| 超碰 av 女人天堂| 91精品国产一区三一| wwwxxx日本爽| 无码欧美有限公司| 91老司机精品| 综合操逼| 自拍亚洲综合| 日韩簧片免费看| 先锋精品av色鲁| 97视频免费在线| AV不卡在线| 国产精品九9| 久久久555| 制服乱伦| 大香蕉日韩欧美| 日韩 欧美 视频 在线 一区| 三级片大波波| 91人妻久久久久久久久久久久久| 久久大精品乱码视频人妻熟女| 97精品97久久| 亚洲熟妇乱女区二区三区| 91视频综合网| 亚洲欧洲无码97久久精品| 日韩性爱毛片操骚逼| 试看日韩黄片| 日韩乱码Av| 久久久青青草| yiren97| 成人性爱av.com| 精品美女少妇一区二区| 无码视频一区二区| 人妻少妇一区二区| 日日夜夜国产综合| 国产高清精品一区二区三区毛片| 亚洲AV免费在线| 色综合国产在线观看| 国产精品97超碰| 日韩欧美麻豆大片| 国产丰满少妇久久久精品影院| 免费啪啪啪网站18岁| 少妇贴图| 日日嗨AV一区二区夜夜| 亚洲欧美九九| 99色视频| 99无码精品| 120分钟婬片免费看| 国产精品无码久久久久2025| 久久精品一区二区一8| 男人天堂新| 九九九久久久W精品| 国产精品乱码久久久、久久| 夜草欧美| 欧美日韩天堂| 日韩黄色小说| 久久久久婷婷精品av电影| 成人一区二区三区四区| 精品国产72| 欧美日韩亚洲高清不卡一区二区三区| 美女超碰978| 九九热精品在线| 嫩草 人人网精品| 精品999日本| 国产第二页| 色综九九九一区| 亚洲综合网91| 精品三级在线专区| 91搞逼视频| 天天日B夜夜干B时时操B| 五月婷婷爱六月丁香色| 大香蕉手机视频| 成人日本精品九区| 亚洲九九视频在线观看| 欧美亚洲系列| 1级黄色夫妻对换性交免费看| 一类无码操逼视频| 91操人| 97视频在线观看高清资源| 九九九九97| 黄页av| 欧亚乱色熟女一区二区| www.婷婷五月天| 青春草A| 激情丁香五月婷婷| 99热最新| 激情色播| 国产精品久久久久无码A√| 成人欧美日超碰| 欧美一级A片在线看视频性色| daxiangjiao你懂的| 福利伊人玖玖国产| 色综合一区二区三区| 大香蕉一线视频| 九久久九精品视频| 精品中文字幕一区二区| 神马久久久久久久| 亚洲av综合色| 综合欧美日本三级| 1000部熟女视频在线观看| 久久久久久一日韩字幕无码| 午夜一区| 国产又色又爽又舒服的三级视频| 亚洲精品欧洲精品| 日韩97| 最新中文字幕在线亚洲| 久久免费中文字幕在线观看| 久操视频在线| 亚洲影院成人| 91久久99久久91熟女精品| 久久有码| 免费观看日本操逼视频| 超碰碰碰碰| 欧美日韩人妻精品一区二区三区| 中文字幕美女91| 麻豆 欧美 日韩| 麻豆区久久久久亚| yellow网站免费观看日韩高清无码| 美女啊啊啊啊啊啊啊| 久久久96精品| 99精品视频在线观看免费| av操操不卡| 97欧美| 九九久久综合| 少妇综合网| 亚洲精品日日夜夜52| yazhouzaixian| 热九九精品| 国产中文字幕在线观看| 立川理惠无码一区二区| 亚洲区小说| 日韩精品三级片长长久久| 亚精品无码毛片一区二区三区| 中文字幕一二三区| 岛国精品视频在线观看| 精品亚洲国产成人精品| 欧美人妻精品一区二区| 国产a级午夜毛片| 大香蕉黄色一区| 97香蕉碰碰人妻国产欧美| 中文字幕一区二区韩| 色偷偷超碰亚洲| 亚欧美天堂在线| 亚洲古典另类欧美在线| 男人的天堂 在线一区| 老女人碰碰在线碰碰视频| 影音先锋国产精品| 中文字幕国产| 久久丁香久草综合网| 放黄片放3级黄片没穿衣服| 夜夜 中文视频rt| 欧美一区二区三区黄色影视| 97干日韩| 肥臀熟女一区二区三区视频| 日本蜜桃| www.AV有限公司一区| 亚洲国产第一页综合视频| 凸凹视频在线观看| 亚洲成人av电影在线| 亚洲性爱成人| 人妻一区二区三区四区视频| 欧美日韩久久精品爱爱| 91亚洲丝袜熟女| AV在线播放网址| 色综合1991| 91亚洲最新在线| 夜夜黄| 凹凸 69堂 在线播放| 九九免费影片| 国产丝袜啪啪| 日本影视久久免费| 欧美在线永久天堂| 欧美aa一级片| 操逼逼无码| 色五月激情综合网| 中文字幕精品一区二区精品| 先锋精品av色鲁| 中美日韩毛片| A一级色女| 婷婷色香伊人| 丁香九月 婷婷| 亚洲av乱伦色图网站| 五月天色综合| 97国产天堂岛| 啊啊啊好舒服视频| 欧美亚洲第一页| 久久女人一区二区三区| 久久蜜桃综合网| 亚洲风情综合网| 国产一国产一级毛片古装| 免费观看国产小粉嫩喷水精品午| 伊人久久大香大香线蕉中文| 日本天天操| 中出后入| 国产无码精品无码| 日本三级中国三级99人妇网站| 中文字幕一二三区| com 首页 18岁 禁区 女优 免费 精选 同城 | 免费看黄片现成| 色香色欲天天综合网天天来吧| 青久操| 在线有码中文字幕| 精品9区| 中文字幕av乱伦| 青草地一本线一区二区三区| 99re这里只有精品中心播放| 久久久久久一日韩字幕无码| 男人的天堂日韩| 久久婷五月| 激情五月天中文字幕色| 亚洲欧洲色情高清| 一区二区三区激情在线观看| 97天天| 欧美在线55555| 日韩去日本高清在| 老司机福利青青草| 日本中文字幕一区| 天综合网| 可以在线观看AV的网站| 操人妻视频| 欧美美女后入| 91亚洲人电影| 日本东京热加勒比久久| 欧美性性性| 91天美传媒在线观看| 97av在线视频| 久久五月天婷婷丁香中文字幕| 黑人干亚洲| 欧美熟妇精品黑人巨大一二三区| 日本一级二级三级网站| 亚洲阿v天堂在线| 亚州欧美综合| 97超碰天天爱天天爱| 色综合尤物| 日韩99精品视频综合区| 美欧色综合| 亚洲资源网| 久久欧美1卡2卡3| 五月婷婷激情综合| 3D污黄视频在线观看| 91精片| 理论久久婷婷网8| 亭亭在线资源| 97这里都是精品| 小少妇| 六月激情婷婷| 成年女人黄网站| 国产综合日韩伦理| 夜夜爽夜夜爽| 99夜夜操| 色色97爱| 曰本特级特黄特色黄色A级网站高清在线免费看| 人妻在线臀日韩| 亚洲午夜免费狠狠干| 欧美一区二区亚洲天堂| 伊人久久大香线蕉无码| AV一区观看| a片 xxxx受爽视频| 欧美日韩在线小说 | 亚洲色悠悠久久88| 9久久美女首页| 欧美激情亚洲色图| 小草精彩毛片| 久操99| 大香蕉在线视频15| 国产av尤物| av天堂影视中文在字幕在线中文| 精品人妻美妇91job| 思思性爱| 婷婷深爱五月| 亚洲欧洲国产综合av| 国产极品美女高潮无套在线观看| 免费看黄视频亚洲网站| 懂色av色欲av蜜臀av| 色翁荡息又大又硬又粗又爽| 欧美一区二区日韩三区| 精品久久久久久无码| 大香蕉www.超碰| 人人 操人人 操人人| 高清一区AV无码| 思思热久久成人| 久久久久久久国产a∨| 乱伦Av网| 天欧美在线| 天天操狠狠日夜夜干超大胆开放com大香蕉视频在线观看 | 白丝1区2区3区| 亚洲瓯美色图| 国产第11页| 天天性射网| 色妺妺AⅤ| 国内毛片欧美香蕉精品| 操操逼视频| 综合 欧美 亚洲 日本| 久久欧美性爱视频| 欧美一区91大爱| 91美女视屏| 国产这里只有精品| 欧美高潮| 99久草| 97天堂| 国内毛片无遮挡国产| 免费一级a毛片久久久久久鸭绿欲| 黄色区免费观看中文字幕| 国产视频一区二区免费| 小少妇| 97色妞| 四虎在线视频| 高清国产无码av| 黄在线| 亚洲,欧美,春色,另类| 国产盗摄美女如厕大神作品在线观看| 午夜无码熟妇丰满人妻| 婷婷激情四射| 福利社区午夜一区二区| 久久婷色| 国产熟妇一区二区| 日韩三级av片| 秋霞一级A片黄色视频| 久久激情五月| 色欲人妻一区二区在线| 老熟女综合网| 国产精品区在线12p| 婷婷五月av| 欧美国产一区二区三区麻豆传媒| 欧美在线大香999| 欧美一二三级精品在线| 亚洲成人在线播放| 欧美美女后入| 亚洲欧美日韩免费观看| 日韩一级片在线看| 99xav| 亚州男人天堂| 天天精品| 精品久久大胆人体| 欧美乱伦专区| 91丨九色丨东北熟女| 日韩精品作爱导航| 成人线上超碰| 国产超碰在线| Aa东京男人的天堂| gogogo免费高清看中国国语| 九九热免费国产视频婷婷伊人| 后入福利视频| 精品久久久久久中文字幕三区 | 国产乱弄免费在线视频。| 欧美激情精品| 长长久久88视频| 成人免费福利在线观看| 久久超碰免费的| 亚洲激情视频| 超碰碰碰碰| 超碰久草| 久久久夜夜嗨免费视频| 久久精品中文| 艹精品| 欧美婷婷久久| 国产午夜福利电影免费在线观看| 蜜臀久久99精品久久综合| 亚洲色图欧美色18直播在线| 亚洲色图日韩精品| 超碰免费欧美7| 97人妻免费中文字幕| 伊人亚洲综合| 最近2019中文字幕国语免费版| 无码久| 国产免费操逼| 亚洲人人夜夜澡人人爽| 性影在线视频| 国产外初女出血视频| 婷婷午夜成人色中色| 久久夜夜夜| 嫩草一区二区在线观看| 中文久久96| 久久婷婷综合国际产色怕| 超碰在线成人电影| 婷婷久久大香蕉| 五月天婷婷社区| 人人人人人人少妇| av网站免费看| 色婷婷综合久久中文字幕雪峰| 丰满美女一级毛片在线播放| 成人热久久精品| 欧日a| 欧美日韩小说| 日韩乱码Av| 无遮挡又黄又刺激的视频| 美女裸体麻豆天美蜜桃91| 欧美综合娱乐久久| 国产精品久久久久999| 深田咏美亚洲精品福利社| 96国产精品| 国产精品视频电影| 国产乱伦亚洲| 噜噜瑟| 啪啪91| 日韩国产不卡在线视频| 精品欧美日韩在线观看| av天堂影视中文在字幕在线中文| 老熟妇乱轮| 热热色色综合| 免费夜夜爱黄色视频毛片| 在线视频免费观看午夜| 夜精品久无码| 六月婷婷综合| 91精品微拍福利| 欧中美三级一区二区三区| 欧美日韩国产中文超碰| 人人看欧美性爱| 亚洲图片91| 国产成人AV麻豆| 欧美日韩第一页| 囯产精品久久久久久久久久梁医生| K8久久久久| 亚洲国产熟妇综合色专区| 8050无码八戒| 中国zzijzzijzzwww精品| 天天操狠狠日夜夜干超碰撸com视频在线观看 | 婷婷久草| 少妇国产不卡| 曰韩无码777| 婷婷干黄色| 亚洲 欧美 第一页| 1二区9| 超碰人人乐97| 人人妻人人爽人人精品| 影音综合网| 日本欧美国内在线| 欧美日韩人人早| 91老熟女老女人国产老太| 凌辱美少妇久久aV| 亚洲欧美精品一区天堂久久| 亚洲蜜乳av| 天天射,天天操,天天爽-国内精品一区二区三区-成人AV | 91操人| 国产精品经典一卡久久久 | 中文字幕亚洲欧美在线不卡| 99久久久久| 黄色AAAAA欧美| 日韩欧美性吧婷婷乱伦大香蕉 | 九九无码视频| 很黄很色的视频在线观看| 白丝AV| yazhououmeizongya| 综合欧美日韩在线| 青青草国产亚洲精品久久 | 一区二区乱码福利| 蜜臀99久| 超碰人人干天天射| 亚洲好色人妻| 99在线啪| 久久精品国产精品| 97 视频在线| 欧美色图私拍91| http://qxhbdz.com| 亚洲五月天激情| 操逼日韩无码 | 国产精品自产拍在线观看社区| 久久这里是精品| 国产狂喷潮在线精品| 国产精品自拍视频| 精品国产AV一区天美传媒| 超碰天天去日穴| 欧美成人免费在线观看| 国产福利第一视频| 好吊爽好吊爽在线视频,中文字幕精品一区二区日本,国产良妇出轨视频在线观看, | 人妻酒店出差被中出免费在线播放| 欧美精品成人亚洲| 夜夜操91744565| 天天夜夜rb| 狠狠操使劲操| 超碰97综合在线| 亚洲美女高潮喷水视频| 97精品视频在线播放| 久久精品一区二区三区蜜桃臀| 亚洲综合夜色| 欧美偷偷网| 91大香蕉伊人| 精品美女少妇一区二区| 变态综合色| 亚洲情欲| 日本国产亚洲一区在线观看| 国产成人超碰在线| 日本三级A片网站com| 国产精品呦一区二区三区| 操逼逼中文字幕| 青青草原狼av| 目产99999久久999| 超碰98综合网| 老鸭窝日丰县女人| 欧美桃色网| 超碰在线一区二区| 国产精品嫩草影院午夜两性 | 麻豆啪啪啪视频| 超碰免费在线| 日产国产精品中文久久婷婷| 亚洲和欧美裸体美女双飞视频| 亚州色图片在线色| 超碰九九| 天天日天天干天天操| 久久精品国产亚洲妲己影视| 高清成年美女黄网站免费大全 | 久久久国产精品亚洲精品| 99精品无码| 亚洲高清视频在线免费观看| 一级@啪啪视频| 亚洲综合色婷婷| 内射中出日韩在线观看视频| 青木玲在线不卡| 人妻丝袜二区| 精品人妻1区| 九色视频91| 人妻插插人妻人| 97超碰色中文字幕| 日本精品五区| 久热香蕉精品在线视频| 亚洲熟妇自偷自拍另欧美| 1区2区3区中文字幕日韩| 丝袜加勒比| 草莓精品视频在线免费观看| 综合久| 日韩情色AV| 人爽不卡视频| 福利在线观看一区二区| 好湿好紧好爽 视频| 嫩草 我啊~嗯~在线| 最新日本中文字幕| 国产18精品亚洲精品| 欧美精品久久96人妻无码| 69久久| 欧美一级久久久久久久大片动画| 亚洲 日本 一 二 三| 日本新免费二区三区| 精品一区二区三区丰满熟女-亚洲欧美一区| wwwxxx日本爽| 爽爽歪在线视频| 97久久精品不卡| 大香蕉视频一二三区| 无码又爽又硬又激情免费视频| 日韩不卡网操逼中文字幕日韩| 神马久久午夜| 中文字幕在线免费观看视频| 久久亚洲天天做| 91天堂| 日本三级韩三级99久久| www.男人天堂| 国产精品白丝在线播放| 天天插天天插| 久草综合网| 人妻精品一区二区在线| 久久綜合很很很| 一起草三级AV电影在线观看| 中文字幕成人| 亚洲天堂电影网99999| 国产精品一区二区校花| 69视频福利导航| 欧美日韩在线视频网站| 人妻啊啊人妻啊啊| 九九热只有精品| 亚洲 欧美日韩 另类| 一区二区视频你懂的| 一本色道无码DVD中文字幕| 男人天堂.AB| 亚洲色图91| 91亚洲黑人| 熟妇视频一区二区三区在线| 五月天激情小说| 超碰久超碰久| 九九这里只有精品| 久久久久白虎| 久久久999日本大片| 人妻少妇精品视频一区二区三区| 大香蕉伊人久久| 97亚洲综合在线| 日韩三级一区| 亚洲精品九九九| 97九色人妻| 日本淫乱女一区二区三区视频| 色综合美国| 1769成人国产精品视频| 澳门人妻久久| 无码高清操逼网址| 国产白丝在线| 日本视频一区二区三区| 91伊人久久在线| 第一高清av中文字幕| 亚洲中文sv| 国产亚洲人妻综合日韩 久久| 97爱综合| 天色综合网| 久草免费福利在线播放| 日韩精品资源| 色性综合| 亚洲精品白浆高清久久久久久| 久久最新视频免费观看| 曰本人妻人人澡人人夹| 欧美激情一| 精品一区二区啪啪啪| 中文字幕国产在线天堂| 性色av一区二区| 久久性爱大全| 一本久道久久综合狠狠爱一密臀精| 殴美牲| yellow网站免费观看日韩高清无码| 少妇久久久免费| 99免费视频| 99这里只有精品国产| 中文熟女五十乱码在线| 欧美在线视频99| 秋霞一级鲁丝片A片| 欧亚揄拍偷拍精品视频 | 亚洲九九爱| 99热这里是精品| 成人26uuu| 快播久久人人aV| 欧美激情欧美精品| 久久香蕉国产线看观看猫咪av| 欧美色图 色综合图| 欧美后入视频| 无码又爽又硬又激情免费视频| 欧美不卡在线一区二区| 精品国产三级av韩国在线| 成·人免费午夜在线观看| 亚洲色图 图片| 亚洲精品视频在线| 久久午夜鲁丝片| 99精品无码| 熟女中出视频| 五月天婷婷综合网| 377p欧洲日本亚洲大胆| 中文不卡视频| 亚洲宗合网| 精品无码久久久| 亚洲偷拍自拍在线视频| yw尤物av无码点击进入麻豆| 大色网久久| 欧美91精彩| 热久久精品| 色五月婷婷色| 欧美成人四级在线播放| 亚洲97超碰| 综合情欲网| 精品乱码久久久久| 日本久操视频| 大香蕉综合| 日韩乱中文| 国产9 9在线 | 亚洲| 九九九久久久W精品| 亚洲 综合 第一页| 99热aaa| 久久伊人在线五区| 日韩啪啪啪啪啪| 久久东京国产精品视频| 日韩精品一区二区日韩| 人人爱人人乐人人操| 夜夜嗨一区二区三区直播内容| 熟女露脸激情自拍视频| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 狠狠狠狠狠| 亚洲国产日韩欧美熟妇在线| 金莲网址| 强奸乱伦大香蕉| 操迟操逼在巾线Fre看| 91视频伊人| 青青青国产手线观看视频2| 蜜臀久久99精品久久久电影| 高清无码人妻久久久一区二区三区aⅴ| 久久久精品九| 99在线精品观看视频中文| 亚洲欧美啪啪| 亚洲日韩黑丝| 97超碰国产亚洲精品| 91精品少妇搡搡搡| 黄色av播放免不| 五月天亚洲网| 夜夜高潮夜夜爽国产伦精品| 风月影院男女十八禁| 天天激色| 亚洲91射| 中韩中文字幕在线观看| 骚货操死你| 日本媚薬中文字幕在线| 好吊色在线观看| 人妻丝袜一区二区三区在线| 日韩综合第八区国产精品| 在线观看啊啊啊啊啊| 欧美日韩不卡传媒| 国产成人五月天丁香花| 少妇熟女一区二区三区|