久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

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

Spring Bean生命周期詳解:從BeanDefinition到三級(jí)緩存

Spring Bean生命周期詳解:從BeanDefinition到三級(jí)緩存 “面試官Spring Bean 生命周期詳解”這道題大概是Spring面試中出現(xiàn)頻率最高的前五名。我在幾次技術(shù)招聘里試過(guò)回答基本分成三類(lèi)一類(lèi)是背了流程但順序說(shuō)反一類(lèi)能說(shuō)出實(shí)例化、屬性填充、初始化、銷(xiāo)毀但說(shuō)不清Aware回調(diào)、BeanPostProcessor、InitializingBean這些擴(kuò)展點(diǎn)到底卡在哪一步第三類(lèi)能把這套東西完整講下來(lái)但追到循環(huán)依賴(lài)和三級(jí)緩存就明顯發(fā)虛。這篇文章就是把這道題從“能答”拆到“能講漂亮”。我會(huì)把Bean生命周期的完整節(jié)點(diǎn)、每類(lèi)擴(kuò)展點(diǎn)的設(shè)計(jì)意圖、源碼里的關(guān)鍵路徑還有面試官最可能順藤摸瓜追問(wèn)的三級(jí)緩存原理全部串起來(lái)。適合正在準(zhǔn)備Spring面試的Java開(kāi)發(fā)也適合想真正理解IoC容器工作方式的后端工程師。你完全可以照這個(gè)框架去準(zhǔn)備答完這道題面試官基本不會(huì)再拿“你背過(guò)八股”來(lái)打發(fā)你。1. 先把 Bean 生命周期的全流程跑一遍1.1 從 BeanDefinition 到可用實(shí)例到底經(jīng)歷了什么很多人一上來(lái)就背“實(shí)例化、屬性填充、初始化、銷(xiāo)毀”但漏了最前面的一步Bean進(jìn)入容器管理從BeanDefinition開(kāi)始。Spring容器啟動(dòng)時(shí)先解析XML、注解、JavaConfig等配置信息把它們統(tǒng)一轉(zhuǎn)成BeanDefinition注冊(cè)到BeanFactory的注冊(cè)表里。這一步可理解成“先造好圖紙不急著造產(chǎn)品”。BeanDefinition里面記錄著類(lèi)名、作用域、是否懶加載、初始化方法名、銷(xiāo)毀方法名、依賴(lài)關(guān)系等全部元數(shù)據(jù)。之后所有Bean的創(chuàng)建都是拿著這份圖紙去做的。然后才輪到單個(gè)Bean的創(chuàng)建。在默認(rèn)的ApplicationContext場(chǎng)景下所有非懶加載的單例Bean會(huì)在容器啟動(dòng)階段被批量實(shí)例化也就是refresh()過(guò)程中的finishBeanFactoryInitialization這一步。原型Bean則不著急等每次getBean時(shí)才創(chuàng)建。單個(gè)Bean從創(chuàng)建到銷(xiāo)毀核心流程我習(xí)慣分成十個(gè)節(jié)點(diǎn)實(shí)例化createBeanInstance通過(guò)構(gòu)造器或工廠方法創(chuàng)建對(duì)象此時(shí)對(duì)象剛有內(nèi)存屬性全是默認(rèn)值。合并BeanDefinition并處理注解元數(shù)據(jù)applyMergedBeanDefinitionPostProcessors解析Autowired、Resource、PostConstruct等注解的元數(shù)據(jù)。屬性填充populateBean通過(guò)AutowiredAnnotationBeanPostProcessor等后置處理器完成依賴(lài)注入把Autowired字段、構(gòu)造器參數(shù)、Value配置等賦值進(jìn)去。提前曝光earlySingletonExposure如果是單例且允許循環(huán)引用把ObjectFactory放入三級(jí)緩存。Aware回調(diào)BeanNameAware、BeanClassLoaderAware、BeanFactoryAware由容器直接調(diào)用ApplicationContextAware通過(guò)后置處理器回調(diào)。BeanPostProcessor前置處理postProcessBeforeInitialization被逐個(gè)調(diào)用。自定義初始化實(shí)現(xiàn)了InitializingBean則調(diào)用afterPropertiesSet配置了init-method或Bean(initMethod)則調(diào)用對(duì)應(yīng)方法。BeanPostProcessor后置處理postProcessAfterInitialization被逐個(gè)調(diào)用AOP代理就是在這一步通過(guò)AbstractAutoProxyCreator生成的。使用Bean。容器關(guān)閉時(shí)銷(xiāo)毀PreDestroy、DisposableBean.destroy、destroy-method依次執(zhí)行。注意區(qū)分“實(shí)例化”和“初始化”。實(shí)例化只是new了一個(gè)對(duì)象屬性都還是null真正說(shuō)一個(gè)Bean能干活了要等初始化和屬性填充全部完成。這個(gè)區(qū)分面試時(shí)主動(dòng)說(shuō)出來(lái)就已經(jīng)比一半候選人強(qiáng)了。1.2 一張表看懂各階段的觸發(fā)時(shí)機(jī)與核心機(jī)制把上面對(duì)應(yīng)的機(jī)制和常見(jiàn)實(shí)現(xiàn)整理成一張表方便記憶階段觸發(fā)時(shí)機(jī)核心機(jī)制常見(jiàn)實(shí)現(xiàn)BeanDefinition注冊(cè)容器啟動(dòng)階段配置解析Configuration、ComponentScan實(shí)例化getBean或啟動(dòng)預(yù)實(shí)例化構(gòu)造器/工廠方法new、Scope(prototype)時(shí)按需創(chuàng)建屬性填充實(shí)例化之后、初始化之前BeanPostProcessorAutowired、Resource、Value提前曝光單例創(chuàng)建過(guò)程中三級(jí)緩存循環(huán)依賴(lài)場(chǎng)景用到Aware回調(diào)屬性填充后、初始化前后容器回調(diào)BeanNameAware、ApplicationContextAware初始化屬性填充完成后后置處理器自定義方法PostConstruct、afterPropertiesSet、init-methodAOP代理初始化后BeanPostProcessor動(dòng)態(tài)代理的子類(lèi)化包裝使用初始化完成業(yè)務(wù)調(diào)用—銷(xiāo)毀容器關(guān)閉回調(diào)PreDestroy、DisposableBean、destroy-method這張表最大的價(jià)值是讓你看到Spring的整個(gè)生命周期不是一條“順序調(diào)用”的直線而是圍繞著B(niǎo)eanPostProcessor和容器回調(diào)把多個(gè)機(jī)制拼起來(lái)的。面試時(shí)能畫(huà)出這張表的邏輯就說(shuō)明你不是死記硬背。1.3 BeanFactory 與 ApplicationContext 的生命周期差異很多初學(xué)者不知道上面這套完整流程只有在ApplicationContext包括Spring Boot里的內(nèi)置容器里才會(huì)全量觸發(fā)。如果你用的是最底層的BeanFactory生命周期會(huì)縮水不少。BeanFactory只是最基礎(chǔ)的IoC容器默認(rèn)懶加載Bean默認(rèn)只注冊(cè)少數(shù)內(nèi)置處理器很多擴(kuò)展機(jī)制需要手動(dòng)注冊(cè)。ApplicationContext在BeanFactory之上做了大量增強(qiáng)啟動(dòng)時(shí)預(yù)實(shí)例化單例Bean自動(dòng)注冊(cè)AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、ApplicationContextAwareProcessor等一堆內(nèi)置后置處理器還會(huì)自動(dòng)執(zhí)行BeanFactoryPostProcessor。這個(gè)差異你要能一句話說(shuō)出來(lái)BeanFactory提供的是最小可用的容器能力ApplicationContext提供了企業(yè)級(jí)容器的完整生命周期管理。面試?yán)镒穯?wèn)“你用的BeanFactory還是ApplicationContext”時(shí)能講清這個(gè)區(qū)別會(huì)很加分。2. 擴(kuò)展點(diǎn)為什么設(shè)置這么多拆開(kāi)看設(shè)計(jì)意圖2.1 兩類(lèi) Processor 的角色差異Spring生命周期里最容易搞混的是BeanFactoryPostProcessor和BeanPostProcessor。名字像職責(zé)完全不同。BeanFactoryPostProcessor作用于BeanDefinition階段在所有Bean實(shí)例化之前執(zhí)行你可以修改BeanDefinition本身的屬性、作用域、甚至替換類(lèi)名。最典型的場(chǎng)景就是修改配置類(lèi)中被硬編碼的參數(shù)。舉例來(lái)說(shuō)我曾在不停機(jī)的環(huán)境下用自定義BeanFactoryPostProcessor把某個(gè)第三方依賴(lài)Bean的作用域從singleton改成prototype效果立竿見(jiàn)影。BeanPostProcessor則作用于Bean實(shí)例之后、初始化前后它改的是對(duì)象本身。Autowired注解的解析、AOP代理的生成、PostConstruct方法的調(diào)用全部是通過(guò)各種BeanPostProcessor實(shí)現(xiàn)的。注意BeanFactoryPostProcessor和BeanPostProcessor的執(zhí)行時(shí)機(jī)和對(duì)象模型完全不同一個(gè)是改“圖紙”一個(gè)是改“產(chǎn)品”。面試官很喜歡用這道題來(lái)區(qū)分你是真懂還是背書(shū)這個(gè)區(qū)別自己體會(huì)一下。2.2 Aware 一族讓 Bean 感知容器的時(shí)機(jī)設(shè)計(jì)Aware接口在Spring里是一類(lèi)標(biāo)記接口實(shí)現(xiàn)它的Bean可以從容器中獲取資源。比如BeanNameAware能拿到當(dāng)前Bean在容器中的名字ApplicationContextAware能拿到ApplicationContext對(duì)象。它們的出現(xiàn)是為了解決一個(gè)問(wèn)題Bean明明被容器管理卻不知道容器在哪、自己叫什么。為什么不直接把ApplicationContext注入所有Bean因?yàn)闀?huì)強(qiáng)耦合容器Bean無(wú)法脫離Spring容器使用還會(huì)增加內(nèi)存占用。Aware的設(shè)計(jì)是“按需索取”你實(shí)現(xiàn)了哪個(gè)接口容器才回調(diào)哪個(gè)方法。這跟Autowired自動(dòng)注入風(fēng)格不一樣更像是一種顯式表達(dá)“我需要什么”的聲明。需要注意Aware回調(diào)的時(shí)機(jī)也分兩撥。BeanNameAware、BeanClassLoaderAware、BeanFactoryAware是在initializeBean方法里直接調(diào)用比較早ApplicationContextAware則是通過(guò)ApplicationContextAwareProcessor這個(gè)BeanPostProcessor在postProcessBeforeInitialization階段觸發(fā)稍微靠后一點(diǎn)。在實(shí)際業(yè)務(wù)代碼中我們很少自己實(shí)現(xiàn)ApplicationContextAware因?yàn)镾pring已經(jīng)封裝了ApplicationContextHolder之類(lèi)的工具但作為面試知識(shí)點(diǎn)你得明白它的觸發(fā)原理。2.3 初始化三件套的優(yōu)先級(jí)PostConstruct、afterPropertiesSet、init-method同一個(gè)Bean身上可以同時(shí)用三種方式定義初始化邏輯PostConstruct注解、實(shí)現(xiàn)InitializingBean接口、配置init-method屬性。它們的執(zhí)行順序基本固定PostConstruct先執(zhí)行然后afterPropertiesSet最后init-method。原因也很直接PostConstruct不是Spring自己的注解而是JSR-250標(biāo)準(zhǔn)注解Spring通過(guò)CommonAnnotationBeanPostProcessor把它掛在postProcessBeforeInitialization階段觸發(fā)所以在標(biāo)準(zhǔn)初始化方法之前天然先執(zhí)行。InitializingBean的afterPropertiesSet在Spring源碼里直接調(diào)用init-method是最后定義的兜底方案因此排在最后。如果配置類(lèi)里有這樣一段代碼可以眼見(jiàn)為實(shí)Component public class InitOrderBean implements InitializingBean { PostConstruct public void postConstruct() { System.out.println(1. PostConstruct); } Override public void afterPropertiesSet() { System.out.println(2. InitializingBean.afterPropertiesSet); } BeanInitMethod public void customInit() { System.out.println(3. init-method); } }運(yùn)行后輸出順序就是1、2、3。銷(xiāo)毀階段順序也類(lèi)似PreDestroy先執(zhí)行接著DisposableBean.destroy最后destroy-method。這個(gè)優(yōu)先級(jí)問(wèn)題面試出現(xiàn)的頻率很高強(qiáng)烈建議你親手寫(xiě)一個(gè)Bean跑一遍。真跑一次比背十次都牢。3. 源碼脈絡(luò)從 refresh 到 initializeBean3.1 refresh() 里 Bean 是如何被批量創(chuàng)建的要深入理解生命周期繞不開(kāi)AbstractApplicationContext.refresh()。這是Spring容器的啟動(dòng)入口我們平時(shí)說(shuō)的“容器啟動(dòng)”其實(shí)就是執(zhí)行了refresh()。這個(gè)方法里面有幾個(gè)關(guān)鍵步驟和Bean生命周期直接掛鉤invokeBeanFactoryPostProcessors(beanFactory)執(zhí)行BeanFactoryPostProcessor包括處理Configuration、ComponentScan的ConfigurationClassPostProcessor就是在這步工作的。它是生命周期最靠前的擴(kuò)展點(diǎn)。registerBeanPostProcessors(beanFactory)注冊(cè)各種BeanPostProcessor。注意這里只是注冊(cè)不執(zhí)行執(zhí)行要等Bean實(shí)例化之后。finishBeanFactoryInitialization(beanFactory)實(shí)例化所有非懶加載單例Bean。這一步是單個(gè)Bean生命周期的真正起點(diǎn)。Override public void refresh() throws BeansException, IllegalStateException { synchronized (this.startupShutdownMonitor) { // 準(zhǔn)備刷新設(shè)置啟動(dòng)時(shí)間、活躍標(biāo)志等 prepareRefresh(); // 創(chuàng)建或獲取 BeanFactory ConfigurableListableBeanFactory beanFactory obtainFreshBeanFactory(); // 準(zhǔn)備BeanFactory設(shè)置類(lèi)加載器、表達(dá)式解析器等 prepareBeanFactory(beanFactory); // ... 模板方法子類(lèi)可擴(kuò)展 // 執(zhí)行BeanFactoryPostProcessor invokeBeanFactoryPostProcessors(beanFactory); // 注冊(cè)BeanPostProcessor registerBeanPostProcessors(beanFactory); // 初始化消息源、事件廣播器等 // ... // 實(shí)例化所有非懶加載單例Bean finishBeanFactoryInitialization(beanFactory); // 完成刷新發(fā)布事件 finishRefresh(); } }面試時(shí)不要求背源碼能說(shuō)出refresh()里“先處理BeanFactoryPostProcessor、再注冊(cè)BeanPostProcessor、最后實(shí)例化所有單例Bean”這個(gè)順序就已經(jīng)把生命周期前半場(chǎng)的上下文說(shuō)清楚了。3.2 doCreateBean從實(shí)例化到提前曝光的完整步驟單個(gè)Bean的創(chuàng)建核心邏輯在AbstractAutowireCapableBeanFactory.doCreateBean方法里。這個(gè)方法每一步都有對(duì)應(yīng)的外部擴(kuò)展點(diǎn)可以說(shuō)是Spring生命周期的“五臟六腑”。protected Object doCreateBean(String beanName, RootBeanDefinition mbd, Object[] args) { BeanWrapper instanceWrapper null; if (mbd.isSingleton()) { instanceWrapper this.factoryBeanInstanceCache.remove(beanName); } if (instanceWrapper null) { // 1. 實(shí)例化Bean instanceWrapper createBeanInstance(beanName, mbd, args); } Object bean instanceWrapper.getWrappedInstance(); // 2. 提前曝光單例且允許循環(huán)引用時(shí)把ObjectFactory放入三級(jí)緩存 boolean earlySingletonExposure (mbd.isSingleton() this.allowCircularReferences isSingletonCurrentlyInCreation(beanName)); if (earlySingletonExposure) { addSingletonFactory(beanName, new ObjectFactoryObject() { Override public Object getObject() throws BeansException { return getEarlyBeanReference(beanName, mbd, bean); } }); } Object exposedObject bean; try { // 3. 屬性填充 populateBean(beanName, mbd, instanceWrapper); // 4. 初始化 exposedObject initializeBean(beanName, exposedObject, mbd); } catch (Throwable ex) { // ... } return exposedObject; }注意第2步的提前曝光這是循環(huán)依賴(lài)能成立的基礎(chǔ)但也是很多人在面試中講不出所以然的點(diǎn)。它并沒(méi)有把Bean本身放到緩存而是放了一個(gè)ObjectFactory真正被別人引用時(shí)才調(diào)用getObject()生成“早期引用”。這個(gè)設(shè)計(jì)在后面講三級(jí)緩存時(shí)會(huì)展開(kāi)。3.3 initializeBean 中的四步調(diào)用鏈initializeBean是單個(gè)Bean生命周期的“核心調(diào)度室”它把Aware回調(diào)、前置處理、初始化方法、后置處理串在一起protected Object initializeBean(String beanName, Object bean, RootBeanDefinition mbd) { // 1. 直接回調(diào)BeanNameAware、BeanClassLoaderAware、BeanFactoryAware invokeAwareMethods(beanName, bean); // 2. BeanPostProcessor前置處理PostConstruct等方法在這里觸發(fā) Object wrappedBean bean; if (mbd null || !mbd.isSynthetic()) { wrappedBean applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName); } // 3. 初始化方法InitializingBean.afterPropertiesSet init-method try { invokeInitMethods(beanName, wrappedBean, mbd); } catch (Throwable ex) { throw new BeanCreationException(...); } // 4. BeanPostProcessor后置處理AOP代理在這里生成 if (mbd null || !mbd.isSynthetic()) { wrappedBean applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName); } return wrappedBean; }這一步最關(guān)鍵的是理解調(diào)用順序前置處理在初始化方法之前后置處理在初始化方法之后。AOP代理是在第4步生成的所以如果你在before階段拿到的還是原始對(duì)象在after階段拿到的才可能是代理對(duì)象。很多自定義BeanPostProcessor的代碼里就會(huì)刻意利用這個(gè)時(shí)機(jī)差。4. 生命周期里最大的暗礁循環(huán)依賴(lài)與三級(jí)緩存4.1 循環(huán)依賴(lài)到底卡在哪個(gè)環(huán)節(jié)假如有兩個(gè)BeanA依賴(lài)BB依賴(lài)AA和B互相引用對(duì)方。Spring能創(chuàng)建出A和B嗎答案取決于注入方式。如果是構(gòu)造器注入Spring會(huì)直接拋異常無(wú)法解決如果是setter注入或字段注入Autowired就是在屬性填充階段工作Spring就能通過(guò)三級(jí)緩存把循環(huán)依賴(lài)破掉。為什么構(gòu)造器注入不行因?yàn)锳的構(gòu)造器執(zhí)行時(shí)需要B已經(jīng)存在可此時(shí)B還沒(méi)創(chuàng)建Spring根本拿不到B對(duì)象而A本身也還沒(méi)完成實(shí)例化沒(méi)法提前暴露任何東西。形象點(diǎn)說(shuō)這就好比“你還沒(méi)出生就要先見(jiàn)到一個(gè)需要你出生之后才能見(jiàn)到的人”。setter和字段注入就沒(méi)這個(gè)問(wèn)題它們發(fā)生在populateBean階段此時(shí)A已經(jīng)實(shí)例化完成并且已經(jīng)把ObjectFactory放進(jìn)了三級(jí)緩存。B在創(chuàng)建過(guò)程中需要A時(shí)就能通過(guò)三級(jí)緩存拿回A的早期引用不管A還沒(méi)填充完屬性先把引用用起來(lái)。4.2 三級(jí)緩存解決的是什么問(wèn)題三級(jí)緩存存在于DefaultSingletonBeanRegistry里實(shí)際上就是三個(gè)Map// 一級(jí)緩存最終成品完整的單例Bean MapString, Object singletonObjects new ConcurrentHashMap(256); // 二級(jí)緩存提前曝光的早期引用半成品Bean MapString, Object earlySingletonObjects new ConcurrentHashMap(16); // 三級(jí)緩存可以工廠式生成早期引用的ObjectFactory MapString, ObjectFactory? singletonFactories new HashMap(16);用A和B互相依賴(lài)的場(chǎng)景推演一遍創(chuàng)建AgetSingleton(A)未命中創(chuàng)建A實(shí)例此時(shí)A屬性還是空的。調(diào)用addSingletonFactory把A的ObjectFactory存入三級(jí)緩存。populateBean(A)發(fā)現(xiàn)A依賴(lài)B于是getSingleton(B)創(chuàng)建B實(shí)例B也執(zhí)行addSingletonFactory把B的ObjectFactory存入三級(jí)緩存。populateBean(B)發(fā)現(xiàn)B依賴(lài)A于是getSingleton(A, true)此時(shí)allowEarlyReferencetrue一級(jí)緩存沒(méi)有A二級(jí)緩存沒(méi)有A就從三級(jí)緩存找到A的ObjectFactory調(diào)用getObject()得到早期引用A把早期引用A放入二級(jí)緩存并從三級(jí)緩存刪除然后返回給BB把A注入成功。B完成屬性填充和初始化把完整B放入一級(jí)緩存。A繼續(xù)populateBean拿到B完成填充和初始化把完整A放入一級(jí)緩存。這個(gè)過(guò)程中最關(guān)鍵的是第6步從三級(jí)緩存返回的“早期引用”是一個(gè)還沒(méi)完成初始化的半成品。B拿到這個(gè)半成品去填充屬性沒(méi)問(wèn)題因?yàn)锽只是持有引用并不要求A在那一刻已經(jīng)完全可用。對(duì)應(yīng)源碼里getSingleton的核心邏輯protected Object getSingleton(String beanName, boolean allowEarlyReference) { Object singletonObject this.singletonObjects.get(beanName); if (singletonObject null isSingletonCurrentlyInCreation(beanName)) { singletonObject this.earlySingletonObjects.get(beanName); if (singletonObject null allowEarlyReference) { synchronized (this.singletonObjects) { singletonObject this.singletonObjects.get(beanName); if (singletonObject null) { singletonObject this.earlySingletonObjects.get(beanName); if (singletonObject null) { ObjectFactory? singletonFactory this.singletonFactories.get(beanName); if (singletonFactory ! null) { singletonObject singletonFactory.getObject(); this.earlySingletonObjects.put(beanName, singletonObject); this.singletonFactories.remove(beanName); } } } } } } return singletonObject; }注意這個(gè)方法里加了一個(gè)synchronized鎖因?yàn)槿?jí)緩存里的singletonFactories不是線程安全的HashMap必須在并發(fā)環(huán)境下鎖住操作。細(xì)節(jié)雖小但面試時(shí)能說(shuō)出來(lái)會(huì)顯得你真的讀過(guò)源碼。4.3 為什么是三級(jí)緩存而不是二級(jí)或一級(jí)這個(gè)問(wèn)題幾乎每逢追問(wèn)必考。我的回答思路分三層。第一層一級(jí)緩存不可能一級(jí)緩存存放的必須是完整可用的單例Bean。早期引用是一個(gè)屬性還沒(méi)填充完的半成品放到一級(jí)緩存等于把一個(gè)殘次品對(duì)外開(kāi)放別的地方拿到的就是錯(cuò)誤數(shù)據(jù)。第二層二級(jí)緩存為什么不夠如果只有二級(jí)緩存意味著在無(wú)循環(huán)依賴(lài)的普通場(chǎng)景里所有單例Bean也必須提前放進(jìn)二級(jí)緩存。那Spring就不得不對(duì)每個(gè)Bean在提前曝光時(shí)都嘗試做AOP代理。這個(gè)行為會(huì)改變AOP的默認(rèn)觸發(fā)時(shí)機(jī)很可能造成代理重復(fù)、代理失效、無(wú)辜對(duì)象被包裝等一堆問(wèn)題。第三層三級(jí)緩存的意義在于“延遲決策”三級(jí)緩存里存的不是Bean而是ObjectFactory。Spring并不知道一個(gè)Bean到底需不需要AOP代理它知道這個(gè)決策要等到真正有人引用它時(shí)才能做。只有在發(fā)生循環(huán)依賴(lài)、提前引用被觸發(fā)的那一刻才調(diào)用getEarlyBeanReference去生成可能被代理過(guò)的早期引用。這個(gè)設(shè)計(jì)既解決了循環(huán)依賴(lài)又保證了AOP代理的正確性。用一句話概括三級(jí)緩存是為了同時(shí)滿足“解決循環(huán)依賴(lài)”和“保持AOP代理時(shí)機(jī)不被打亂”兩個(gè)要求Spring在注冊(cè)表設(shè)計(jì)上給出的最優(yōu)雅方案。這里還要提一個(gè)關(guān)鍵點(diǎn)如果Bean方法上配置了事務(wù)切面、自定義切面等AOP配置在提前曝光階段就會(huì)通過(guò)AbstractAutoProxyCreator生成代理。所以你在開(kāi)發(fā)中看到循環(huán)依賴(lài)的Bean拿到的很可能是一個(gè)“長(zhǎng)得像A”的代理對(duì)象而不是A自己的實(shí)例。5. 面試怎么把這道題講漂亮應(yīng)答框架與追問(wèn)庫(kù)5.1 3到5分鐘的應(yīng)答框架如果你面試時(shí)碰到這道題我建議按“總分總”的方式組織回答控制時(shí)長(zhǎng)在3到5分鐘。先給一句話總覽Bean生命周期可以分成實(shí)例化、屬性填充、初始化、使用、銷(xiāo)毀五個(gè)大階段Spring通過(guò)BeanPostProcessor和各類(lèi)回調(diào)接口把擴(kuò)展點(diǎn)嵌入其中。然后快速過(guò)節(jié)點(diǎn)不要卡頓。從createBeanInstance開(kāi)始一句“屬性填充階段通過(guò)populateBean完成依賴(lài)注入”一句“初始化階段先回調(diào)Aware再走Before后置處理器然后調(diào)InitializingBean最后走After后置處理器”再補(bǔ)一句“AOP代理就是在After后置處理器里通過(guò)AbstractAutoProxyCreator生成的”這時(shí)候面試官眼神已經(jīng)不一樣了。接著主動(dòng)拋出亮點(diǎn)如果讓我補(bǔ)充一個(gè)實(shí)踐點(diǎn)我會(huì)說(shuō)Spring為單例Bean提供了三級(jí)緩存用來(lái)解決循環(huán)依賴(lài)核心是ObjectFactory的延遲決策。最后做個(gè)簡(jiǎn)短收束整個(gè)設(shè)計(jì)本質(zhì)上就是模板方法模式每種擴(kuò)展點(diǎn)都對(duì)應(yīng)一個(gè)特定階段給業(yè)務(wù)留下充分的可定制空間。5.2 高頻追問(wèn)與參考思路追問(wèn)參考思路BeanPostProcessor和BeanFactoryPostProcessor區(qū)別前者改實(shí)例后者改BeanDefinition前者執(zhí)行在實(shí)例化之后后者執(zhí)行在實(shí)例化之前。三級(jí)緩存為什么用ObjectFactory延遲決策代理的產(chǎn)生時(shí)機(jī)保證無(wú)循環(huán)依賴(lài)時(shí)AOP照常有循環(huán)依賴(lài)時(shí)提前生成代理。PostConstruct、afterPropertiesSet、init-method執(zhí)行順序依次執(zhí)行因?yàn)镻ostConstruct掛在postProcessBeforeInitialization上。prototype的Bean會(huì)走完整銷(xiāo)毀回調(diào)嗎不會(huì)Spring不管理prototype的銷(xiāo)毀回調(diào)除非自定義DestructionAwareBeanPostProcessor。構(gòu)造器注入的循環(huán)依賴(lài)為什么不行實(shí)例化前需要參數(shù)此時(shí)還沒(méi)有提前曝光對(duì)象三級(jí)緩存幫不上忙。什么時(shí)候會(huì)觸發(fā)Bean提前曝光單例、允許循環(huán)引用、isSingletonCurrentlyInCreation為true時(shí)。Autowired在哪個(gè)階段生效屬性填充階段通過(guò)AutowiredAnnotationBeanPostProcessor。銷(xiāo)毀回調(diào)順序PreDestroy - DisposableBean.destroy - destroy-method。每個(gè)追問(wèn)的回答后面如果能跟上“為什么”或“源碼里怎么體現(xiàn)”這個(gè)印象分就拿到手了。5.3 容易說(shuō)錯(cuò)的幾個(gè)細(xì)節(jié)我面試時(shí)聽(tīng)到過(guò)很多“差一點(diǎn)但就是不對(duì)”的回答集中在這幾個(gè)細(xì)節(jié)上。第一把PostConstruct說(shuō)成在afterPropertiesSet之后執(zhí)行。前面已經(jīng)說(shuō)過(guò)它是通過(guò)postProcessBeforeInitialization觸發(fā)的所以最先執(zhí)行。第二說(shuō)Bean創(chuàng)建完就立即銷(xiāo)毀。銷(xiāo)毀只有在ApplicationContext關(guān)閉close方法時(shí)才會(huì)觸發(fā)正常運(yùn)行時(shí)Bean常駐容器常駐內(nèi)存不存在創(chuàng)建完就銷(xiāo)毀。第三把BeanPostProcessor的兩個(gè)方法都放在初始化之后。postProcessBeforeInitialization在初始化之前postProcessAfterInitialization在初始化之后這個(gè)先后關(guān)系涉及AOP和Aware回調(diào)說(shuō)錯(cuò)了很致命。第四以為二級(jí)緩存只放AOP代理對(duì)象。實(shí)際上二級(jí)緩存放的是所有被提前引用的半成品Bean只不過(guò)如果Bean需要代理這個(gè)引用是代理對(duì)象。第五說(shuō)“BeanFactory和ApplicationContext生命周期完全一樣”。這個(gè)差異前面章節(jié)講了健忘的話現(xiàn)在翻回去再看一遍。6. 實(shí)戰(zhàn)排查生命周期相關(guān)的坑與埋點(diǎn)技巧6.1 PostConstruct 不執(zhí)行先查這四件事實(shí)際開(kāi)發(fā)中很多人遇到的最詭異問(wèn)題就是“為什么我的PostConstruct方法沒(méi)跑”。排查順序建議從外到內(nèi)。第一依賴(lài)包是否齊全。Spring 5.3.x之前用的是javax.annotationSpring 6.x之后遷移到j(luò)akarta.annotation如果包沒(méi)引或者引錯(cuò)注解根本不會(huì)被識(shí)別。第二使用XML配置時(shí)是否注冊(cè)了CommonAnnotationBeanPostProcessor。用注解驅(qū)動(dòng)開(kāi)發(fā)時(shí)Spring會(huì)自動(dòng)注冊(cè)但是老項(xiàng)目里手工配置BeanFactory時(shí)這步可能被漏掉。第三方法簽名是不是寫(xiě)錯(cuò)了。PostConstruct要求方法無(wú)參數(shù)、非靜態(tài)、無(wú)返回值如果方法帶參數(shù)或者返回了非void在CDI規(guī)范下該方法是無(wú)效的。第四Bean是否真的被容器管理。如果通過(guò)new的方式創(chuàng)建對(duì)象那Bean生命周期自然不生效注解也不會(huì)有任何反應(yīng)。這類(lèi)問(wèn)題在工具類(lèi)中特別常見(jiàn)。6.2 初始化順序錯(cuò)亂與“不可預(yù)測(cè)”的列表Spring對(duì)多個(gè)Bean之間的初始化順序默認(rèn)不保證。如果業(yè)務(wù)邏輯依賴(lài)某個(gè)Bean先初始化必須顯式聲明依賴(lài)關(guān)系。常見(jiàn)的控制方式有四種DependsOn注解指定被依賴(lài)Bean先初始化Order注解控制同一類(lèi)型組件的加載順序?qū)崿F(xiàn)PriorityOrdered接口在BeanFactoryPostProcessor中直接排序。最推薦的是DependsOn它表達(dá)的是“依賴(lài)關(guān)系”而不僅是“先后順序”語(yǔ)義更清晰。我曾在一個(gè)微服務(wù)項(xiàng)目里遇到過(guò)啟動(dòng)時(shí)初始化順序錯(cuò)亂導(dǎo)致監(jiān)聽(tīng)器重復(fù)注冊(cè)的問(wèn)題。排查后確認(rèn)是多個(gè)Runner沒(méi)有控制先后順序后來(lái)統(tǒng)一改成DependsOn加Order雙管齊下問(wèn)題解決。順帶提一句不要在初始化方法里做長(zhǎng)耗時(shí)或需要外部依賴(lài)的操作這會(huì)讓Spring Boot的啟動(dòng)時(shí)間直線上升而且很容易掩蓋真實(shí)依賴(lài)順序的問(wèn)題。6.3 讓生命周期為我所用埋點(diǎn)觀測(cè)的真實(shí)案例如果你想知道每個(gè)Bean初始化耗時(shí)多少完全不用上復(fù)雜的監(jiān)控工具寫(xiě)一個(gè)BeanPostProcessor就能搞定。Component public class LifecycleLogBeanPostProcessor implements BeanPostProcessor { private final MapString, Long startTimeMap new ConcurrentHashMap(); Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { startTimeMap.put(beanName, System.currentTimeMillis()); return bean; } Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { Long start startTimeMap.get(beanName); if (start ! null) { long cost System.currentTimeMillis() - start; System.out.println(Bean [ beanName ] 初始化耗時(shí): cost ms); startTimeMap.remove(beanName); } return bean; } }這段代碼會(huì)把所有Bean的初始化耗時(shí)輸出到控制臺(tái)。排查啟動(dòng)慢問(wèn)題時(shí)它就是一把快速定位的尺子。還有一類(lèi)場(chǎng)景在生命周期里特別容易踩雷在DisposableBean的destroy方法里訪問(wèn)其他Bean。銷(xiāo)毀階段不是按創(chuàng)建的反序執(zhí)行的Spring只保證同一個(gè)Bean內(nèi)部回調(diào)順序不保證Bean之間的銷(xiāo)毀順序。如果你的銷(xiāo)毀邏輯依賴(lài)另一個(gè)Bean很可能已經(jīng)拿到一個(gè)正在銷(xiāo)毀中的對(duì)象。我的建議是銷(xiāo)毀邏輯里只做最低限度的清理工作不要把業(yè)務(wù)補(bǔ)償邏輯放在這里。按我的經(jīng)驗(yàn)來(lái)說(shuō)這道題很多人答不好不是不知道流程而是不理解“為什么Spring要設(shè)置這么多擴(kuò)展點(diǎn)”。你準(zhǔn)備的時(shí)候別死背順序而是把Spring想解決的問(wèn)題——對(duì)象創(chuàng)建、依賴(lài)裝配、擴(kuò)展定制、代理增強(qiáng)、銷(xiāo)毀清理——按問(wèn)題去記面試時(shí)從問(wèn)題講機(jī)制給面試官的感覺(jué)就完全是另一個(gè)層次。最后再分享一個(gè)小技巧。準(zhǔn)備這道題時(shí)自己開(kāi)一個(gè)Spring Boot工程定義兩個(gè)互相依賴(lài)的Bean分別實(shí)現(xiàn)InitializingBean、PostConstruct、各寫(xiě)Aware接口再加一個(gè)自定義BeanPostProcessor全項(xiàng)目打上日志。跑一遍你會(huì)看到所有回調(diào)的觸發(fā)順序和對(duì)象狀態(tài)。親手觀察一遍比背十遍八股都牢。等你能解釋為什么需要三級(jí)緩存的時(shí)候你已經(jīng)不只是會(huì)背八股的人而是真正理解IoC容器的那個(gè)人。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
性色av婷婷久久一区二区点复制| 夜夜爽夜夜高潮夜夜爽| 日本中文字幕不卡视频| 一区二区你上我| 人妻色情天天操| 中国大陆国产高清AⅤ毛片| 性色中出| 桃花色综合影院| 蜜臀亚洲中文| 午夜福利1区2区3区| 一区二区日韩欧美久久| 欧美一级久久久久久久大片动画 | 国产乱子伦久久精品综合一区二区三| 乱人伦 国语对白:视频直接看| 九99久久| 亚洲欧洲国产综合av| 久久高清无码夜夜操| 91人妻最真实刺激绿帽| 日本99一区二区| 中文精品一区二去| 噜噜噜亚洲精| 色久综合| 欧美精品23| 91国产美女丝袜足交精品视频| 超碰精品日韩欧美国产| 日日干夜夜操视频h| 日本一区不卡| 欧美大香蕉97| 久久国内| 日韩精品 欧美激情| 熟女视频久久| 综合亚洲欧美精品日韩?v| 一区二区三区国产精产| 国产高清26uuu| 久久99草| 五月丁香啪啪| 91色人妻| 97天天插| 日韩专区数据列表-第3230页-精品国产一区二区三区香蕉 久久99熟女人妻中文字 | 97精品视频在线播放| 亚洲成a人片在线观看中文!!!| 天天看高清麻豆| 国产精品久久久久久 百度| 操91| 97超碰碰碰| 欧美情色贴图| 乱伦熟女区| 日骚逼视频| 成人网欧美风情| 日韩精品中文字幕一| 久久精品女同亚洲女同13| 欧美久热| 中日韩欧美精品无码AⅤ一区二区| 亚洲激情欧美色图| 国产天美传媒精品| 婷婷五月天AV| 一区二区三区黄色片a| 亚洲精品国产熟女久久久| 1024人妻| 久久久一区二区三区三州| 免费97视频| 少妇二级| 国产欧美亚洲精品a第2页| 一区二区三区高清| 中文字幕一品色图| 北野未奈加勒比av| 亚洲欧美九九| 国产av美女被艹的乱叫| 3D污黄视频在线观看| 国产9区| 欧美中文狠| 色色婷婷五月天| 国产对白刺激视频| 天堂无码| 91A欧美电影网站| 成熟熟女国产精品一区二区| 久9久9精品| 久草婷婷| 久久草在线综合视频| 一区二区三区亚洲| 国产精品久久久久久久无码AV| 手机av亚洲丝袜美腿日韩第一页二页| 97视频7| 欧美亚男人的天堂| 91欧美| 人妻中文字幕日韩电影| 国产91av在线播放| 一区二区三区免费视频入口| 日韩成人精品| 国产精品分类在线观看| 加勒比综合| 久久精品无码专区| 日韩少妇无码| 天天做天天爱| 麻豆成人AV| 欧美久久人体| 久久久久久免费电影| 欧美 亚洲 综合 制服 另类| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 国产青视频| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 草伊人高潮喷水超碰| 国产亚洲色婷婷久久99精品91| 亚洲 国产 精品一区| 26UUU欧美激情一区二区| 91色图| 九九九九九九九九九国产精品| 欧美爱国产综合、| 天天夜夜rb| 国产AB视频| 日韩精品人妻中文字幕不卡乱码| 蜜臀99久久精品| 啊啊啊轻点在线观看| 天堂精品| 久久久91| 插入逼91| www…国产操逼| 91操人视频| 爽爽淫人网| 日韩国语字幕| 亚洲一二三| 国产后入清纯| 欧美日韩1234| 麻豆啪啪啪视频| 大香网伊人久久综合| 97人人干| 欧美高潮在线| 人人操人人肉久久精品| 日韩三级伊人| 午夜黄色免费在线观看| 亚洲 欧美 中文 日韩超碰| 亚洲中文字幕有码视频一区二区三区| 99精品伊人| 99re6在线视频精品免费完整版安卓版| 久久色AV线| 肥佬影院91| 日韩三级伊人| 亚洲 日韩 丝袜 熟女 变态| 另类在线| 国产成人主播| 日韩内| 亚洲日韩av专区无码| 国产一区二区在线播放量| 人人摸.人人色| 国产成人免费观看在线视频| 日本久久久久久久久| 欧美性,色九九| 久久久久久久六六| 免费AV中文网在线观看| 婷婷综合网站| 久久久∴| 我要色综合网| α√在线| 美美91成人国产精品欧美精品久久久久久久| 久久99草| 蜜臀久久99精品久久久久| 国产综合网站在线播放| 日韩av色图| 狠狠超| 韩日性爱av| 日本久操视频| 亚春色色| 巨爆乳一区二区爆乳区| 亚洲情色1区| 99日视频在线免费| 国产精品制服丝袜清纯唯美| 99re6久热只有精品6在线直播 | 天天日天天舔天天喷天天射| jiujiujiujingpin| 囯产精品久久久久久久久久梁医生| 国产欧美岛国精品一区| 欧美性色综合网| 欧美性暴力| 精品伊人久久久大香线蕉小说| 96AV久久久| 亚91网| 国产吞精a级片激情电影| 成人日韩中文字幕| 日韩性爱人人爱人人操| 青娱乐大香蕉| 熟女五十路一区二区三| 久久久久久久久久久久黄色 | 操一对老熟妇爽上天视频| 日韩人妻一二三区视频| 老司机免费视频在线91| 中国操逼无码| 淫色网综合| 91国模| 色五月丁香五月| 成人久久久精品| 色欲无码人妻日韩欧美精品| 神马久久久久久久久久久久| 98人妻精品一区二区色欲| 日韩精品99999| 干B网| 最近的最新的中文字幕视频| 国产女主播视频在线观看| 天天色天天干天天爱| 偷窥自拍亚洲色图| 人人模人人看| 亚洲日韩青青草色月| 日本一区二区中文字幕久久| 久操99| 亚洲图片欧美色| 免费视频无码| 东京热双插| 色嘟嘟人妻天堂网| 一级性爱视频免费观看 | 亚洲αv一区二区三区| 亚码人妻| 成人免费在线网站| 91综合无码| 国产刺激视频| 欧美精品23| 天天操天天谢| 欧美激情黑人| 插欧洲美女欧美精品| 日日躁天天躁狠狠躁| 免费视频a级毛片免费视频| 亚洲第一页综合在线| 婷婷综合五月天| 日韩无限资源| 天堂伊人久久| 九九在线精品| 男女做爰猛烈动高潮A片免费应用| 色月天AV导航| 人人摸人人添人人操| 婷婷精品久久av影视| 97色婷婷| 国产Av超碰| 蜜桃狠狠色伊人亚洲综合| 久热大香蕉| 翔田千里A片一区二区| 在线视频五十市| 久久精品国产亚洲AV无码电影| 成年在线视频日本亚洲在线视频区精品江靖宇公司 | 久久精品日韩| 亚洲欧美洲综合| 99re6国产精品99re在线| 免费自拍三级综合| 97超碰9| 97爱欧美| 久碰视频| 人干人人人操人人摸| 超碰超碰超碰超碰的大鸡吧操黑丝袜 | 日本女人操逼| 久操97| 国产精品天干天干综合网麻豆| 人人摸人人干人人拍97| 富女玩鸭子一级毛片| 偷拍片久久| 啊啊啊 在线观看| 少妇啪啪自拍| 九九九九热| 最新av在线| 精品久久久久,69国产成人精| 一级片在线观看高清无码| 一本大道久| 色诱中文字幕| 一及黄久一点| 超碰在线人妻不卡| 精爱久久| 久久综合18p| 另类小说五月天| 欧美伊人久久综合网| 伊色久人大在线| 91丨精品丨国产丨丝袜| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师 | 国产精品一区二区a| 欧美色91| 97爱啪| 欧美视频激情久久久久久| 天天看少妇| 成人在线日韩| www.五月天| 亚洲欧洲日韩国产自在线| 国产狂喷潮在线精品| 不卡日本一区二区| 97在线观看| 97欧美日韩综合| 一本大道久| 大香蕉伊然在亚洲91| 久久精品一区| 色盈盈影院| 日韩无码嘿咻黑热久| 日本午夜精品理论片A级APP发布| 国产精品免费日韩| 夜嗨影院| 囯产乱伦一区二区三女 | 亚洲国产成人精品999| 天堂成人网| 一本大道青青| AV有码在线| 色五月av| 淫荡网址| 一级做a爰片性色毛片久久| 国产精品人妻免费精品| 天天视频网站黄| 精品久久无码午夜福利| 日本αv| se吧提供国产乱老熟视频胖女人| 大象AV在线| 2023天天操夜夜操| 国产女同视频在线播放| 日韩人妻一二三区视频| 艹少妇网站| 国产成人无码网站在线视频| 亚洲 91 在线| 婷婷色网| 大香蕉伊然在亚洲91| 亚洲凸凹超碰成人| 国产超碰97| 91四海无码日韩欧美| 久夜操| 97AV在线观看| 家庭乱伦性爱av| 色噜噜人妻丝袜a∨先锋影| 国产一级黄色片在线观看| 婷婷丁香五月激情啪啪| 香蕉99秘 精品一区丁香| 久久久久久91香蕉国产| 天堂资源站| 97中文字幕一区| 好爽免费视频| 免费观看国产不卡av| 久久av成人无码免费| 亚洲福利中文字幕在线| 一牛影视久久久一区二区三区| 欧美激情视频一区二区三区不卡| 性爱AV天堂| 91精品国产91久久久久久久久久久久| av网站免费看| 黄色一区二区秘书性感| 色狠狠色| 日韩精品9999| 999久久久九九九九| 深夜福利黄片| 欧美麻豆成人同性GⅤ在线| 黄色污污污污污污网站| 日韩电影天堂视频二区三区| 国产精品视频在线观看| 亚洲免费成人在线高清无码视频| 九九色影院| 国产农村妇女精品1区二区| 很很操在线| 欧美日韩国内不卡| 青青草在线成人视频| 精品一区二区三区蜜桃臀www| 无码粉嫩白虎一线天b区| 天堂69亚洲精品中文字| 久久五月综合| 很很很很操| 啊v在线观看视频| 人人操人人搞人人草| 亚洲成人碰碰| 亚洲蜜臀精品视频久久| 久久性生大片免费观看性| 操逼逼中文字幕| 小草三级久久观看| 视频二区美腿制服人妻欧美| 思思热国产在线视频| 欧美色五月| 无毛精品| 人人天天干干| 九九九九精品一区| 国产精品一区二区手机看片| 香蕉久久国产AV一区二区| 精久久久91| 国产精品网址| 色婷婷成人| 综合av影片| 欧美爆乳精品一区二区| 九九久久首页| 成年人黄色| 99久久久无码国产精品性男| 婷婷五月天无码 | 亚洲色图 91| 黄片aaaaa一区| 精品小视频在线| 中文乱码字字幕在线第5页| 色色五月婷| 插B在线观看| 亚洲精品无码成人久久久99| 啊啊啊不要啊啊受不了了视频在线 | 久久久亚洲熟妇资源| 中国一级操逼视频| 日韩人妻精品中文字幕| 高潮的A片激情扒开一区| 亚洲天堂另类美腿| 国产91影院| 大香蕉操久久| 日韩熟女三十乱伦| 亚洲青色欧美| 午夜无码精品免费看性色| 欧美色图 人妻| 2018天天干在线视频| 伊人991| 成人无码在线超碰网| 91欧美长吊| 日本十八禁免费看污网站| 日本97久久久精品| 911av网站免费观看| 老女人碰碰在线碰碰视频| 18禁精品网站在线看| 国产精品高潮久久AV| 欧美18 在线观看| 久9久9精品| 久久夜黄色无码A级大片| 日韩精品系列| 中文字幕 人妻不满 在线视频| juliaann欧美丝袜办公室| 日本三级韩国三级99| 久久久精品网站| 亚洲城人男人的天堂| 日本一区三级韩国| av三级电影在线播放| 精品国产72| 黄片免费久久久久久久| 超碰精品97| 女优免费一区二区永久| 91网九色蝌蚪操熟女| 蜜屁Av| 岛国精品视频在线观看| 色综合V| 超碰69| 激情五月综合| 日韩无码视频黄色| 精品久久久久成人码免| 91无码中出人妻视频| 立川理惠被中出无码| 熟妇国产免费一区| 五月色综合| 激情 欧美 亚洲 小说| 囯产精品强| 天天日夜夜| 成人乱人伦一区二区| 伊人宅男大香蕉| 欧美黄色图片| 婷婷丁香六月| 成人一级性爱| 激情小说亚洲| 日日97| 欧美色图成人网一区二区 | 又大又长又粗又爽又黄| 天天干夜夜鈤| 91无摭挡| 亚洲射综合网| 精品久久久久久亚洲| 性爱视频啪啪啪啪| 亚洲熟妇图片| 久久国产三区| 婷婷爱五月| 91一起操| 欧美专区在线| 激情人妻另类| 大香蕉在线视频15| 78m啪啪啪| 欧美色图 人妻| 婷婷久草一区二区三区| www.激情| 欧美人妻一区| 十八禁av无码免费网站APP| 美女91在线| 91N综合网在线| 九九九九88| 色色97爱| 在线强奷到舒服的无码视频 | 天堂av最新电影网| 亚洲天堂7777| 日日干夜夜欢| 美国日韩黄色片| 久久久久久久综合,国产| 日韩激情小说一区二区| 超碰这里只有精品| 日韩欧美tv一区二区在线观看| 欧美人妻色| 三级AV入口| 东北女人| 日本一区二区三区四区免费观看| 97超碰中文| 九九久久一区二区伦理| 亚洲极品| www色色com| 精品美女少妇一区二区| 国产精品老熟女一区二区| 日韩射精| 九九热免费在线国产视频伊人五月| 97AV在线观看| 欧美在线啊啊啊| 嗯啊视频免费在线观看| 骚货 中文字幕 av| 女人爽到高潮久久久| 人人搞人人插人人操| 欧美中文字幕男人天堂久久精品 | 99re在线观看| 超碰九区| 999 久久久| 日本中文字幕在线视频| 欧美天天搞| 亚洲国成人情色好看电影| 国产精品网址| 精品人妻一区二区三区不卡断| 9 9精品一区二区三区| 国产成人91一区二区三区| 欧美日韩精品国产91| 一区二区三区视频在线观看免费| 91一区二匹| 熟女高潮合集-永久久久-成人AV | 日本一区二区三区精品| 国产成人欧美一区二区三区的国产| 日韩一级二级三级免费看完整版国语版| 国产三级日产三级韩国三级| 日本一道在线播放高清| 欧美一二级| 女同亚洲欧美一二三区久久电影| 日韩欧美成人午夜福利| 国产精品乱码久久久久| 亚欧美综合网。| 亚州色交| 欧美亚洲中文字幕| 影音先锋每日最新资源在线观看| 欧美色图99| 开心六月色| 99∨VTV| 天天插夜夜操| 人妻久久一区二区三区 | 97伊人超碰| 亚洲黄日韩无码专区| 超碰狠狠操| 欧美αv.com| 亚州综合| 亚洲色图A| 久久久精品视频欧州站| 1204av韩国| 99999无码| 久久久国产三级黄色片| 日本三级一区二区 在线| 91亚洲高清| 九九热只有精品| 日韩啪啪啪视频| 日本不卡高清免v欧美日韩在线观看| 成人八戒网站| 中文字幕91页| 欧美精品成人在线播放| 夜夜草我| 人人操人人色网| 99久久99九九99九九九| 性生活性生大爱77AV国产| 亚洲素人网| 亚洲欧洲日产国产综合网| 久操B网| 精品超碰中文在线| 亚洲 欧美都市激情| 操91| 人妻丝袜无 码视频专区| 操屄不卡视频| 人人扣人人操| 920日本午夜免费| 天天插天天干| 日本在线一二 | 亚洲色图A| 欧美一区二区| 亚洲日韩电影| 精品无码秘 人妻一区二区| av网站免费看| 91精品无码久久久久久久| 青娱乐淫乱1314| 青娱乐国产剧情av一区| 香蕉在线一区二区三区| 久久久爆乳翘臀一线天伦理视频| 色色色网站| 日韩啪啪啪啪啪| 婷婷成人久久久精品| 四虎永久在线精品免费网址| 18一区二区三区| 色五月第四色| 国产精品久久久久999| 久操| 日韩15p| 欧州一区二区三区四区| 国产精品露脸在线观看| 中文字幕精品日韩中文字幕| 色婷网| 炮色五月| 日本三级韩国三级美三级91| 中文字幕一区二区三区人妻不卡 | 日本少妇va7777| 日韩久久艹| 久草毛片| 97超碰人人操人人操| 一个国产在线综合网站| 国产精品一区二区 尿失禁| 欧美婷婷五月天| 色噜噜国产在线| 欧美玖玖爱免费玖玖| 天堂亚洲精品| 亚洲欧美在线观看无码| 精品区国产区一区二区三区| 女色视频社区| 二级毛片| 国产精品久久久久久高清无码免费看 | 女人爽到高潮潮喷18禁网站| 久久欧美1卡2卡3| 超碰在线第一页| 另类图片综合| 尤物一级在线免费观看| 欧美男女午夜啪啪| 蜜桃AV天堂| 中文字幕美女91| 日韩精品中文字幕二区| 射欧美综合| 91 偷| 91精品女厕偷拍视频| 91一区二区| 日韩三级性| 日韩免费在线观看不卡| 乱色视频中文字幕| 国产成人天堂| 在线观看不卡一区二区三区| 99久久久99久久91熟女| 日产成人久久| 74成人在线| 东京热激情视频一二三区| 亚洲色图第四色| 欧美性生活男人的天堂| 97爱爱爱综合| 国产午夜精品一区二区三区牛牛| 91在线视频免费播放| 久久人妻四季| 日本欧美中文字幕| 五月丁香综合| 男人的天堂视频精品乱在线| 日本在线播放不卡一区| 久久精品国产久精国产| 精品久久久久久无码| 伊色综合天堂色97| 精品人妻丰满熟妇一区二区三| 激情啪啪拍91| 国产91丝袜在线播放蜜月| 影音先锋新男人| 99国产精品久久久久久久成人热| 久久AV无码AV| 九月AV| 手机看片91人妻| 国产怡红院| 日本操逼无码| 中文字幕乱碼在线| 色色五月天婷婷| 天天综合91入口| 国产18精品亚洲精品| 亚洲国产中文字幕| 高清国产av无码| 青青草原伊人网| 人人扣人人操| 亚洲人妻久久| 和协无码影院| 日韩性爱1级片视频| 嗯嗯啊啊好疼| 深夜激情无码| 超碰吊日色| 人妻熟女字幕一区二区| 欧美不卡五十路| 婷婷色网| 日韩AV熟女乱伦| 中文字幕黄色一起草| 亚洲色吧网| 久久av无码| 久久99草| 97久久超碰| 97碰| 91天射| 国产自偷自拍一区| 中文字幕乱码在线| 青青草啪啪网| 天堂8在线新版官网| 人妻精品一区二区| 后入人妻一区| 天天看,天天做| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区 | 日韩情色一区二区| 看黑丝美女操逼青青网站| 久久精品毛片免费不卡| 一本大道青青| 欧美亚洲第1页| 自拍大香蕉乱插| 久久久久久久97| 东京热av男人的天堂| 性爱av网站| 一起草三级AV电影在线观看| 国产亚洲精品美女| www.婷婷| 国产av又色又爽又黄| 亚洲色人阁| 九九拍拍精品视频在线播放 | 天天拍夜夜| 撸撸成人在线视频| 丁香五月天激情综合| 无遮挡一级毛片视频免费的| 日本免费二区三区| 欧美精品久久96人妻无码| 日本免费亚洲欧美| 26uuu偷拍亚洲欧洲综合| 中文有码9| 加勒比海成人视频网| 床上啊啊啊一区二区三区| 免费一级特黄特色大片在线观看看| 91老司机视频| 国产AB视频| 91骚妇| 日韩草久视频| 乱伦熟女区| 国产成人无码啪| 国产毛片片精品天天看视频| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 国产女同在线观看视频| 91天天综合在线| 亚洲性图91| 91撸色网 玖玖网 欧美| 骚逼高潮久久精品| www…国产操逼| 377p欧洲日本亚洲大胆| 国产无码久久高清| 欧美色亚洲| 91中出视频| 国产成人啪一区二区| 精品人妻一区二区免费蜜桃| 亚洲最大91网| 正在播放:深夜激情大战,自带黑丝袜全力输出骚穴 | 91九色丨风韵犹存| 97伊人超碰| 日本 情色 1区2区3区| 亚洲涩涩| 久久久禁| A男人的天堂| 亚州中文字幕超碰97| 天天日天天舔东京热| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 天天享受天天看| 欧美日日夜夜| 日韩久久超碰色| 97超碰天天| 色av中文字幕| 好看的久久不射无码影视影院| 97久久超碰国产网站| 国产精品乱码久久久久久久久久久久| 欧美第一页性| 嗯嗯啊啊啊好舒服| 青青草在线视频欧美| 男人干美女| 久久一二三四不卡| 欧美传媒一区| 人妻喷水| 高清无码人妻久久久一区二区三区aⅴ| 久久久精品,3| 亚洲在线欧美| 韩三级a视频在线观看| 啪啪视频亚洲第一| 色久桃花影院在线观看| 亚洲综合精品国产一区| 色婷婷视频| 麻豆视频test| 久久鲁夜| 四季av一区二区凹凸精品小说| 亚洲校园激情| 97干97色| 精品成人无码| 操逼日韩无码 | 五月天伊人| 午夜精品久久999热蜜桃介男人用| 日韩97视频| 东京太热男人的天堂久久久| 少妇久久久久久| 狠狠操夜夜| 色综合色综合网| 日本裸体久久色噜噜| 97精品久久久久中文字幕| 亚洲激情欧美色图 | 亚洲强奸乱伦影视网| 丁香五月成人| 97一区二区三区视频| 亚洲美腿丝袜香蕉影视欧美成人| 国产熟女无套内射| 先锋激情∨在线视频播放| 国产福利第一视频| 免费看污网站| 国产精品97超碰| 麻豆国产97在线| 日本肏逼视频在线观看| 国产在线不卡导航| 久9综合在线| 久久精品国产欧美日韩亚洲欧美日韩中文久久国产一区 | www亚洲免费| 黄网在线播放| 欧美韩国你懂得在线| 欧美亚洲首页| 99精品欧美一区二区三区桃色| 91久久久久免| 中文在线视频| 国产成久久综合片| 亚洲成人在线播放| 精品人妻一二三四区视频| 操东北女人| 一级免费啪啪片| 亚洲视频小说| 张柏芝国产一区在线观看| 国产精品久久久久久久久AV大片| 亚洲色图欧美色图制服丝袜| 久夜操| www成人啪啪18秘 免费| 亚洲欧美setu| 1769成人国产精品视频| 综合色99| 国内精品久9| 亚洲AV噜噜狠狠网址蜜桃动漫| 超碰亚洲欧美日韩无| 暴力av在线| 国内操逼视频二区| 97欧美日韩| 九九热超碰| 日日骚av| 中文字幕日本久久| 欧美韩国你懂得在线 | 亚洲操操操无码| 综合久久久久久久综合网| 有码人妻系列| 久久男人的天堂| 91爽啪| 九月伊人中文字幕| 人妻丝袜无 码视频专区| 欧美成人贴图| 激情五月天丁香社区| 性欧美| www…国产操逼| 麻豆区久久久久亚| 亚洲免费人妻在| 久久后入制服| **一级毛片国产| 超碰97.com| 激情av| 欧美激情高清性猛交| 五月丁香| 国产精品乱码久久| 久操视频免费在线观看| 秋霞 色色| 96AV久久久| 成人影院永久免费观看网址| 日韩情色AV| 欧美久久人人网| 日产成人久久| 亚洲夜夜欢无码一区二区| 嗯嗯不要 视频| 嗯嗯啊在线视频| 午夜小电影在线插入淫高潮| 欧美性,色九九| 国产在线视频二区| 久久精品99| 色色五月婷| 69精品| 欧美熟妇操操视频| 欧美,日韩综合久久| 国产中文字幕在线| 日本91白丝| 激情小说图片亚洲首页| 97在线青| 操操啪| 欧美性爽xyxOOOO| 综合天天网| 一区二区三区激情在线观看| 风韵犹存大大大大香蕉| 丝袜制服字幕在线| 91人妻做a观看视频| AV女资源| 色眯眯射| 岛国精品视频在线观看| 国产偷人伦激情在线观看| 欧美999999| 亚洲色欲天天人妻无码系列专区| 97综合| 久久精品99久久久久久| 日韩人妻精品久久久久| 午夜超爽| 天天干夜夜鈤| 久草婷婷| 久久久一区二区三区四曲免费听 | 91红杏| 国产精品岛国片在线观看| 夜夜爽夜夜操| 精品乱码久久久久| 吻戏激情性巴克| 操操操日本的逼| 少妇综合| 欧美专区17页| 中文字幕片| 九九99久久| 免费超碰97在线观看| 一区二区视频在看| julia中文字幕在线观看| 精品一区二区三区蜜桃臀赵总| 嫩呦国产一区二区三区AV| 国产白丝AV| 久久精品无码不卡| 夜夜嗷嗷一区二区| 久久天天摸| 国产激情在线观看| 老熟妇一区二区三区…| 亚洲欧美日韩免费观看| 2017,超碰| 久污| 激情综合av| 91N五十路| 天天添天天干电影| 精品国产精品一区二区| 国产精品呦一区二区三区| 欧美18老人禁| 又大又大又大又粗爽高潮观看 | 夜夜操美女| 亚洲色图91| 97国产|免费| 国内外毛片在线观看| 91久久久老司机| 日韩精品99久久久久久中文字幕| 91中文字幕制服丝袜免费视频| av麻豆啪啪| 久草婷婷| 中 文字幕一区二区三四 五 区日 日 骚| www.狠狠| 69人妻精品一区二区绯色| 国产激情在线观看| 免费中文在线| 欧美久久伊人| 国产午夜无码片在线观看影视 | 偷拍2020| 日韩资源网| 淫骚熟女一区二区三区| 亚洲自拍一区夜夜操| 美女大乳久久久久久久女人18| 亚洲伊人久久精品狠狠在线| 9/A片| 一牛影视久久久一区二区三区| 神马视频久久久久久| 国产人妻精品久久久一区二区三区 | 久久9亚洲| 国产夜夜艹| 91亚洲欧美色图| 亚州春色| 天天干1区2区在线| 97亚洲综合在线| 久久久久白虎| 综合97| 日韩福利综合一区| 密乳AV免费观看| 99精品视频在线观看免费| 影音先锋乱| 欧美黄片视频在线观看免费| 色五月综合| 天天综合~91入口| 日本熟人妻中文字幕在线|...久久国产精品-国产精品_日本一区二区三区中文字幕 | 综合网 欧美| www.亚洲黄色| 性久久| · —级AA伦aa坐爱午夜极速ⅴA一区天天噪天天噪天天噪 | 天天色天天干天天爱| 精品偷拍13p欧美dodk视频| 婷婷深爱五月| 国产精品一二三免费网站| 精品人妻一区二区三区-国产精品| 少妇天堂网络| 大屁股熟女一区二区三区| 清纯唯美第一页| 国产精品不卡av免费在线观看| 亚洲激情综合另类男同| 亚洲免费人妻在| 亚洲国男人的天堂| 嗯嗯啊好大| 97人人爱人人乐| 亚洲欧美国产va在线播放频| 国产A v无码专区| 久久一二三四五六七八九区区区| 亚洲情色一区三区| 久久女女| 乱伦一二三区| 久久HD| 国产精品欧美激在线| 91天堂丝袜美腿| 日本人妻伦在线中文字幕| 99精品成人免费看| 蜜桃中文字日产乱幕4区| 色色青青久久| WWW操逼| 91一区二区| 91激情综合| 欧美成年人性爱视频免费观看| av午夜影院在线播放| 天天欧美色| 深夜激情 | 性爱视频久久| 国产精品密臀网在线观看| 清纯唯美激情| 美女写真| 国产人伦精品一区二区三区| 日日躁狠狠躁天天躁精品| 精品无码一区二区三区| 五月婷婷无码| 欧美日韩美女精品久草一区二区三区 | 国产多人在线观看视频| 五月丁香综合网| 操91| 亚川综合视频| 亚洲熟妇图片| 欧美 亚洲精品首页| 91在线精品| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 激情综合五月| 日韩欧亚太美不卡| 久久精品区| 欧美日韩成人| 加勒比日本在线| 国产AV无码AV| 人人操人人uiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii | 99草精| 青娱乐欧美激情一区二区| 夜夜夜久久| 亚洲久9| 五月丁香婷婷啪啪| 国产人人干| 黄色网址在线免费观看| 中文字幕-区二区三区四区视频中国 | 国产精品探花视频| 亚洲综合性网址| 欧美亚洲第一页| 久久亚洲天天做| 亚欧高清| 春色校园综合网| 亚州熟女乱伦| 国产视频一区二区三区久久亚洲天堂| 亚洲色阁| 超碰资源亚洲97| 四虎在线观看视频| 天无日色综合| AV乱伦国产| 精品久久久久瑟瑟| 亚洲码在线中文在线观看| 亚洲日本男人天堂网 | 男人的天堂VA在线| 91在线超高颜值国产| 欧美熟女丝袜| 亚洲国产成人精品无码专区| 久久久久久久久久久久欧美日| 九色精品视频导航1| 骚逼自拍99| 2024人人操人人摸| 日韩精品一区二区人人人| 91国产精品在线看| 东京热男人的天堂| 久久超碰、| 亚洲精美粉嫩嫩泬在线观看 | 国产av强奸美女| 青青操视频在线| 午夜免费福利视频一区| 久久久久女教师免费一区| 人妻天堂综合网| 日韩电影在线观看网址| 天天日天天射天天干| 中文字幕亚洲热播人妻| 蜜臀久久99精品久久久久电影| 麻豆国产尤物AV| 中文字幕日韩专区精品系列| 91老熟女老女人国产老太| 91精品伊人久久久大香线蕉91| 丝袜美腿丝袜| 久久9精品视频| 尤物黄色在线观看网站| 久久后入制服| 91精品成人www| 国产精品蜜臀久久久久无码AV| A一级色女| 欧美久久九九| 国产AV毛片| 亚洲高清欧美总合| 天美一二三在线观看Av| 无码精品一区二区三区潘金莲| 国产精品丝袜在线| 激情亚洲天堂| 免费一级欧美片片线观看| 精品99999| 久久九操在线观看| 超碰日本97美女人妻人人玩人人爱 | 熟女视频久久| 久久双插| 偷拍导航视频网站| 情色五月天久久久| 亚洲成人久久美女| 夜夜草天天| 日日骚av| 999综合色| 女优免费一区二区永久| 国产精品婬乱一级毛片彝族| 天啪| 日日日日做夜夜夜夜做无码97| 神马久久久久眼| 免费一级毛片在线视频观看| 高清国产无码av| 久草资源在线| 神马影院午夜福利久久久| 一区二区激情国产熟女| 国产三区免费在线观看| 亚洲欧美高清无码| 美女黄页网站| 欧美激色| 亚洲色图加勒比| 女优免费一区二区永久| 亚洲欧美国产成人综合不卡| 91P0RNY大屁股人妻| 青草成人免费视频一COm| 欧美国产操逼| 欧美A√综合网| 后入美女国产| 婷婷伊人綜合中文字幕| 青青草玖玖爱| 亚洲精品97| 国语精品av| www. 男人天堂成人在线| 天天摸天天碰天天添青青| 久久久精品国产亚洲伊人| 天天肏夜夜肏| 日本色色色视频| 亚州免费啪啪视频| 看免费一级在线播放毛片| 国产白丝av| 亚洲天堂资源在线| 67914在线兔费成人视频| 试看60秒| 亚洲超碰综合网| 亚洲和欧美裸体美女双飞视频| 禁止观看美女黄| 亚洲一区二区三区久久 亚洲一区二区| 国产精品亚洲免费| 亚洲国产一区二区三区四区国产| 一起草日韩| 国产传媒操逼视频| 韩国一级婬片A片无码天美| 操啊国产| 青青免费在线视频一区 | 清柠毛片| 中文字幕五区| 欧美制服另类丝袜| 91爱综合| 久艹伊人精品综合在线| 欧美日日夜夜| 日本99一区二区| 亚洲欧美日韩国产丝袜自拍中文| 精品久久久不卡一区二区| 加勒比东京热五月天天堂网| 搡老女人老91妇女熟女| 国产精品毛片| 东京热毛片调教| 大奶的诱惑| 亚洲精品一二牛牛| 欧美日日操| 人人妻人人狠人人|