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

ARTICLE DETAIL

資訊詳情

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

Spring AOP 核心原理:ProxyFactory 代理創(chuàng)建與選型機(jī)制

Spring AOP 核心原理:ProxyFactory 代理創(chuàng)建與選型機(jī)制 1. 從一次代理失效的排查說(shuō)起去年幫一個(gè)朋友排查線上問(wèn)題現(xiàn)象很怪一個(gè)訂單服務(wù)里明明加了Transactional日志里也看到事務(wù)攔截器被調(diào)用了但數(shù)據(jù)庫(kù)里就是沒(méi)回滾。他一開(kāi)始懷疑是數(shù)據(jù)庫(kù)引擎的問(wèn)題查了半天 InnoDB 配置又懷疑是異常被吞了加了一堆try-catch打印折騰到凌晨?jī)牲c(diǎn)。最后我讓他把斷點(diǎn)打在ProxyFactory的getProxy()方法上一看就明白了——他那個(gè) Bean 是通過(guò)new出來(lái)的壓根沒(méi)走 Spring 容器代理對(duì)象根本沒(méi)生成事務(wù)攔截器自然形同虛設(shè)。這個(gè)坑其實(shí)特別典型。很多人用 Spring AOP 用了好幾年Aspect、Around、Transactional寫(xiě)得很溜但一旦遇到代理沒(méi)生效切面順序不對(duì)this 調(diào)用不走切面這類(lèi)問(wèn)題就抓瞎了。根因在于大家只記住了注解怎么用卻沒(méi)搞清楚這些注解背后到底是誰(shuí)在干活。而那個(gè)真正干活的核心角色就是ProxyFactory。ProxyFactory是 Spring AOP 里最被低估的一個(gè)類(lèi)。它不像Aspect那樣天天出現(xiàn)在業(yè)務(wù)代碼里也不像BeanPostProcessor那樣在面試題里被反復(fù)背誦但它是整個(gè) Spring AOP 創(chuàng)建代理對(duì)象的總調(diào)度室。你寫(xiě)的每一個(gè)切面、每一個(gè)通知、每一個(gè)Transactional最終都要經(jīng)過(guò)它才能變成一個(gè)能攔截方法調(diào)用的代理對(duì)象。理解ProxyFactory等于拿到了 Spring AOP 源碼的鑰匙——你能看懂代理是怎么選的、通知是怎么排的、攔截器鏈?zhǔn)窃趺创饋?lái)的遇到問(wèn)題也能自己定位而不是靠猜。這篇內(nèi)容適合兩類(lèi)人一類(lèi)是已經(jīng)會(huì)用 Spring AOP但想搞清楚底層原理的中高級(jí)開(kāi)發(fā)者另一類(lèi)是正在讀 Spring 源碼被ProxyFactory、AdvisedSupport、JdkDynamicAopProxy這些類(lèi)繞暈的人。我會(huì)從ProxyFactory的定位講起拆解它創(chuàng)建代理的完整鏈路重點(diǎn)講清楚 JDK 動(dòng)態(tài)代理和 CGLIB 的選型邏輯、通知鏈的構(gòu)建過(guò)程以及實(shí)際使用中最容易踩的幾個(gè)坑。全程結(jié)合源碼但不會(huì)貼大段看不懂的代碼而是告訴你每一行代碼在解決什么問(wèn)題。2. ProxyFactory 到底站在 Spring AOP 的哪個(gè)位置2.1 它不是給業(yè)務(wù)用的是給框架自己用的先糾正一個(gè)認(rèn)知偏差。很多人以為ProxyFactory是給開(kāi)發(fā)者手動(dòng)創(chuàng)建代理用的工具類(lèi)這個(gè)理解只對(duì)了一半。它確實(shí)可以手動(dòng)用但它的主要服務(wù)對(duì)象是 Spring 框架自身。Aspect注解的解析、Transactional的代理創(chuàng)建、Cacheable的緩存攔截底層統(tǒng)統(tǒng)都是通過(guò)ProxyFactory來(lái)生成代理對(duì)象的。你可以把ProxyFactory理解成一個(gè)代理工廠的標(biāo)準(zhǔn)化流水線。它把我要給某個(gè)對(duì)象加代理這件事拆成了幾個(gè)標(biāo)準(zhǔn)步驟收集通知Advice、確定目標(biāo)對(duì)象TargetSource、選擇代理方式JDK 還是 CGLIB、生成代理對(duì)象。Spring 的各種 AOP 功能本質(zhì)上都是在往這條流水線上投喂不同的原料。從類(lèi)圖上看ProxyFactory繼承自ProxyCreatorSupport而ProxyCreatorSupport又繼承自AdvisedSupport。這條繼承鏈很關(guān)鍵AdvisedSupport負(fù)責(zé)持有目標(biāo)對(duì)象、通知列表、攔截器列表以及一個(gè)AopProxyFactory。ProxyCreatorSupport負(fù)責(zé)管理Advisor列表并提供createAopProxy()方法來(lái)決定用哪種代理。ProxyFactory則是最外層的門(mén)面把上面這些能力包裝成好用的 API。所以當(dāng)你調(diào)用proxyFactory.getProxy()的時(shí)候?qū)嶋H上是沿著這條繼承鏈一路往上最終由ProxyCreatorSupport決定代理策略由JdkDynamicAopProxy或CglibAopProxy完成實(shí)際的字節(jié)碼生成。2.2 和 AspectJ、Aspect 的關(guān)系別搞混這里必須澄清一個(gè)高頻誤解Spring AOP 和 AspectJ 不是一回事。AspectJ 是一套完整的 AOP 解決方案有自己的編譯器和織入機(jī)制能在編譯期、類(lèi)加載期織入切面。而 Spring AOP 是運(yùn)行時(shí)織入它不修改字節(jié)碼文件而是在運(yùn)行時(shí)動(dòng)態(tài)生成代理對(duì)象。Aspect這個(gè)注解雖然名字來(lái)自 AspectJ但在 Spring 里它只是一個(gè)標(biāo)記告訴 Spring這個(gè)類(lèi)里定義了切面邏輯。真正解析這個(gè)注解、把里面的Before、After、Around轉(zhuǎn)換成Advice對(duì)象的是 Spring 自己的AnnotationAwareAspectJAutoProxyCreator。而這個(gè) Creator 最終創(chuàng)建代理時(shí)用的還是ProxyFactory。換句話說(shuō)Aspect是語(yǔ)法糖ProxyFactory才是發(fā)動(dòng)機(jī)。你寫(xiě)Around的時(shí)候覺(jué)得很優(yōu)雅但 Spring 在背后做的事情是解析注解、生成AspectJMethodBeforeAdvice之類(lèi)的通知對(duì)象、塞進(jìn)ProxyFactory的Advisor列表、然后調(diào)用getProxy()生成代理。理解了這條鏈路你就知道為什么有些切面寫(xiě)法會(huì)失效——因?yàn)槟愕膶?xiě)法根本沒(méi)被解析成Advisor自然也就進(jìn)不了ProxyFactory的流水線。2.3 一個(gè)最小可運(yùn)行的 ProxyFactory 示例光講概念太虛直接上一個(gè)能跑的例子。假設(shè)我們有一個(gè)簡(jiǎn)單的服務(wù)接口和實(shí)現(xiàn)public interface OrderService { void createOrder(String orderId); } public class OrderServiceImpl implements OrderService { Override public void createOrder(String orderId) { System.out.println(創(chuàng)建訂單: orderId); } }現(xiàn)在用ProxyFactory手動(dòng)給它加一個(gè)方法執(zhí)行前的通知import org.springframework.aop.MethodBeforeAdvice; import org.springframework.aop.framework.ProxyFactory; import java.lang.reflect.Method; public class ProxyFactoryDemo { public static void main(String[] args) { OrderServiceImpl target new OrderServiceImpl(); ProxyFactory proxyFactory new ProxyFactory(); proxyFactory.setTarget(target); proxyFactory.addAdvice(new MethodBeforeAdvice() { Override public void before(Method method, Object[] args, Object target) { System.out.println(方法執(zhí)行前攔截: method.getName()); } }); OrderService proxy (OrderService) proxyFactory.getProxy(); proxy.createOrder(ORDER-001); } }運(yùn)行結(jié)果會(huì)先打印方法執(zhí)行前攔截: createOrder再打印創(chuàng)建訂單: ORDER-001。這個(gè)例子雖然簡(jiǎn)單但它完整走了一遍ProxyFactory的核心流程設(shè)置目標(biāo)、添加通知、生成代理、調(diào)用方法。后面要講的所有源碼細(xì)節(jié)都是在這個(gè)骨架上展開(kāi)的。注意這個(gè)例子默認(rèn)走的是 JDK 動(dòng)態(tài)代理因?yàn)镺rderServiceImpl實(shí)現(xiàn)了接口。如果你把接口去掉只留實(shí)現(xiàn)類(lèi)ProxyFactory會(huì)自動(dòng)切換到 CGLIB。這個(gè)切換邏輯就是下一節(jié)要重點(diǎn)講的。3. JDK 動(dòng)態(tài)代理還是 CGLIBProxyFactory 的選型邏輯3.1 選型發(fā)生在 createAopProxy 方法里代理方式的選擇不是隨機(jī)的也不是你隨便配的而是由ProxyCreatorSupport.createAopProxy()方法根據(jù)一組條件計(jì)算出來(lái)的。核心判斷邏輯在DefaultAopProxyFactory里簡(jiǎn)化后的邏輯是這樣的public AopProxy createAopProxy(AdvisedSupport config) { if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) { Class? targetClass config.getTargetClass(); if (targetClass null) { throw new AopConfigException(TargetSource cannot determine target class); } if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) { return new JdkDynamicAopProxy(config); } return new ObjenesisCglibAopProxy(config); } else { return new JdkDynamicAopProxy(config); } }這段代碼信息量很大我拆開(kāi)講。三個(gè)條件只要滿足任意一個(gè)就會(huì)進(jìn)入可能用 CGLIB的分支isOptimize()是否開(kāi)啟了優(yōu)化模式這個(gè)一般不用除非你明確知道自己在做什么。isProxyTargetClass()是否強(qiáng)制代理目標(biāo)類(lèi)。EnableAspectJAutoProxy(proxyTargetClass true)或者 Spring Boot 2.x 之后默認(rèn)的spring.aop.proxy-target-classtrue都會(huì)讓這個(gè)值為 true。hasNoUserSuppliedProxyInterfaces()目標(biāo)對(duì)象沒(méi)有實(shí)現(xiàn)任何用戶自定義接口。進(jìn)入分支后還要再看一眼目標(biāo)類(lèi)本身如果目標(biāo)類(lèi)本身就是個(gè)接口或者已經(jīng)是個(gè)代理類(lèi)那還是用 JDK 動(dòng)態(tài)代理否則才用 CGLIB。3.2 為什么 Spring Boot 默認(rèn)改成了 CGLIB這是很多人困惑的點(diǎn)。Spring 早期默認(rèn)用 JDK 動(dòng)態(tài)代理但從 Spring Boot 2.x 開(kāi)始默認(rèn)改成了 CGLIB。原因其實(shí)很實(shí)際JDK 動(dòng)態(tài)代理要求目標(biāo)類(lèi)必須實(shí)現(xiàn)接口而現(xiàn)實(shí)中有大量業(yè)務(wù)類(lèi)是不實(shí)現(xiàn)接口的比如各種XxxService直接就是 class。如果默認(rèn)用 JDK 代理這些類(lèi)就沒(méi)法被代理開(kāi)發(fā)者得手動(dòng)加接口或者改配置體驗(yàn)很差。CGLIB 通過(guò)繼承目標(biāo)類(lèi)來(lái)生成子類(lèi)代理不要求接口適用面更廣。代價(jià)是它不能代理final類(lèi)和方法因?yàn)槔^承不了。所以 Spring Boot 選擇 CGLIB 作為默認(rèn)是在通用性和限制之間做的權(quán)衡。這里有個(gè)實(shí)操經(jīng)驗(yàn)如果你的項(xiàng)目里大量使用了接口 實(shí)現(xiàn)類(lèi)的分層結(jié)構(gòu)其實(shí)用 JDK 動(dòng)態(tài)代理更輕量生成的代理類(lèi)更小啟動(dòng)也更快。可以在配置里顯式關(guān)掉 CGLIBspring: aop: proxy-target-class: false但要注意一旦關(guān)掉所有沒(méi)實(shí)現(xiàn)接口的 Bean 就無(wú)法被 AOP 代理了Transactional會(huì)靜默失效。這個(gè)坑我見(jiàn)過(guò)不止一次排查起來(lái)很費(fèi)勁因?yàn)椴粓?bào)錯(cuò)只是不生效。3.3 兩種代理方式的性能與限制對(duì)比對(duì)比維度JDK 動(dòng)態(tài)代理CGLIB代理前提目標(biāo)類(lèi)必須實(shí)現(xiàn)接口目標(biāo)類(lèi)不能是 final方法不能是 final代理機(jī)制實(shí)現(xiàn)相同接口委托調(diào)用繼承目標(biāo)類(lèi)覆寫(xiě)方法生成速度較快較慢需要生成子類(lèi)字節(jié)碼調(diào)用速度反射調(diào)用略慢直接調(diào)用略快代理類(lèi)數(shù)量每個(gè)接口一個(gè)代理類(lèi)每個(gè)目標(biāo)類(lèi)一個(gè)代理類(lèi)典型失效場(chǎng)景目標(biāo)類(lèi)無(wú)接口目標(biāo)類(lèi)是 final 或方法 final關(guān)于調(diào)用速度網(wǎng)上很多文章說(shuō) CGLIB 比 JDK 快這個(gè)結(jié)論要加限定條件。在 JDK 8 之后JDK 動(dòng)態(tài)代理的性能已經(jīng)大幅優(yōu)化兩者差距很小。而且 Spring 在 CGLIB 代理里也做了緩存實(shí)際業(yè)務(wù)中這點(diǎn)差異基本可以忽略。選型時(shí)更應(yīng)該關(guān)注的是能不能代理而不是哪個(gè)快。還有一個(gè)容易被忽略的點(diǎn)CGLIB 代理會(huì)創(chuàng)建目標(biāo)類(lèi)的子類(lèi)這意味著目標(biāo)類(lèi)的構(gòu)造函數(shù)會(huì)被調(diào)用兩次一次是原始 Bean一次是代理子類(lèi)。如果你的構(gòu)造函數(shù)里有副作用比如注冊(cè)監(jiān)聽(tīng)器、啟動(dòng)線程可能會(huì)出問(wèn)題。這個(gè)坑在寫(xiě)一些有狀態(tài)的服務(wù)時(shí)特別容易踩。4. 通知鏈?zhǔn)窃趺匆徊讲綐?gòu)建起來(lái)的4.1 從 addAdvice 到攔截器鏈的轉(zhuǎn)換ProxyFactory提供了addAdvice()和addAdvisor()兩個(gè)方法看起來(lái)差不多但內(nèi)部處理邏輯不同。addAdvice()添加的是裸的Advice對(duì)象Spring 會(huì)把它包裝成一個(gè)DefaultPointcutAdvisorpointcut 是Pointcut.TRUE也就是匹配所有方法。而addAdvisor()添加的是已經(jīng)帶好 pointcut 的Advisor匹配邏輯由你自己控制。真正關(guān)鍵的是AdvisedSupport.getInterceptorsAndDynamicInterceptionAdvice()這個(gè)方法。它做的事情是遍歷所有Advisor用AdvisorChainFactory把每個(gè)Advisor轉(zhuǎn)換成MethodInterceptor最終形成一個(gè)攔截器鏈。這個(gè)轉(zhuǎn)換過(guò)程有個(gè)細(xì)節(jié)如果一個(gè)Advisor的 pointcut 是動(dòng)態(tài)的比如基于運(yùn)行時(shí)參數(shù)判斷那它會(huì)被包裝成InterceptorAndDynamicMethodMatcher在調(diào)用時(shí)還要再做一次匹配。為什么要轉(zhuǎn)成MethodInterceptor因?yàn)镸ethodInterceptor是 AOP 聯(lián)盟定義的標(biāo)準(zhǔn)接口只有一個(gè)invoke(MethodInvocation invocation)方法。所有的通知類(lèi)型——前置、后置、環(huán)繞、異常、返回——最終都會(huì)被適配成MethodInterceptor。比如MethodBeforeAdvice會(huì)被MethodBeforeAdviceInterceptor包裝AfterReturningAdvice會(huì)被AfterReturningAdviceInterceptor包裝。這樣整個(gè)鏈路上跑的都是統(tǒng)一類(lèi)型調(diào)用邏輯就簡(jiǎn)化了。4.2 攔截器鏈的執(zhí)行順序與責(zé)任鏈模式攔截器鏈構(gòu)建好之后執(zhí)行時(shí)用的是責(zé)任鏈模式。以JdkDynamicAopProxy.invoke()為例核心邏輯是public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { MethodInvocation invocation new ReflectiveMethodInvocation(proxy, target, method, args, targetClass, chain); return invocation.proceed(); }ReflectiveMethodInvocation.proceed()是責(zé)任鏈的核心。它維護(hù)了一個(gè)currentInterceptorIndex游標(biāo)每次調(diào)用proceed()就把游標(biāo)加一取出下一個(gè)攔截器執(zhí)行。如果游標(biāo)已經(jīng)到鏈尾就直接反射調(diào)用目標(biāo)方法。每個(gè)攔截器在執(zhí)行完自己的邏輯后可以選擇繼續(xù)調(diào)用invocation.proceed()也可以直接返回從而中斷鏈路。這個(gè)設(shè)計(jì)帶來(lái)的一個(gè)重要特性是攔截器的順序決定了通知的執(zhí)行順序。Around通知如果排在前面它的proceed()之前的代碼會(huì)在所有后續(xù)通知之前執(zhí)行proceed()之后的代碼會(huì)在所有后續(xù)通知之后執(zhí)行。這就是為什么Order注解能控制切面順序——它影響的是Advisor在列表里的排序進(jìn)而影響攔截器鏈的順序。4.3 一個(gè)容易搞錯(cuò)的順序問(wèn)題很多人以為Before一定在Around之前執(zhí)行其實(shí)不一定。執(zhí)行順序取決于Advisor的排序。如果Around切面的Order值更小它會(huì)先執(zhí)行它的proceed()之前的部分會(huì)先于Before執(zhí)行。我見(jiàn)過(guò)一個(gè)案例有人在Around里做了參數(shù)校驗(yàn)在Before里做了日志記錄結(jié)果發(fā)現(xiàn)日志里記錄的參數(shù)是校驗(yàn)前的原始參數(shù)而不是校驗(yàn)后修改的參數(shù)。原因就是Around的 order 更小先執(zhí)行了proceed()之后才輪到Before。要控制這個(gè)順序最穩(wěn)妥的方式是顯式給切面加Order并且理解order 越小越靠外這個(gè)規(guī)則??客獾那忻嫫鋚roceed()之前的邏輯最先執(zhí)行proceed()之后的邏輯最后執(zhí)行??梢园阉胂蟪裳笫[最外層的是 order 最小的切面。5. 手動(dòng)使用 ProxyFactory 時(shí)最容易踩的四個(gè)坑5.1 目標(biāo)對(duì)象為 null 導(dǎo)致的空指針ProxyFactory允許你先設(shè)置通知再設(shè)置目標(biāo)但如果在getProxy()之前目標(biāo)還是 null生成的代理在調(diào)用方法時(shí)會(huì)拋NullPointerException。更隱蔽的情況是你設(shè)置了TargetSource但TargetSource.getTarget()返回 null。這種情況在池化目標(biāo)對(duì)象比如PoolingTargetSource時(shí)可能出現(xiàn)池空了就會(huì)返回 null。排查這類(lèi)問(wèn)題的技巧是在getProxy()之前打印一下proxyFactory.getTargetSource().getTarget()確認(rèn)目標(biāo)對(duì)象確實(shí)存在。如果用的是自定義TargetSource要確保getTarget()方法在目標(biāo)不可用時(shí)拋出明確異常而不是返回 null。5.2 代理對(duì)象被再次代理導(dǎo)致的通知重復(fù)這個(gè)坑在手動(dòng)使用ProxyFactory時(shí)特別常見(jiàn)。假設(shè)你有一個(gè)已經(jīng)代理過(guò)的對(duì)象又把它作為目標(biāo)傳給一個(gè)新的ProxyFactory那最終生成的代理會(huì)包含兩層攔截器鏈通知會(huì)執(zhí)行兩次。在 Spring 容器里AbstractAutoProxyCreator會(huì)通過(guò)AopUtils.isAopProxy()判斷對(duì)象是否已經(jīng)是代理避免重復(fù)代理。但手動(dòng)使用時(shí)沒(méi)有這層保護(hù)。判斷一個(gè)對(duì)象是否已經(jīng)是代理可以用AopUtils.isAopProxy(obj)或AopUtils.isJdkDynamicProxy(obj)、AopUtils.isCglibProxy(obj)。在手動(dòng)創(chuàng)建代理前加一道判斷能避免很多詭異問(wèn)題。5.3 this 調(diào)用不走代理的經(jīng)典問(wèn)題這個(gè)問(wèn)題在 Spring 容器里也常見(jiàn)但手動(dòng)用ProxyFactory時(shí)更容易理解。假設(shè)目標(biāo)類(lèi)里有兩個(gè)方法a()和b()a()內(nèi)部調(diào)用了this.b()。當(dāng)你通過(guò)代理對(duì)象調(diào)用a()時(shí)a()的調(diào)用會(huì)被攔截但a()內(nèi)部通過(guò)this調(diào)用的b()不會(huì)走代理因?yàn)閠his指向的是原始目標(biāo)對(duì)象不是代理對(duì)象。解決辦法有三種一是把b()的調(diào)用改成通過(guò)代理對(duì)象調(diào)用注入自身或AopContext.currentProxy()二是用AspectJ的編譯期織入三是重新設(shè)計(jì)把b()的邏輯抽到另一個(gè) Bean 里。第一種方案需要開(kāi)啟exposeProxyproxyFactory.setExposeProxy(true);然后在代碼里用AopContext.currentProxy()獲取當(dāng)前代理。但要注意exposeProxy會(huì)把代理對(duì)象存到ThreadLocal里用完必須清理否則會(huì)有內(nèi)存泄漏風(fēng)險(xiǎn)。Spring 在invoke()方法里用try-finally保證了清理手動(dòng)使用時(shí)也要注意這一點(diǎn)。5.4 通知里拋異常導(dǎo)致的事務(wù)回滾失效這個(gè)坑和ProxyFactory本身關(guān)系不大但和攔截器鏈的執(zhí)行密切相關(guān)。如果Around通知里捕獲了異常但沒(méi)有重新拋出那后續(xù)的Transactional攔截器就感知不到異常事務(wù)不會(huì)回滾。因?yàn)槭聞?wù)回滾依賴(lài)的是異常傳播到TransactionInterceptor如果異常在更外層的切面被吞了事務(wù)攔截器就以為一切正常。正確的做法是如果Around里需要處理異常要么處理后重新拋出要么明確知道自己在做什么。我一般建議在Around里只做日志和監(jiān)控不要吞異常。如果確實(shí)需要轉(zhuǎn)換異常類(lèi)型要確保轉(zhuǎn)換后的異常是RuntimeException或者配置了rollbackFor。6. 從源碼看代理對(duì)象的生成時(shí)機(jī)與緩存6.1 getProxy 方法做了什么ProxyFactory.getProxy()最終調(diào)用的是ProxyCreatorSupport.createAopProxy()拿到AopProxy后調(diào)用其getProxy()方法。以JdkDynamicAopProxy為例它的getProxy()邏輯是public Object getProxy(ClassLoader classLoader) { Class?[] proxiedInterfaces AopProxyUtils.completeProxiedInterfaces(this.advised, true); findDefinedEqualsAndHashCodeMethods(proxiedInterfaces); return Proxy.newProxyInstance(classLoader, proxiedInterfaces, this); }關(guān)鍵在completeProxiedInterfaces()它會(huì)收集目標(biāo)對(duì)象實(shí)現(xiàn)的所有接口再加上 Spring 自己需要的SpringProxy、Advised、DecoratingProxy這幾個(gè)接口。為什么要加這幾個(gè)接口因?yàn)?Spring 需要通過(guò)它們來(lái)判斷一個(gè)對(duì)象是不是代理、獲取代理的Advisor列表、獲取最終的目標(biāo)類(lèi)。這也是為什么你可以把一個(gè)代理對(duì)象強(qiáng)轉(zhuǎn)成Advised然后調(diào)用getAdvisors()查看它有哪些通知。6.2 代理類(lèi)的緩存機(jī)制JDK 動(dòng)態(tài)代理本身有緩存Proxy.newProxyInstance()生成的代理類(lèi)會(huì)被緩存在WeakCache里key 是類(lèi)加載器和接口數(shù)組。CGLIB 也有緩存Spring 在CglibAopProxy里用MapClass?, Constructor?緩存了代理類(lèi)的構(gòu)造函數(shù)避免每次都重新生成。但要注意這個(gè)緩存是代理類(lèi)級(jí)別的不是代理對(duì)象級(jí)別的。每次調(diào)用getProxy()都會(huì)創(chuàng)建一個(gè)新的代理對(duì)象只是復(fù)用了代理類(lèi)的字節(jié)碼。所以如果你在循環(huán)里反復(fù)調(diào)用getProxy()會(huì)創(chuàng)建大量代理對(duì)象雖然代理類(lèi)只生成一次但對(duì)象創(chuàng)建本身也有開(kāi)銷(xiāo)。正確的做法是代理對(duì)象創(chuàng)建一次緩存起來(lái)復(fù)用。在 Spring 容器里這個(gè)緩存由AbstractAutoProxyCreator的proxyTypes和SingletonBeanRegistry共同保證每個(gè)單例 Bean 只會(huì)被代理一次。手動(dòng)使用時(shí)你需要自己保證這一點(diǎn)。6.3 一個(gè)驗(yàn)證代理類(lèi)型的實(shí)用方法調(diào)試 AOP 問(wèn)題時(shí)快速確認(rèn)一個(gè)對(duì)象用的是哪種代理能省很多時(shí)間??梢詫?xiě)一個(gè)工具方法public static String getProxyType(Object obj) { if (AopUtils.isJdkDynamicProxy(obj)) { return JDK動(dòng)態(tài)代理; } else if (AopUtils.isCglibProxy(obj)) { return CGLIB代理; } else if (AopUtils.isAopProxy(obj)) { return 其他AOP代理; } else { return 非代理對(duì)象; } }在排查為什么事務(wù)不生效時(shí)先打印一下 Bean 的代理類(lèi)型如果顯示非代理對(duì)象那基本可以確定是代理沒(méi)生成問(wèn)題出在配置或 Bean 的創(chuàng)建方式上而不是事務(wù)本身。這個(gè)技巧我用了很多次每次都能快速縮小排查范圍。7. 幾個(gè)真實(shí)場(chǎng)景下的排查思路7.1 切面不生效的通用排查鏈路遇到切面不生效我一般按這個(gè)順序排查確認(rèn)目標(biāo) Bean 是否被 Spring 管理。如果是new出來(lái)的或者通過(guò)Bean方法返回但沒(méi)走容器代理不會(huì)生成。確認(rèn)切面類(lèi)是否被 Spring 掃描到。Aspect類(lèi)需要是一個(gè) Bean通常加Component。確認(rèn)代理類(lèi)型是否匹配。如果目標(biāo)類(lèi)沒(méi)接口且用了 JDK 代理代理不會(huì)生成。確認(rèn) pointcut 表達(dá)式是否匹配。可以用AopUtils.canApply()手動(dòng)驗(yàn)證。確認(rèn)方法是否是final或static。這兩種方法無(wú)法被 CGLIB 代理。確認(rèn)調(diào)用是否走了代理。this調(diào)用不走代理。這個(gè)鏈路覆蓋了 90% 以上的切面失效場(chǎng)景。按順序排查基本都能定位到根因。7.2 循環(huán)依賴(lài)與代理的相互影響Spring 解決循環(huán)依賴(lài)時(shí)會(huì)提前暴露一個(gè)早期引用。如果這個(gè) Bean 需要被 AOP 代理早期引用暴露的是代理對(duì)象還是原始對(duì)象答案是如果代理創(chuàng)建發(fā)生在postProcessAfterInitialization階段那早期引用暴露的是原始對(duì)象后續(xù)注入到其他 Bean 里的是代理對(duì)象這會(huì)導(dǎo)致同一個(gè) Bean 在不同地方類(lèi)型不一致。Spring 通過(guò)getEarlyBeanReference()方法解決了這個(gè)問(wèn)題在提前暴露引用時(shí)如果 Bean 需要被代理就先創(chuàng)建代理對(duì)象并暴露出去。這樣其他 Bean 注入到的就是代理對(duì)象保持一致。理解這一點(diǎn)對(duì)排查循環(huán)依賴(lài)相關(guān)的 AOP 問(wèn)題很有幫助。7.3 性能敏感場(chǎng)景下的代理選擇在高頻調(diào)用的場(chǎng)景下代理帶來(lái)的開(kāi)銷(xiāo)不能忽略。JDK 動(dòng)態(tài)代理每次調(diào)用都要走反射CGLIB 雖然直接調(diào)用但代理類(lèi)的生成和類(lèi)加載也有成本。如果某個(gè)方法每秒被調(diào)用幾十萬(wàn)次代理的開(kāi)銷(xiāo)可能會(huì)顯現(xiàn)出來(lái)。優(yōu)化思路有幾個(gè)一是盡量縮小切面的匹配范圍只攔截必要的方法減少攔截器鏈的長(zhǎng)度二是對(duì)于性能極度敏感的方法考慮不用 AOP直接手寫(xiě)裝飾器三是用Around時(shí)避免在通知里做重操作比如每次都查數(shù)據(jù)庫(kù)。我見(jiàn)過(guò)一個(gè)案例有人在Around里每次都打印完整的方法參數(shù)和返回值日志量巨大導(dǎo)致性能下降了一半。把日志級(jí)別調(diào)高或者改成采樣打印后性能恢復(fù)正常。8. 我個(gè)人的幾點(diǎn)使用體會(huì)ProxyFactory這個(gè)類(lèi)我建議每個(gè)用 Spring 的開(kāi)發(fā)者都花時(shí)間讀一遍源碼。它不長(zhǎng)核心邏輯就那么幾百行但它是理解 Spring AOP 的最佳入口。讀懂了它你再去看Transactional、Cacheable、Async這些注解的實(shí)現(xiàn)會(huì)發(fā)現(xiàn)它們都是同一套模式的變體解析注解生成Advisor塞進(jìn)ProxyFactory生成代理攔截器鏈執(zhí)行。手動(dòng)使用ProxyFactory的場(chǎng)景其實(shí)不多主要是在寫(xiě)框架擴(kuò)展、自定義 AOP 邏輯、或者做單元測(cè)試時(shí)。但即使不手動(dòng)用理解它的工作原理也能幫你快速定位問(wèn)題。我自己的習(xí)慣是遇到 AOP 相關(guān)的詭異問(wèn)題先在getProxy()和invoke()兩個(gè)方法上打斷點(diǎn)看代理有沒(méi)有生成、攔截器鏈里有哪些攔截器、執(zhí)行順序是什么。這兩個(gè)斷點(diǎn)基本能解決大部分問(wèn)題。最后分享一個(gè)小技巧如果你想看某個(gè) Bean 最終被哪些Advisor代理了可以把它強(qiáng)轉(zhuǎn)成Advised然后打印getAdvisors()。這個(gè)方法在排查為什么這個(gè)切面沒(méi)生效時(shí)特別有用能直接看到實(shí)際生效的Advisor列表而不是靠猜。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
日本成人A片网站| 91久久国产精品| 亚洲无992tv| 四虎视频在线观看| 久久婷婷伊人| 无码99| 欧美18老人禁| 欧美日综合| 超碰98综合网| 蜜臀AV成人精品蜜臀AV久久| 五月婷婷深深爱| 超清福利精品视频在线| 久操免费在线| 密臀在线视频| 国产又长又大又粗的视频| 日本在线不卡123| 一级啊性爱在线视频| 午夜舔阴达高潮视频免费看| 欧美日韩在线小说 | 超碰人人乐97| 亚洲国产一区二区三区四区国产| AV天堂国产| 91无码人妻精品一区二区三区蜜桃 | 躁躁日曰躁2020| 99热精品在线观看| 亚洲天堂热| 综合欧美激情网| 91福利网在线观看| 看一级特黄a大一片| 日本一区二区中文字幕久久| 91狠狠综合久久| 精品人妻一区二区蜜桃视频 | 精品国产乱码| 成全动漫视频观看免费下载| 亚洲性爱免费电影| xxxx网站亚洲精品| 亚洲成人网站在线观看| 妺妺跟我一起洗澡没忍住| 女同女同恋久久级三级| 日韩在线性爱免费视频| 麻豆这里只有精品| 嗯嗯啊啊啊啊轻点视频| 亚洲精品天天影视综合网| 亚洲影视综合网| 五月婷婷五月天| 欧美不卡在线美女| 97精品国产手机| 99青青草国产视频| 大香蕉综合在线| 亚洲一区二区 麻豆传媒| 啊啊啊不要啊啊受不了了视频在线 | 旡码电影特区| 免費人妻夜夜爽天天爽爽一区| 女同亚洲欧美一二三区久久电影| 五月婷婷hd| 亚州高清色综合| 超碰日韩美妻| 天天综合欧美| 日韩性爱视频在线免费观看| 性爱乱伦网址| 99re这里只有精品中心播放| 一区二区三区色综合| 欧美激情黑人| 丝袜足交视频| 97色碰| 国产欧美伊人| 色哟哟1区2区| 中国特猛少妇色xxx| 精品福利| 亚洲成a人片在线观看中文!!!| 日本精品高清一二区一本到| 玖玖97综合| 国模不卡一本二本三电影| 91AV天堂| 3PAV乱伦视频| 黄色高清无码无码破解免费暗网| 大香蕉伊人网WWWn0n| 麻豆黄站| αⅴ天堂| 男人下部插入女人下部| 国产三级中文字幕粉嫩| 综合伊人网12色| 加勒比在线视频一区二区三区| 成人性爱电影一区二区| av午夜玫瑰| 亚洲春色欧美| 人人爱人人操人人性| 大香樵伊人网| 国产AV线| 精品v日韩欧美国产| 亚洲人妻一区二区三区| 久久少妇人妻| av无码精品久久久久| 1区2区3区在线视频| 色五月激情AV在线| 亚洲欧美精品国产一区二区| 射 色综合| 91女优在线观看 | 国产视频三区四区| 91 丝袜在线播放| 色青青久久影视| 色噜噜国产在线| www.91视频网| 婷婷五月花| 2020中文字幕在线| 久久精品国产亚洲AV片多多| 色拍偷亚洲| 欧州一区二区三区四区| 97精品国产97久久久| 亚洲日韩狠狠撸视频| 正在播放国产精品一区| 久久綜合很很很| 精品高潮| 久久9 9 9精品| 欧亚三区动漫| 熟妇熟女一区二三区| 欧美AB在线| 99在线免费观看| 蜜桃午夜视频一区二区| 日本中文字幕在线电影| 天天操熟妇| 粉嫩av在线一区二区| 性色av一区二区| 人人妻碰人人免费| 九九九影院| 91精品女厕偷拍视频| 伊人大香蕉在线| 蜜臀99久久| 日韩伦理视频| 午夜福利免费福利视频| 性欧美精| 九九性视频| 欧美色图91| 91热爆在线| 亚洲 欧美综合| 久草视频制服诱惑| 色综合久久av| asc国产精品| 红桃视频高潮| 无码精品久久久天天影视| 丰满精品人妻少妇久久字幕| 日本操大逼| 国产中午字一暮区| 日韩人体偷拍| 中文字幕一二区二三区人妻专区| 久久超碰天天| www.狠狠干.coom | 91大胆欧美| 操逼A∨| 欧美一区二区情色| 日日夜夜狠狠| 国产高清视频无码在线| 97久久国产精品| 亚卅熟女乱色| 久久丁香久草综合网| AV在线资源| 久热伊人| 91丨九色丨国产丨人妻在线 | AV男人天堂网| www四虎| 综合 欧美 亚洲 日本| 超碰吊日色| 日本九九久久99播| 婷婷五月天成人| 国产三级资源在线观看| 视频二区美腿制服人妻欧美| 青青草在线视频欧美| 中文字幕日本久久| A一区片| 91欧美情色| 97干天天| 这里是精品| 久热大香蕉| 成人小说视频在线精品欧美| 久九九九九九九九热| 老熟女区| 五月丁香综合| 久久久久久人妻| 中文字幕国产| A级在线视频| 91欧洲入口| 日日夜夜模| 日本淫色网| 欧洲色| 五月天玖玖资源站| 亚洲 日韩 丝袜 熟女 变态| 午夜男女爽爽大片免费观看| 青青草久草| 欧美激情黑人| 久久6热精品99视频| 在线视频五十市| 性爱动态120秒| 日本人人操人人操| 伊人五月天| 欧美顶级黄片AAAAA在线免费看| 九九视频黄色片| 色妇综合网| 日韩特一级久久| 欧美亚州色的图| 一区二区三区蜜桃成人撸久久东京热 | 五月婷婷丁香| 成人午夜视频免费播放| 中文字幕精品区先锋资源| 日本精品一级二级三级| 亚洲无992tv| 96一区二区| 久久久精品视频欧州站| 中文字幕精品亚洲熟女| 91色堂| 日韩三级性| 91精品国产乱码| 老司机久久| 玖玖综合色| 大香蕉宅男伊人| 亚洲 se图 欧美电影| 欧美超碰9798| 91 国产丝袜在线放观看| 91精品国产综合久久久蜜臀| 欧美激情亚洲情色| 视频在线观看青青99国产| 色悠久久久av| 99999国产精品| 日本不卡五区| 日婷婷| 中文字幕久热视频在线| 福利在线黄片| 91男女啊啊啊| 欧美国产有色电影| 欧美丝袜91| 国产精品一区二区三区免费视频| 91日韩| 九九综合九九综合| 天天插夜夜操| 日韩人妻一区二区精品| 中文字幕av色| 伊人在线大香蕉视频久久| 51一区二区三区| 亚洲丝袜少妇在线| 国模不卡| 91爽啪| 伊人991| 成年在线视频日本亚洲在线视频区精品江靖宇公司| 九九草| 性久久| 美女自卫慰黄网站免费| 男插女青青影院| 亚洲AV不卡在线观看| 97chaopengongkai| 亚洲 日本 国产 综合| 日操粉逼逼| 午夜人妻精品综合在线| 欧洲精品欧洲精品| 人人么人人操| 精品人妻伦一二三区久久| 欧美亚洲丝袜美女电影| 午夜福利合集| 亚洲无码免费看| 精品超碰中文在线| 久久超碰av在线| 久久啊啊| 日韩精品永久在线观看| 久久这里精品国产99丫e6| 中精品一区二区三区| 中国人高清www色视频免费| 370p日韩欧美亚洲精品| 国产自产91区13区| 南澳成人一级片在线播放| 精品一级毛片在线观看| 综合色99| 性性欧美| 中国农村熟妇毛片视频| 另类图片五月天| 夜夜 中文视频rt| 五月亭亭六月丁香| 天堂精品在线| 天天影视综合色| 精品毛片av一区二区| 激情五月天婷婷| 日本中文字幕一区| 国产精品久久久无码aV去| 六月婷婷五月丁香| 日韩欧美麻豆 | 人人操人人操草草| 99抽插| 神马久久久久| 欧美精品双插| 精品无码久久久久久久杏吧| 97日本超碰综合| 神马麻豆福利院| 久久久九九网站| 色偷偷综合91久久噜噜| 另类一区| 国产丝袜高跟美女av免费观看| 久久中文字幕一区不卡| 91l欧美在线| 国产丝袜欧美在线视频| 欧美色图片91| 综合亚洲欧美精品日韩?v| 久久熟女人| 日本久久超碰| 色眯眯射| 操逼片国产| 97视频620| 无码人妻精品一区二区中文| 夜精品久无码| 亚洲五码一区二区三区| 欧美在线干| 精品一区二区成人动漫| 我要色综合网站| www.色99| 一级性爱网| 日本亚洲vr欧美不卡高清专区| 97国产超碰| juliaann精品熟女一区| 强奸国产在线| 人妻激情视频| 后X久久| 足交视频老司机| 久久综合18p| 神马久久啊啊| 天堂8在线新版官网| 天天影视之亚洲综合网| 亚洲免费看片| 日韩有码 一区二区三区| 欧美天堂日韩三级国产传媒| 精品视频免费在线一区| 午夜操操操| 亚码激情| 日韩在线一区高清在线| 夜夜嗨一区| 性感女人网页在线观看视频| 亚洲国产婷婷在线播放| 九久久精| 日韩欧美偷拍美女视频| 丁香色五月 97干| 日日摸天天爽夜夜欢| 久久久久密| 黄片免费看的| 深夜福利黄片| 黄久久| 97超碰美国| 国产精品久久久久久无码红治院| 9久久久久久| 粘花网06av视频| 免费中文在线| 人妻一区二区三区四区视频| 91n处女在线观看| 欧美精品91| 亚洲福利中文字幕在线| WWW操逼| 亚州欧美另类| 日韩 女同 综合| 久久黄黄| renqi久久久久久久久久久久| 色综合V| 久久国产精品m码| 91爱看| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 久久久久久久人妻| 一,爱啪啪,在线免费视频| 91视频综合网| 国产精品乱码久久久久| 96超碰网| 理论久久婷婷网8| 国产十八禁视频| 精品久久久久瑟瑟| 日韩免费人妻色情网站| 亚卅熟女乱色| 日本一区二区不卡精品| 精品人妻1区| 99久久99久久免费精品蜜臀| 精品少妇一区二区| 91劲爆| 偷拍五区| 操老熟女AV| 亚州中文字幕超碰97| 国产suv精品一区二区四区999| 亚洲各类熟们中文字幕| 亚洲AV成人无码久久精品播放| 操日韩第| 亚欧视频在线| 韩国一级做A片免费的| 日本色色色色色视频| 日韩性爱视频在线免费观看| 久久精品 六十路 熟女 欧美| 日韩人妻丝袜中文字幕| 日日夜夜精品视频| 国产一国产一级毛片古装| 九九九九九精品| 欧美αv.com| 中国一级αV| 亚洲一区日韩精品中文字幕| 亚州熟女乱伦| 伊人影院综合是一个与深夜成人在线 | 久久亚洲AV成人精品无码| 伊人久久综合精品欧美| 久久草在线综合视频| 男男H黄动漫啪啪无遮挡网站| 日本免费中文字幕在线| 天天干天天做| 操我啊啊啊啊啊| 亚洲网自拍| 久久动漫精品视频这里只有精品| 超碰碰小说97| 精品免费视频国产一区| 欧美日韩日产免费网站看| 高清成年美女黄网站免费大全| 国产精品极品美女视频| 久久草大香蕉| 狠狠操一区二区| 色五月AV在线| 欧美色图电影| 成人av影院在线观看| 操逼1区| 手机在线看片免费人成视频| 天天干美少妇一区| 青女在线| 91制服丝袜| 国语av狠狠色丁香婷婷综合激情| 日韩性爱毛片操骚逼| 久久久久亚洲Aⅴ无码| 人人操av| 美欧老女人97| 欧美牲| 自拍视频一区在线观看| 日韩草久视频| 人人摸人人舔一区二区| 免费国产视频| www网站黄| 精品久久在线区一区| 97伪v| 日本色日夜干| 欧美麻豆成人同性GⅤ在线| 久久女人一区二区三区| 后入式999| 亚洲国产一级黄色视频| 国产欧美亚洲精品a第2页| 伊人五月天青青草婷婷| 粉嫩久久久极品| 婷婷色综合欧美日韩| 国产福利精品最新在线| 伊人久久久日韩一区| 亚洲图片91| 黄片com.| 青青草日本中文字幕| 国产熟女无套内射| 综合欧美日韩在线观看| 麻豆天美传媒在线视频天堂| 亚洲美女AV无码| 亚洲欧美日韩夜夜| 人妻少妇久久中文| ji熟女.com| 偷窥自拍亚洲色图| 夜夜爽夜夜操| 亚欧性爱在线无码| 日韩熟女视频二区| 黄色电影观看久久9| 人妻出轨一区二区三区| 亚洲色综合| 丁香婷婷色五月| 久久久久深夜无码| 综合亚洲情色| 一级黄色性爱裸体视频| 久久乐| 91天堂丝袜美腿| 99精品成人免费看| 亚洲欧美天| 人、人、摸,人、人、草| 欧美色天堂网在线视频| 三级日韩一区二区三区| 国内黄色精品| 思思久热在线精品66| 国产一区二区三区中文字幕| 狠狠入| 五月丁香影视| 欧美男人天堂| 欧美老妇综合网| 中国AAAAAA黄色片| 欧美性后入| 久久免费99精品久久久久久| 少妇人妻无码| 日韩欧美成人性爱在线| 亚洲综合骚逼| 日本肏逼视频在线观看| 精品人妻一区二区三区四区| 亚洲婷婷五月天| 欧美综合另类| 日韩9999| 黄片无码在线制服| 中文字幕视频二区| 第二页中文字幕| 国产精品视频自拍在线| 夜夜 中文视频rt| 人妻日日干| 免费视频观看60秒| 超碰激情808| 午夜超爽| 色区97| 内射日韩大臀美女| 操逼免费视频无码国产| 福利五区| 99热免费| 国产剧情AV不卡在线观看| 久久香蕉国产线看观看亚洲女人 | 新91视频.cmp| 蜜臀AV一区二区三区激情综合| 99久久精品无码一区二区毛片免费| 美性中文综合网| 欧美v亚洲v日韩v最新在线二区| 亚洲欧美在线丝袜| 欧美国产有色电影| 丁香五月天激情综合| 三级日本一区二区三区| 久久久久久人| 久插不卡| 免费观看有码高清视频| 啪啪免费| 97爱综合| 加勒比综合在线| 操b网站亚洲无码| 操一区| 久久精品日韩| 欧州91高潮| 久久久久久99999国产精品| 欧美综合97www| 一区二区三区精品视频| AV乱伦专区| 欧美色图另类图片| AV天堂因数| 91女人的网站| 开心五月深爱五月| 黄色视频特级毛片| 国产精品亚洲无码| 欲香欲色| 国内一级精品| 亚州精品人妻一二三区| 亚州综合AⅤ| 熟妇在线视频一区二区| 免费强奸av| 中文字幕在线观看永久| 在线日韩日本亚洲国产| 麻豆尤物视频网| 精吧天堂| 嗯嗯啊啊好大好爽| 亚洲吊色| 日日干夜夜操视频h| 999久久久精品国产| 亚洲黄色网址视频| 国产精品久久久久亚洲av | 91色图片| 啊啊啊好舒服好爽啊啊啊视频| 婷婷五月天伊人| 亚洲精品视频在线播放| 欧美成人黄网色网站| 国产亚洲中文不卡二区| 涩涩涩综合| 欧美一级AAAAAAA| 亚洲中文字幕在现观看| 91搡老女人老妇女老熟女歌词翻译| 国产丁香精品露脸视频| 成人日本片久久久蜜桃| 久久影视二区三区行押| 亚洲 中文 欧美 日韩 在线| 夜夜国自区| 亚洲第一男人天堂| 啊啊啊啊嗯嗯在线久久久| 国产自偷| 超碰人妻久久| 91狠狠综| 日韩免费高清大片在线| 欧美一区二区三区四区综合| 色欲三区| 精品一啪| 99热精品在线| 亚洲色图欧美色图制服丝袜| 96免费视频在线| 久久精品国产99国产精品亚洲| 99精品网站| 熟妇人妻一区二区三在线 | 欧美精品1区2区3区| 偷看洗澡一二三区美女| 狠狠干综合| 亚洲熟女乱色| 91天美传媒在线观看| 超碰午夜| 国产精品扒开腿做爽爽爽视频| 九九九九热| αⅴ天堂| 色五月婷婷五月天| 伊人久久大香线综合无码| 91路www| 国产夫妻性生活视频| 日韩91网站| 久久久久久久久久va| 国产尤物AV尤物在线观看不卡| 国内三级自拍小视频在线观看| 中文字幕在线观看丝袜| 自拍视频大全亚洲专媒视频/一区二区三区| 久久久久久波多野吉衣高潮| 天堂av最新电影网| 亚洲一区二区三区在线激情| 成人福利视频网| 天美av在线观看| 日韩资源网| 久草在线| 欧美亚洲日本激情在线| 亚洲国产综合久久天堂| 四虎免费视频| 成 人 A V免费视频在线观看| 中文字幕一区电影在线观看| 麻豆2区1区天美| 91美女視頻| 囯产精品久久久久久久久久梁医生| 美女写真| 91伊人影视综合| 91亚洲影视| 亚洲一卡2卡3卡4卡乱码网站| 欧美综合97www| 大香蕉日韩欧美| 天天色黄色影院天天操| 欧美日日网| 亚州精品人妻一二三区| av在线不卡一区二区三区| 射 色综合| 精品人妻久久久| 亚洲天堂中文字| 精品久久久久,69国产成人精| 老司机福利社视频在线观看| 亚一综合久久久久久久久久| 中文字幕精品丝袜| 久久久久久九九九九| www.av在线观看| 欧美熟妇亚洲版| 91丨九色丨国产丨人妻在线| 嗯嗯嗯啊啊啊在线免费观看| 93人人操人人| 四虎视频在线观看| 亚洲一区操| 色一射色一射| 另类图片综合| 天天肏美女| 天天噜| 91校园春色长篇| 深喉吞精| 久久一二三四五六七八九区区区 | 久久99国产精品| 国产成人网站在线观看| 精品无人区麻豆乱码1区2区图片 | 色老牛| 狼狼色丁香久久婷婷综合五月| 97久久精品亚洲中六字幕| 日本不卡二区| 久久97资源 网| 一本色道综合久久欧美| 91中文精品日韩欧美在线 | 操逼网站视频漫画国产| 久久久国产护士丝袜美腿一| 亚洲熟女中文字幕在线| 午夜福利 成人 91| 国产激情视频在线观看| 久久在肏| 欧美男女午夜啪啪| 国产隔壁老王影院在线| 日本一天色道久久久精品视频| 岛国激情视频在线观看| 情侣操 逼视频99| 亞洲久久直播| 亚洲一区二区中文字幕| 久久天天性久久伊人| 亚洲欧美日韩免费观看| 亚洲91网。| 93人人操人人| 99rre在线精品99re8| 99少妇精品视频| 在线αⅴ| 国产一区二区精品在线视频| 五月天色图| 日本操逼视频免费| 欧洲精品久久| av大香蕉| 天天躁日日躁AAAAXXXX国产 | 午夜福利免费福利视频| 91日韩网站| 欧美中文字幕男人天堂久久精品 | jizzjizz欧美| 伊人麻豆传媒| 另类图片亚洲加勒比另类图片亚洲加勒比另类图片亚洲加勒比 | 久久久久久久97| 和协影院中文字幕三区| 国产无马av| 在线观看一级α片刺激高潮视频| 欧美熟女丝袜| 混色激情av| 欧美视频一区二区在线| 屁股久久久久久| 男人的天堂久久狠| 六六久久日韩不卡| 国产99精品一区二区三区免费| 97国产|免费| 丁香婷婷激情五月天无毒不卡 | 精品无码少妇| 丝袜av一区二区三区| 人妻AV 中文字幕的| 亚洲欧洲日韩天堂av| 欧美激情 亚洲色图| 老师充足的奶水小说| 成人国产精品三级A片| 51国产午夜精品视频| 91久久国产精品| 综合色拍| 色女综合| 日韩有码免费视频| 国产91久久九九免费精品无码| 日韩成年人性爱视频| 欧美爱国产综合、| 亚洲情色在线| 天天插天天舔舔天天干| 大香蕉520| 18禁网站在线播放| A级毛片在线看免费| 日日躁夜夜躁狠狠躁超爽| 国产视频大全| 久久精品一区| 后入内射蜜桃臀| 熟女精品一区二区三区| 熟女突然公开看18禁影片 | 91五月天| 午夜啊啊啊| 热久久91婷婷| 中文字幕啊啊啊在线观看视频| 人人操人人大香蕉| 99久久久er直播网址| 日本高清视频xxxx| 国产成人亚洲精品无码最新在线| 91精品网站| 国产精品乱码久久久| 99热在线只有精品| 90后后入| 九九精品网| 人妻熟妇一区二区三区| 33044男人的天堂深夜备| 豆1无夜无码| 九九九精品一区二区无码| 丁香婷婷激情五月天无毒不卡| 亚洲男人天堂网久久| 国产日本熟女顶级一区二区三区视频 | 五月婷久久| 在线播放成人网站| 五月色综合| 天天色综合图片| 天美精品av| 厕所偷拍在线| 1二区9| 天综合网欧美| 亚洲激情深爱文学小说网站| 欧美亚洲韩国视频十五区| 97在线观看免费| 日1区2区3区2020| 中文字幕激情小说| 七月婷婷综合| 亚洲视频1区| 亚洲色图日韩精品| 亚洲色诱惑| 天天综合,91综合永久| 国产精品91一样| 嗯嗯啊啊好疼| 青青草一区二区三区四| 99少妇| 成人精品在线免费视频| 大学生口爆吞精| 一级久久久久久久久久久| 丰满的三级少妇欧美久久久| 99热超碰| 久草精品国产蜜臀| 欧美成人精品一区二区男人蜜臀| 国产搭汕a级片| 91综合色噜噜| 99在线无码精品秘 入口黑人| 欧美 亚洲 偷拍自拍| 国产欧美日韩女同性恋ww喷水精品| 78p欧美| 亚洲。天堂。日本在线观看| 久久在肏| 太久视频| 欧美久久九九| 综合激情一一91| 久久久日本电影| 久久久久亚洲AV无码专区少妇| 被体育老师抱着c到高潮| 欧美精品四区| 九九热精彩视频| 91麻豆天美传媒在线| 亚洲啪AⅤ永久无码| 中文字幕一区日韩精| 一道本东京热加勒比一区二区三区| 97频视在线| 欧美国产精品久久九九| 日韩激情啪啪| 美女淫穴| 亚洲人天堂| 久久精品色欧美aⅴ一区二区| 青青操97| 91精品人妻一区二区三区蜜桃| 天天艹天天日| 成人老鸭窝人人在线视频| 超碰97久| 成人性爱美曰韩| 老熟女熟妇| 久久这里只有精品9| 91成人精品在线播放| 97色诱| 亚洲在线a| 99久久99久久综合| 精彩久久中文| wwwxxx日本爽| 亚洲国产一区二区三区在线 | 操逼网站地址| 欧美偷| 超碰4A| 国产资源中文字幕在线| 色五月综合| 黄片www视频免费| 麻豆AV96熟妇人妻| 最近的最新的中文字幕视频| 色97国产69香蕉| 欧洲乱码一区二区| 天天干天天狼在线视频| 日韩欧美亚洲自拍偷拍| 欧洲精品区| 成人精品视频一区二区| 91人人臊| 午夜精品五区| 操操操五月天婷婷丁香影院| 97大色网| 91午夜无码| 亚洲无码精品AV久久久| 天天色欧美| 一二三四区电影| 国产精品乱码久久久久久久| 色爱欲亚洲| 男人天堂.AB| 九九热在线精品视频| 亚洲黄色a级片| 婷婷五月激情综合| 97超碰热线| 大香蕉欧美| 人人操人人狠狠操| 懂色影视久久| 黄色片一区二区三区四区五区| 任你爽视频| 欧美超碰人妻97| 在线免费观看日韩一区| 久久久久久久久久久六六| 水野优香在线观看| 69综合网| 玖玖综合视频| 国产 日韩,欧美 自拍| 亚洲国产精品V?在线播放| av最新免费中文字幕| 青娱乐久久艹| 免费一级欧美片片线观看| 青青草啪啪网| 亚洲宗合网| 曰韩少妇无码| 97精品人妻一二三四| 粉嫩av在线一区二区| 亚洲成人碰碰| 中文字幕 国产 精品| 99热亚洲天堂| 亚洲AV不卡在线观看尤物| 狠狠入| 这里只有精品视频在线观看麻豆| 国产精品午夜AV完会免费| 亚洲人久久久久日| 蜜臀中文字幕| 超碰在线成人| 久久大香蕉手机高清视频| 久久人妻精品| 偷拍亚洲熟女视频播放| 97国产精选| 素人美腿视频网站| 国产亚州高清国产拍精| 思思热久久成人| 人妻少妇久久中文| 少妇一区二区三区在线观看| jizz啪啪| 人妻AV在线| 射丝袜大香蕉| 亚洲人妻在线一区| 精品久久久av| 久久久久久久91| 亚洲夜夜欢无码一区二区| 欧美国产一区二区三区麻豆传媒| 97干色| 五月天开心网| 熟妇色99| 北条麻妃99精品青青久久| 国产传媒一区二区三区| 操美女高潮抽搐白浆| 91超碰丝袜制服| 五月天黄色激情视频| 亚洲色情在线影视| 亚洲色图自拍| 亚洲av淫乱| 三级色影综合网| 亚洲有薄码区日本系列中文字幕| 熟妇人妻一二三区免费| 成人性爱电影网| 九九碰九九爱97超| 加勒比aⅴ| 精品久久人妻成人网| 国产精品白丝www| 9/A片| 国产网红精品| 深喉吞精| 绯色AV粉色AV蜜臀AV| 无码精品一区二区三区潘金莲| 国产性刺激| 自拍视频一区在线观看| 亚91网| 91/欧美| 操人无码| 一级黄色性爱裸体视频| 老女人碰碰在线碰碰视频| 国产尹人在线视频免费| 88xx成人精品视频| 蜜桃午夜视频一区二区| 人妻日日夜夜精品| 国产黄色av大片网站| 日日干天天干夜夜爽| 日本幼女18+| 伊人96在线| 青青草啪啪网| 无码一区二区三区四区五区六区七区八区九区十区视频 | 久久草草亚洲蜜桃臀| 亚洲影视第一页| 亚洲吊色| 在线观看A啊啊啊| 九九这里只有精品| caoni国产亚洲av| 福利社区午夜一区二区| 91天天| 成年无码动漫av片无尽在线| 超碰久草| 国产精品白丝www| 日韩精品一二三| 91热热色| 91狠狠综合久久| 久热这里| 偷拍盗拍亚洲色图图片| 久久久人妻| 久久 精品| 2023天天操夜夜操| 操啊国产| 日韩性爱1级片视频| 四虎国产精品永久地址入口| 成人亚欧免费视频| 亚洲强奸乱伦影视网| 天天天天天天天天天天干美女| 操逼逼中文字幕| 亚洲成?V人片在线观看福利| 色情乱伦AV| 动漫爆乳3D奶水一区在线观看 | 久久97超碰香蕉| 人妻精品一区二区三区| 亚洲av无线观看| 目产99999久久999| 日日噜噜夜夜狠狠视频无| 久热色情精品| 欧美一区二区男人天堂| 人妻在线中出视频| ,成人免费啪啪视频| 中文字幕精品资源在线| 婷婷久草| 91婷婷伊人狠人| 嗯~啊~快点 死我视频免费看网站| 日韩美女高潮喷水视频| 性色高清..……| 高清有码一区二区| 亚洲欧美国产其他二区| 男女激烈网站最新| 日韩不卡一二三四| 美女t无毒不卡不卡| 96久久久久| 精品国产91av一区二区三区| 色妹子A V| 玖玖超碰熟| 99人妻| 久久丁香久草综合网| 欧美国产精品久久九九| 久久久久久久伊人精品| 丝袜喷水在线| 人妻偷拍一区二区三区| 久草视频观看视频在线| 国产欧美岛国精品一区| 在线播放中文字幕| 福利一级版子| 久久一级无码精品毛片6| 免费精品99| 男人天堂婷婷五月天校园春色| 99热9| 91色综合激情| 久久天堂网| 97在线免费观看| 都市久久精品激情亚洲| 黄色片A级一区二区三区| 少妇人妻好深太紧了vr91| 2017人人操,人人摸| 中文字幕在线高清男人的天堂 | 99热欧美| 中文字幕片| 久久久九九| 一级一性爱免费视频| 91成人久久| 国产一区麻豆免费观看| 97超碰总站| 国产精品久久久久久久AV大片| 亚洲情色五月天 | 成人五月香网在线| 少妇久久久久久| 成人黑料社久久| 极品少妇久久久| 日日狠狠久久偷偷色综合免费| 日本在线伊人啪啪| 日韩中字av一区| 涩涩涩综合| 日本久久久精品电影| 国产女人高潮视频| 91丝袜人妻| 亚洲av影音先锋| 欧美92| 欧美久久久| 偷拍欧美激情| 六月丁香啪啪| 涩涩涩综合| 一级乱伦网站| 撸无码不卡免费视频| 午夜天堂精品久久| 91人人爽人人爽人人人,gav福利视频导航,日韩欧美亚洲国产字幕四区 | 97 色综合| 欧美综合传媒| 嗯嗯啊啊好疼| AV天堂男人的天堂| 婷婷在线播放| 久9视频| 色99视频| 色青青久久影视| 男人a天堂手机在线版| 欧美一区二区日韩三区| 深夜福利黄片| 天美传媒AV在线播放| 色与欲影视| 啊啊啊啊操死我| 91精品人妻一品二品三品| 欧美日韩国产中文超碰| 人人操我人人干| 大香蕉www.超碰| 波多野42部无码喷潮在线观看| 日本色色视频网站| 欧美日韩插逼视频| 亚洲在线网站| 在线综合 亚洲 欧美中文字幕| 免费精品无码一级毛片牛牛影视 | 天天综合网站| 人妻熟女午夜精品在线| 91大胆欧美| 日日干夜夜操视频h| 亚洲揄拍网| 色噜噜人妻av中文字幕| 久操视频这里只有精品| av网站免费看| 加勒比在线观看一区二区| 3028国产精品| 亚洲日韩精品久久久久一区壹牛| 国产久久成人| 韩国一级婬片A片AAAAA| 欧美三级一级| 欧美日韩精品青青| 女人久久久| 中国一区二区亚洲人妻| 97久久久| 最新av在线| 欧美亚洲图片| 国产精品无码av| 色综合美国| 激情文学亚洲| 激情小说日韩无码| 九九香蕉网| 91N综合网在线| 日韩性爱小视频| 激情综合网五月婷婷| 亚洲综合性网址| 啊啊啊爽爽| 激情视频网址| 91激情网| 亚洲色图尤物视频| 亚洲天天艹| 啊啊啊好大好深| 婷婷色五月激情| 中文字幕精品三级久久久| 色操逼网| 天天综合网~91入口| 亚洲国产精品成人综合| 性色一线| 亚洲精品一二牛牛| 爆乳免费黄网站| 婷婷五月天久久精品视频一区二区三区 | 青草草免费网站av| 大香樵伊人网| 亚洲欧美内射| 久久久久国产精品喷潮免费观看臀 | 18啪啪手机免费性爱| 色哟哟国产精品免费网址| 麻豆精品一区二区三区四区免费观看| 国产成人无码高清| avav青青草久久夜| 婷婷丁香久久| 亚洲国产精品成人久久蜜臀| 蜜臀久久久久久999| 日本操逼视频免费| 操操操操操操| 亚洲一卡2卡3卡4卡乱码网站| 在线亚洲丝袜视频网站| 色官网在线| 超碰97丝袜| 午夜AV污污污| 亚洲国产一级精品毛一级精品看免费视频| 东北操逼| 女生自91网站| 情色日播放AV| 欧美亚洲日韩人妻在线观看| 国产欧美日韩一区二区三区| 精品无码一区二区三区色欲| 成人九九| 99福利社| 日本黄色XXX| 无码视频一区二区| 伊人久久大香线综合无码| 久久精品视频久久久| 色综合五月天| 毛片视频白嫩| 不卡人妻少妇精品毛片一区23区视频| 男女打扑克高清网站| 在线只有精品| 一本久道在线综合视频| 亚州欧美总和| 深爱激情五月天| 欧美日韩在线国产在线| 欧美综合天天| 97超碰资源网| 日本中文字幕在线电影| 青草草免费网站av| 国产精品美女| 日韩BBN| 91艹| 十八禁黄色成人网站观看| 五月香婷婷| 九九热最新| 亚洲国产成人7777| 夜夜国自区|