日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

@Aspect中@Pointcut 12种用法

發布時間:2025/3/12 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 @Aspect中@Pointcut 12种用法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文主要內容:掌握@Pointcut的12種用法。

Aop相關閱讀

閱讀本文之前,需要先掌握下面3篇文章內容,不然會比較吃力。

  • Spring系列第15篇:代理詳解(java動態代理&CGLIB代理)
  • Spring系列第30篇:jdk動態代理和cglib代理
  • Spring系列第31篇:Aop概念詳解
  • Spring系列第32篇:AOP核心源碼、原理詳解
  • Spring系列第33篇:ProxyFactoryBean創建AOP代理
  • 本文繼續AOP,目前手動Aop中三種方式已經介紹2種了,本文將介紹另外一種:AspectJProxyFactory,可能大家對這個比較陌生,但是@Aspect這個注解大家應該很熟悉吧,通過這個注解在spring環境中實現aop特別的方便。

    而AspectJProxyFactory這個類可以通過解析@Aspect標注的類來生成代理aop代理對象,對開發者來說,使創建代理變的更簡潔了。

    先了解幾個概念

    文中會涉及幾個概念,先了解一下。

    target

    用來表示目標對象,即需要通過aop來增強的對象。

    proxy

    代理對象,target通過aop增強之后生成的代理對象。

    AspectJ

    AspectJ是什么?

    AspectJ是一個面向切面的框架,是目前最好用,最方便的AOP框架,和spring中的aop可以集成在一起使用,通過Aspectj提供的一些功能實現aop代理變得非常方便。

    AspectJ使用步驟

    1.創建一個類,使用@Aspect標注 2.@Aspect標注的類中,通過@Pointcut定義切入點 3.@Aspect標注的類中,通過AspectJ提供的一些通知相關的注解定義通知 4.使用AspectJProxyFactory結合@Ascpect標注的類,來生成代理對象

    先來個案例,感受一下AspectJ是多么的方便。

    來個類

    package com.javacode2018.aop.demo9.test1;public class Service1 {public void m1() {System.out.println("我是 m1 方法");}public void m2() {System.out.println(10 / 0);System.out.println("我是 m2 方法");} }

    通過AspectJ來對Service1進行增強,來2個通知,一個前置通知,一個異常通知,這2個通知需要對Service1中的所有方法生效,實現如下:

    package com.javacode2018.aop.demo9.test1;import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.AfterThrowing; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut;//@1:這個類需要使用@Aspect進行標注 @Aspect public class Aspect1 {//@2:定義了一個切入點,可以匹配Service1中所有方法@Pointcut("execution(* com.javacode2018.aop.demo9.test1.Service1.*(..))")public void pointcut1() {}//@3:定義了一個前置通知,這個通知對剛剛上面我們定義的切入點中的所有方法有效@Before(value = "pointcut1()")public void before(JoinPoint joinPoint) {//輸出連接點的信息System.out.println("前置通知," + joinPoint);}//@4:定義了一個異常通知,這個通知對剛剛上面我們定義的切入點中的所有方法有效@AfterThrowing(value = "pointcut1()", throwing = "e")public void afterThrowing(JoinPoint joinPoint, Exception e) {//發生異常之后輸出異常信息System.out.println(joinPoint + ",發生異常:" + e.getMessage());}}

    @1:類上使用@Aspect標注

    @2:通過@Pointcut注解標注在方法上面,用來定義切入點

    @3:使用@Before標注在方法上面,定義了一個前置通知,通過value引用了上面已經定義的切入點,表示這個通知會對Service1中的所有方法生效,在通知中可以通過這個類名.方法名()引用@Pointcut定義的切入點,表示這個通知對這些切入點有效,若@Before和@Pointcut在一個類的時候,直接通過方法名()引用當前類中定義的切入點

    @4:這個使用@AfterThrowing定義了一個異常通知,也是對通過value引用了上面已經定義的切入點,表示這個通知會對Service1中的所有方法生效,若Service1中的方法拋出了Exception類型的異常,都會回調afterThrowing方法。

    來個測試類

    package com.javacode2018.aop.demo9;import com.javacode2018.aop.demo9.test1.Aspect1; import com.javacode2018.aop.demo9.test1.Service1; import org.junit.Test; import org.springframework.aop.aspectj.annotation.AspectJProxyFactory;public class AopTest9 {@Testpublic void test1() {try {//對應目標對象Service1 target = new Service1();//創建AspectJProxyFactory對象AspectJProxyFactory proxyFactory = new AspectJProxyFactory();//設置被代理的目標對象proxyFactory.setTarget(target);//設置標注了@Aspect注解的類proxyFactory.addAspect(Aspect1.class);//生成代理對象Service1 proxy = proxyFactory.getProxy();//使用代理對象proxy.m1();proxy.m2();} catch (Exception e) {}} }

    運行輸出

    前置通知,execution(void com.javacode2018.aop.demo9.test1.Service1.m1()) 我是 m1 方法 前置通知,execution(void com.javacode2018.aop.demo9.test1.Service1.m2()) execution(void com.javacode2018.aop.demo9.test1.Service1.m2()),發生異常:/ by zero

    使用是不是特方便。

    AspectJProxyFactory原理

    @Aspect標注的類上,這個類中,可以通過通過@Pointcut來定義切入點,可以通過@Before、@Around、@After、@AfterRunning、@AfterThrowing標注在方法上來定義通知,定義好了之后,將@Aspect標注的這個類交給AspectJProxyFactory來解析生成Advisor鏈,進而結合目標對象一起來生成代理對象,大家可以去看一下源碼,比較簡單,這里就不多解釋了。

    本文的重點在@Aspect標注的類上,@Aspect中有2個關鍵點比較重要

    • @Pointcut:標注在方法上,用來定義切入點,有11種用法,本文主要講解這11種用法。
    • @Aspect類中定義通知:可以通過@Before、@Around、@After、@AfterRunning、@AfterThrowing標注在方法上來定義通知,這個下一篇介紹。

    @Pointcut的12種用法

    作用

    用來標注在方法上來定義切入點。

    定義

    格式:@ 注解(value=“表達標簽 (表達式格式)”)

    如:

    @Pointcut("execution(* com.javacode2018.aop.demo9.test1.Service1.*(..))")

    表達式標簽(10種)

    • execution:用于匹配方法執行的連接點
    • within:用于匹配指定類型內的方法執行
    • this:用于匹配當前AOP代理對象類型的執行方法;注意是AOP代理對象的類型匹配,這樣就可能包括引入接口也類型匹配
    • target:用于匹配當前目標對象類型的執行方法;注意是目標對象的類型匹配,這樣就不包括引入接口也類型匹配
    • args:用于匹配當前執行的方法傳入的參數為指定類型的執行方法
    • @within:用于匹配所以持有指定注解類型內的方法
    • @target:用于匹配當前目標對象類型的執行方法,其中目標對象持有指定的注解
    • @args:用于匹配當前執行的方法傳入的參數持有指定注解的執行
    • @annotation:用于匹配當前執行方法持有指定注解的方法
    • bean:Spring AOP擴展的,AspectJ沒有對于指示符,用于匹配特定名稱的Bean對象的執行方法

    10種標簽組成了12種用法

    1、execution

    使用execution(方法表達式)匹配方法執行。

    execution格式

    execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)
    • 其中帶 ?號的 modifiers-pattern?,declaring-type-pattern?,hrows-pattern?是可選項
    • ret-type-pattern,name-pattern, parameters-pattern是必選項
    • modifier-pattern? 修飾符匹配,如public 表示匹配公有方法
    • ret-type-pattern 返回值匹配,* 表示任何返回值,全路徑的類名等
    • declaring-type-pattern? 類路徑匹配
    • name-pattern 方法名匹配,* 代表所有,set*,代表以set開頭的所有方法
    • (param-pattern) 參數匹配,指定方法參數(聲明的類型),(…)代表所有參數,(*,String)代表第一個參數為任何值,第二個為String類型,(…,String)代表最后一個參數是String類型
    • throws-pattern? 異常類型匹配

    舉例說明

    類型匹配語法

    很多地方會按照類型的匹配,先來說一下類型匹配的語法。

    首先讓我們來了解下AspectJ類型匹配的通配符:

    • *:匹配任何數量字符
    • ..:匹配任何數量字符的重復,如在類型模式中匹配任何數量子包;而在方法參數模式中匹配任何數量參數(0個或者多個參數)
    • +:匹配指定類型及其子類型;僅能作為后綴放在類型模式后邊

    2、within

    用法

    within(類型表達式):目標對象target的類型是否和within中指定的類型匹配

    匹配原則

    target.getClass().equals(within表達式中指定的類型)

    案例

    有2個類,父子關系

    父類C1

    package com.javacode2018.aop.demo9.test2;public class C1 {public void m1() {System.out.println("我是m1");}public void m2() {System.out.println("我是m2");} }

    子類C2

    package com.javacode2018.aop.demo9.test2;public class C2 extends C1 {@Overridepublic void m2() {super.m2();}public void m3() {System.out.println("我是m3");} }

    來個Aspect類

    package com.javacode2018.aop.demo9.test2;import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut;@Aspect public class AspectTest2 {@Pointcut("within(C1)") //@1public void pc() {}@Before("pc()") //@2public void beforeAdvice(JoinPoint joinpoint) {System.out.println(joinpoint);}}

    注意@1匹配的類型是C1,也就是說被代理的對象的類型必須是C1類型的才行,需要和C1完全匹配

    下面我們對C2創建代理

    @Test public void test2(){C2 target = new C2();AspectJProxyFactory proxyFactory = new AspectJProxyFactory();proxyFactory.setTarget(target);proxyFactory.addAspect(AspectTest2.class);C2 proxy = proxyFactory.getProxy();proxy.m1();proxy.m2();proxy.m3(); }

    運行輸出

    我是m1 我是m2 我是m3

    原因是目標對象是C2類型的,C2雖然是C1的子類,但是within中表達式指定的是要求類型必須是C1類型的才匹配。

    如果將within表達式修改為下面任意一種就可以匹配了

    @Pointcut("within(C1+)") @Pointcut("within(C2)")

    再次運行輸出

    execution(void com.javacode2018.aop.demo9.test2.C1.m1()) 我是m1 execution(void com.javacode2018.aop.demo9.test2.C2.m2()) 我是m2 execution(void com.javacode2018.aop.demo9.test2.C2.m3()) 我是m3

    3、this

    用法

    this(類型全限定名):通過aop創建的代理對象的類型是否和this中指定的類型匹配;注意判斷的目標是代理對象;this中使用的表達式必須是類型全限定名,不支持通配符。

    匹配原則

    :this(x),則代理對象proxy滿足下面條件時會匹配 x.getClass().isAssignableFrom(proxy.getClass());

    案例

    來個接口

    package com.javacode2018.aop.demo9.test3;public interface I1 {void m1(); }

    來個實現類

    package com.javacode2018.aop.demo9.test3;public class Service3 implements I1 {@Overridepublic void m1() {System.out.println("我是m1");}}

    來個@Aspect類

    package com.javacode2018.aop.demo9.test3;import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut;@Aspect public class AspectTest3 {//@1:匹配proxy是Service3類型的所有方法@Pointcut("this(Service3)")public void pc() {}@Before("pc()")public void beforeAdvice(JoinPoint joinpoint) {System.out.println(joinpoint);}}

    測試代碼

    @Test public void test3() {Service3 target = new Service3();AspectJProxyFactory proxyFactory = new AspectJProxyFactory();proxyFactory.setTarget(target);//獲取目標對象上的接口列表Class<?>[] allInterfaces = ClassUtils.getAllInterfaces(target);//設置需要代理的接口proxyFactory.setInterfaces(allInterfaces);proxyFactory.addAspect(AspectTest3.class);//獲取代理對象Object proxy = proxyFactory.getProxy();//調用代理對象的方法((I1) proxy).m1();System.out.println("proxy是否是jdk動態代理對象:" + AopUtils.isJdkDynamicProxy(proxy));System.out.println("proxy是否是cglib代理對象:" + AopUtils.isCglibProxy(proxy));//判斷代理對象是否是Service3類型的System.out.println(Service3.class.isAssignableFrom(proxy.getClass())); }

    運行輸出

    我是m1 proxy是否是jdk動態代理對象:true proxy是否是cglib代理對象:false false

    從輸出中可以看出m1方法沒有被增強,原因:this表達式要求代理對象必須是Service3類型的,輸出中可以看出代理對象并不是Service3類型的,此處代理對象proxy是使用jdk動態代理生成的。

    我們可以將代碼調整一下,使用cglib來創建代理

    proxyFactory.setProxyTargetClass(true);

    再次運行,會發現m2被攔截了,結果如下

    execution(void com.javacode2018.aop.demo9.test3.Service3.m1()) 我是m1 proxy是否是jdk動態代理對象:false proxy是否是cglib代理對象:true true

    4、target

    用法

    target(類型全限定名):判斷目標對象的類型是否和指定的類型匹配;注意判斷的是目標對象的類型;表達式必須是類型全限定名,不支持通配符。

    匹配原則

    :target(x),則目標對象target滿足下面條件時會匹配 x.getClass().isAssignableFrom(target.getClass());

    案例

    package com.javacode2018.aop.demo9.test4;import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut;@Aspect public class AspectTest4 {//@1:目標類型必須是Service3類型的@Pointcut("target(com.javacode2018.aop.demo9.test3.Service3)")public void pc() {}@Before("pc()")public void beforeAdvice(JoinPoint joinpoint) {System.out.println(joinpoint);}}

    測試代碼

    @Test public void test4() {Service3 target = new Service3();AspectJProxyFactory proxyFactory = new AspectJProxyFactory();proxyFactory.setProxyTargetClass(true);proxyFactory.setTarget(target);proxyFactory.addAspect(AspectTest4.class);//獲取代理對象Object proxy = proxyFactory.getProxy();//調用代理對象的方法((I1) proxy).m1();//判斷target對象是否是Service3類型的System.out.println(Service3.class.isAssignableFrom(target.getClass())); }

    運行輸出

    execution(void com.javacode2018.aop.demo9.test3.Service3.m1()) 我是m1 true

    within、this、target對比

    5、args

    用法

    args(參數類型列表)匹配當前執行的方法傳入的參數是否為args中指定的類型;注意是匹配傳入的參數類型,不是匹配方法簽名的參數類型;參數類型列表中的參數必須是類型全限定名,不支持通配符;args屬于動態切入點,也就是執行方法的時候進行判斷的,這種切入點開銷非常大,非特殊情況最好不要使用。

    舉例說明

    案例

    下面的m1方法參數是Object類型的。

    package com.javacode2018.aop.demo9.test5;public class Service5 {public void m1(Object object) {System.out.println("我是m1方法,參數:" + object);} }

    Aspect類

    package com.javacode2018.aop.demo9.test5;import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut;import java.util.Arrays; import java.util.stream.Collectors;@Aspect public class AspectTest5 {//@1:匹配只有1個參數其類型是String類型的@Pointcut("args(String)")public void pc() {}@Before("pc()")public void beforeAdvice(JoinPoint joinpoint) {System.out.println("請求參數:" + Arrays.stream(joinpoint.getArgs()).collect(Collectors.toList()));} }

    測試代碼,調用2次m1方法,第一次傳入一個String類型的,第二次傳入一個int類型的,看看效果

    @Test public void test5() {Service5 target = new Service5();AspectJProxyFactory proxyFactory = new AspectJProxyFactory();proxyFactory.setTarget(target);proxyFactory.addAspect(AspectTest5.class);Service5 proxy = proxyFactory.getProxy();proxy.m1("路人");proxy.m1(100); }

    運行輸出

    請求參數:[路人] 我是m1方法,參數:路人 我是m1方法,參數:100

    輸出中可以看出,m1第一次調用被增強了,第二次沒有被增強。

    args會在調用的過程中對參數實際的類型進行匹配,比較耗時,慎用。

    6、@within

    用法

    @within(注解類型):匹配指定的注解內定義的方法。

    匹配規則

    調用目標方法的時候,通過java中Method.getDeclaringClass()獲取當前的方法是哪個類中定義的,然后會看這個類上是否有指定的注解。

    被調用的目標方法Method對象.getDeclaringClass().getAnnotation(within中指定的注解類型) != null

    來看3個案例。

    案例1

    目標對象上有@within中指定的注解,這種情況時,目標對象的所有方法都會被攔截。

    來個注解

    package com.javacode2018.aop.demo9.test9;import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface Ann9 { }

    來個目標類,用@Ann9標注

    package com.javacode2018.aop.demo9.test9;@Ann9 public class S9 {public void m1() {System.out.println("我是m1方法");} }

    來個Aspect類

    package com.javacode2018.aop.demo9.test9;import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut;@Aspect public class AspectTest9 {/*** 定義目標方法的類上有Ann9注解*/@Pointcut("@within(Ann9)")public void pc() {}@Before("pc()")public void beforeAdvice(JoinPoint joinPoint) {System.out.println(joinPoint);} }

    測試代碼

    @Test public void test9() {S9 target = new S9();AspectJProxyFactory proxyFactory = new AspectJProxyFactory();proxyFactory.setTarget(target);proxyFactory.addAspect(AspectTest9.class);S9 proxy = proxyFactory.getProxy();proxy.m1(); }

    m1方法在類S9中定義的,S9上面有Ann9注解,所以匹配成功

    運行輸出

    execution(void com.javacode2018.aop.demo9.test9.S9.m1()) 我是m1方法

    案例2

    定義注解時未使用@Inherited,說明子類無法繼承父類上的注解,這個案例中我們將定義一個這樣的注解,將注解放在目標類的父類上,來看一下效果。

    定義注解Ann10

    package com.javacode2018.aop.demo9.test10;import java.lang.annotation.*;@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Inherited public @interface Ann10 { }

    來2個父子類

    注意:

    S10Parent為父類,并且使用了Anno10注解,內部定義了2個方法大家注意一下

    而S10位代理的目標類,繼承了S10Parent,內部重寫了父類的m2方法,并且又新增了一個m3方法

    package com.javacode2018.aop.demo9.test10;@Ann10 class S10Parent {public void m1() {System.out.println("我是S10Parent.m1()方法");}public void m2() {System.out.println("我是S10Parent.m2()方法");} }public class S10 extends S10Parent {@Overridepublic void m2() {System.out.println("我是S10.m2()方法");}public void m3() {System.out.println("我是S10.m3()方法");} }

    來個Aspect類

    package com.javacode2018.aop.demo9.test10;import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut;@Aspect public class AspectTest10 {//匹配目標方法聲明的類上有@Anno10注解@Pointcut("@within(com.javacode2018.aop.demo9.test10.Ann10)")public void pc() {}@Before("pc()")public void beforeAdvice(JoinPoint joinPoint) {System.out.println(joinPoint);} }

    測試用例

    S10為目標類,依次執行代理對象的m1、m2、m3方法,最終會調用目標類target中對應的方法。

    @Test public void test10() {S10 target = new S10();AspectJProxyFactory proxyFactory = new AspectJProxyFactory();proxyFactory.setTarget(target);proxyFactory.addAspect(AspectTest10.class);S10 proxy = proxyFactory.getProxy();proxy.m1();proxy.m2();proxy.m3(); }

    運行輸出

    execution(void com.javacode2018.aop.demo9.test10.S10Parent.m1()) 我是S10Parent.m1()方法 我是S10.m2()方法 我是S10.m3()方法

    分析結果

    從輸出中可以看出,只有m1方法被攔截了,其他2個方法沒有被攔截。

    確實是這樣的,m1方法的是由S10Parent定義的,這個類上面有Ann10注解。

    而m2方法雖然也在S10Parent中定義了,但是這個方法被子類S10重寫了,所以調用目標對象中的m2方法的時候,此時發現m2方法是由S10定義的,而S10.class.getAnnotation(Ann10.class)為空,所以這個方法不會被攔截。

    同樣m3方法也是S10中定義的,也不會被攔截。

    案例3

    對案例2進行改造,在注解的定義上面加上@Inherited,此時子類可以繼承父類的注解,此時3個方法都會被攔截了。

    下面上代碼,下面代碼為案例2代碼的一個拷貝,不同地方只是注解的定義上多了@Inherited

    定義注解Ann11

    import java.lang.annotation.*;@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Inherited public @interface Ann11 { }

    2個父子類

    package com.javacode2018.aop.demo9.test11;@Ann11 class S11Parent {public void m1() {System.out.println("我是S11Parent.m1()方法");}public void m2() {System.out.println("我是S11Parent.m2()方法");} }public class S11 extends S11Parent {@Overridepublic void m2() {System.out.println("我是S11.m2()方法");}public void m3() {System.out.println("我是S11.m3()方法");} }

    Aspect類

    package com.javacode2018.aop.demo9.test11;import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut;@Aspect public class AspectTest11 {@Pointcut("@within(com.javacode2018.aop.demo9.test11.Ann11)")public void pc() {}@Before("pc()")public void beforeAdvice(JoinPoint joinPoint) {System.out.println(joinPoint);} }

    測試用例

    @Test public void test11() {S11 target = new S11();AspectJProxyFactory proxyFactory = new AspectJProxyFactory();proxyFactory.setTarget(target);proxyFactory.addAspect(AspectTest11.class);S11 proxy = proxyFactory.getProxy();proxy.m1();proxy.m2();proxy.m3(); }

    運行輸出

    execution(void com.javacode2018.aop.demo9.test11.S11Parent.m1()) 我是S11Parent.m1()方法 execution(void com.javacode2018.aop.demo9.test11.S11.m2()) 我是S11.m2()方法 execution(void com.javacode2018.aop.demo9.test11.S11.m3()) 我是S11.m3()方法

    這次3個方法都被攔截了。

    7、@target

    用法

    @target(注解類型):判斷目標對象target類型上是否有指定的注解;@target中注解類型也必須是全限定類型名。

    匹配規則

    target.class.getAnnotation(指定的注解類型) != null

    2種情況可以匹配

    • 注解直接標注在目標類上
    • 注解標注在父類上,但是注解必須是可以繼承的,即定義注解的時候,需要使用@Inherited標注

    案例1

    注解直接標注在目標類上,這種情況目標類會被匹配到。

    自定義一個注解Ann6

    package com.javacode2018.aop.demo9.test6;import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface Ann6 { }

    目標類S6上直接使用@Ann1

    package com.javacode2018.aop.demo9.test6;@Ann6 public class S6 {public void m1() {System.out.println("我是m1");} }

    來個Aspect類

    package com.javacode2018.aop.demo9.test6;import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut;@Aspect public class AspectTest6 {//@1:目標類上有@Ann1注解@Pointcut("@target(Ann1)")public void pc() {}@Before("pc()")public void beforeAdvice(JoinPoint joinPoint) {System.out.println(joinPoint);} }

    測試代碼

    @Test public void test6() {S6 target = new S6();AspectJProxyFactory proxyFactory = new AspectJProxyFactory();proxyFactory.setTarget(target);proxyFactory.addAspect(AspectTest6.class);S6 proxy = proxyFactory.getProxy();proxy.m1();System.out.println("目標類上是否有 @Ann6 注解:" + (target.getClass().getAnnotation(Ann6.class) != null)); }

    運行輸出

    execution(void com.javacode2018.aop.demo9.test6.S6.m1()) 我是m1 目標類上是否有 @Ann6 注解:true

    案例2

    注解標注在父類上,注解上沒有@Inherited,這種情況下,目標類無法匹配到,下面看代碼

    注解Ann7

    package com.javacode2018.aop.demo9.test7;import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface Ann7 { }

    來2個父子類,父類上有@Ann7,之類S7為目標類

    package com.javacode2018.aop.demo9.test7;import java.lang.annotation.Target;@Ann7 class S7Parent { }public class S7 extends S7Parent {public void m1() {System.out.println("我是m1");}public static void main(String[] args) {System.out.println(S7.class.getAnnotation(Target.class));} }

    來個Aspect類

    package com.javacode2018.aop.demo9.test7;import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut;@Aspect public class AspectTest7 {/*** 匹配目標類上有Ann7注解*/@Pointcut("@target(com.javacode2018.aop.demo9.test7.Ann7)")public void pc() {}@Before("pc()")public void beforeAdvice(JoinPoint joinPoint) {System.out.println(joinPoint);} }

    測試代碼

    @Test public void test7() {S7 target = new S7();AspectJProxyFactory proxyFactory = new AspectJProxyFactory();proxyFactory.setTarget(target);proxyFactory.addAspect(AspectTest7.class);S7 proxy = proxyFactory.getProxy();proxy.m1();System.out.println("目標類上是否有 @Ann7 注解:" + (target.getClass().getAnnotation(Ann7.class) != null)); }

    運行輸出

    我是m1 目標類上是否有 @Ann7 注解:false

    分析結果

    @Ann7標注在了父類上,但是@Ann7定義的時候沒有使用@Inherited,說明之類無法繼承父類上面的注解,所以上面的目標類沒有被攔截,下面我們將@Ann7的定義改一下,加上@Inherited

    package com.javacode2018.aop.demo9.test7;import java.lang.annotation.*;@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Inherited public @interface Ann7 { }

    再次運行輸出

    execution(void com.javacode2018.aop.demo9.test7.S7.m1()) 我是m1 目標類上是否有 @Ann7 注解:true

    此時目標對象被攔截了。

    8、@args

    用法

    @args(注解類型):方法參數所屬的類上有指定的注解;注意不是參數上有指定的注解,而是參數類型的類上有指定的注解。

    案例1

    @Pointcut("@args(Ann8)"):匹配方法只有一個參數,并且參數所屬的類上有Ann8注解

    可以匹配下面的代碼,m1方法的第一個參數類型是Car類型,Car類型上有注解Ann8

    @Ann8 class Car { }public void m1(Car car) {System.out.println("我是m1"); }

    案例2

    @Pointcut("@args(*,Ann8)"):匹配方法只有2個參數,且第2個參數所屬的類型上有Ann8注解

    可以匹配下面代碼

    @Ann8 class Car { }public void m1(String name,Car car) {System.out.println("我是m1"); }

    案例3

    @Pointcut("@args(..,com.javacode2018.aop.demo9.test8.Ann8)"):匹配參數數量大于等于1,且最后一個參數所屬的類型上有Ann8注解 @Pointcut("@args(*,com.javacode2018.aop.demo9.test8.Ann8,..)"):匹配參數數量大于等于2,且第2個參數所屬的類型上有Ann8注解 @Pointcut("@args(..,com.javacode2018.aop.demo9.test8.Ann8,*)"):匹配參數數量大于等于2,且倒數第2個參數所屬的類型上有Ann8注解

    這個案例代碼,大家自己寫一下,體驗一下。

    9、@annotation

    用法

    @annotation(注解類型):匹配被調用的方法上有指定的注解。

    案例

    定義一個注解,可以用在方法上

    package com.javacode2018.aop.demo9.test12;import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface Ann12 { }

    定義2個類

    S12Parent為父類,內部定義了2個方法,2個方法上都有@Ann12注解

    S12是代理的目標類,也是S12Parent的子類,內部重寫了m2方法,重寫之后m2方法上并沒有@Ann12注解,S12內部還定義2個方法m3和m4,而m3上面有注解@Ann12

    package com.javacode2018.aop.demo9.test12;class S12Parent {@Ann12public void m1() {System.out.println("我是S12Parent.m1()方法");}@Ann12public void m2() {System.out.println("我是S12Parent.m2()方法");} }public class S12 extends S12Parent {@Overridepublic void m2() {System.out.println("我是S12.m2()方法");}@Ann12public void m3() {System.out.println("我是S12.m3()方法");}public void m4() {System.out.println("我是S12.m4()方法");} }

    來個Aspect類

    當被調用的目標方法上有@Ann12注解的時,會被beforeAdvice處理。

    package com.javacode2018.aop.demo9.test12;import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut;@Aspect public class AspectTest12 {@Pointcut("@annotation(com.javacode2018.aop.demo9.test12.Ann12)")public void pc() {}@Before("pc()")public void beforeAdvice(JoinPoint joinPoint) {System.out.println(joinPoint);} }

    測試用例

    S12作為目標對象,創建代理,然后分別調用4個方法

    @Test public void test12() {S12 target = new S12();AspectJProxyFactory proxyFactory = new AspectJProxyFactory();proxyFactory.setTarget(target);proxyFactory.addAspect(AspectTest12.class);S12 proxy = proxyFactory.getProxy();proxy.m1();proxy.m2();proxy.m3();proxy.m4(); }

    運行輸出

    execution(void com.javacode2018.aop.demo9.test12.S12Parent.m1()) 我是S12Parent.m1()方法 我是S12.m2()方法 execution(void com.javacode2018.aop.demo9.test12.S12.m3()) 我是S12.m3()方法 我是S12.m4()方法

    分析結果

    m1方法位于S12Parent中,上面有@Ann12注解,被連接了,m3方法上有@Ann12注解,被攔截了,而m4上沒有@Ann12注解,沒有被攔截,這3個方法的執行結果都很容易理解。

    重點在于m2方法的執行結果,沒有被攔截,m2方法雖然在S12Parent中定義的時候也有@Ann12注解標注,但是這個方法被S1給重寫了,在S1中定義的時候并沒有@Ann12注解,代碼中實際上調用的是S1中的m2方法,發現這個方法上并沒有@Ann12注解,所以沒有被攔截。

    10、bean

    用法

    bean(bean名稱):這個用在spring環境中,匹配容器中指定名稱的bean。

    案例

    來個類BeanService

    package com.javacode2018.aop.demo9.test13;public class BeanService {private String beanName;public BeanService(String beanName) {this.beanName = beanName;}public void m1() {System.out.println(this.beanName);} }

    來個Aspect類

    package com.javacode2018.aop.demo9.test13;import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.springframework.stereotype.Component;@Aspect public class Aspect13 {//攔截spring容器中名稱為beanService2的bean@Pointcut("bean(beanService2)")public void pc() {}@Before("pc()")public void beforeAdvice(JoinPoint joinPoint) {System.out.println(joinPoint);} }

    來個spring配置類

    package com.javacode2018.aop.demo9.test13;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.EnableAspectJAutoProxy;@Configuration @EnableAspectJAutoProxy // 這個可以啟用通過AspectJ方式自動為符合條件的bean創建代理 public class MainConfig13 {//將Aspect13注冊到spring容器@Beanpublic Aspect13 aspect13() {return new Aspect13();}@Beanpublic BeanService beanService1() {return new BeanService("beanService1");}@Beanpublic BeanService beanService2() {return new BeanService("beanService2");} }

    這個配置類中有個@EnableAspectJAutoProxy,這個注解大家可能比較陌生,這個屬于aop中自動代理的范圍,后面會有文章詳細介紹這塊,這里大家暫時先不用關注。

    測試用例

    下面啟動spring容器,加載配置類MainConfig13,然后分別獲取beanService1和beanService2,調用他們的m1方法,看看效果

    @Test public void test13() {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MainConfig13.class);//從容器中獲取beanService1BeanService beanService1 = context.getBean("beanService1", BeanService.class);beanService1.m1();//從容器中獲取beanService2BeanService beanService2 = context.getBean("beanService2", BeanService.class);beanService2.m1(); }

    運行輸出

    beanService1 execution(void com.javacode2018.aop.demo9.test13.BeanService.m1()) beanService2

    beanService2的m1方法被攔截了。

    11、reference pointcut

    表示引用其他命名切入點。

    有時,我們可以將切入專門放在一個類中集中定義。

    其他地方可以通過引用的方式引入其他類中定義的切入點。

    語法如下:

    @Pointcut("完整包名類名.方法名稱()")

    若引用同一個類中定義切入點,包名和類名可以省略,直接通過方法就可以引用。

    比如下面,我們可以將所有切入點定義在一個類中

    package com.javacode2018.aop.demo9.test14;import org.aspectj.lang.annotation.Pointcut;public class AspectPcDefine {@Pointcut("bean(bean1)")public void pc1() {}@Pointcut("bean(bean2)")public void pc2() {} }

    下面頂一個一個Aspect類,來引用上面的切入點

    package com.javacode2018.aop.demo9.test14;import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut;@Aspect public class Aspect14 {@Pointcut("com.javacode2018.aop.demo9.test14.AspectPcDefine.pc1()")public void pointcut1() {}@Pointcut("com.javacode2018.aop.demo9.test14.AspectPcDefine.pc1() || com.javacode2018.aop.demo9.test14.AspectPcDefine.pc2()")public void pointcut2() {}}

    12、組合型的pointcut

    Pointcut定義時,還可以使用&&、||、!運算符。

    • &&:多個匹配都需要滿足
    • ||:多個匹配中只需滿足一個
    • !:匹配不滿足的情況下
    @Pointcut("bean(bean1) || bean(bean2)") //匹配bean1或者bean2 @Pointcut("@target(Ann1) && @Annotation(Ann2)") //匹配目標類上有Ann1注解并且目標方法上有Ann2注解 @Pointcut("@target(Ann1) && !@target(Ann2)") // 匹配目標類上有Ann1注解但是沒有Ann2注解

    總結

    本文詳解了@Pointcut的12種用法,案例大家一定要敲一遍,敲的過程中,會遇到問題,然后解決問題,才能夠加深理解。

    有問題的也歡迎大家留言交流,謝謝!

    Spring系列

  • Spring系列第1篇:為何要學spring?
  • Spring系列第2篇:控制反轉(IoC)與依賴注入(DI)
  • Spring系列第3篇:Spring容器基本使用及原理
  • Spring系列第4篇:xml中bean定義詳解(-)
  • Spring系列第5篇:創建bean實例這些方式你們都知道?
  • Spring系列第6篇:玩轉bean scope,避免跳坑里!
  • Spring系列第7篇:依賴注入之手動注入
  • Spring系列第8篇:自動注入(autowire)詳解,高手在于堅持
  • Spring系列第9篇:depend-on到底是干什么的?
  • Spring系列第10篇:primary可以解決什么問題?
  • Spring系列第11篇:bean中的autowire-candidate又是干什么的?
  • Spring系列第12篇:lazy-init:bean延遲初始化
  • Spring系列第13篇:使用繼承簡化bean配置(abstract & parent)
  • Spring系列第14篇:lookup-method和replaced-method比較陌生,怎么玩的?
  • Spring系列第15篇:代理詳解(Java動態代理&cglib代理)?
  • Spring系列第16篇:深入理解java注解及spring對注解的增強(預備知識)
  • Spring系列第17篇:@Configration和@Bean注解詳解(bean批量注冊)
  • Spring系列第18篇:@ComponentScan、@ComponentScans詳解(bean批量注冊)
  • Spring系列第18篇:@import詳解(bean批量注冊)
  • Spring系列第20篇:@Conditional通過條件來控制bean的注冊
  • Spring系列第21篇:注解實現依賴注入(@Autowired、@Resource、@Primary、@Qulifier)
  • Spring系列第22篇:@Scope、@DependsOn、@ImportResource、@Lazy 詳解
  • Spring系列第23篇:Bean生命周期詳解
  • Spring系列第24篇:父子容器詳解
  • Spring系列第25篇:@Value【用法、數據來源、動態刷新】
  • Spring系列第26篇:國際化詳解
  • Spring系列第27篇:spring事件機制詳解
  • Spring系列第28篇:Bean循環依賴詳解
  • Spring系列第29篇:BeanFactory擴展(BeanFactoryPostProcessor、BeanDefinitionRegistryPostProcessor)
  • Spring系列第30篇:jdk動態代理和cglib代理
  • Spring系列第31篇:aop概念詳解
  • Spring系列第32篇:AOP核心源碼、原理詳解
  • Spring系列第33篇:ProxyFactoryBean創建AOP代理
  • 總結

    以上是生活随笔為你收集整理的@Aspect中@Pointcut 12种用法的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    a级片网站 | 色www永久免费 | 国产精品原创视频 | 91久久奴性调教 | 国产高清视频免费观看 | 午夜91在线 | 欧美日韩久久 | 亚洲精品一区二区久 | 99久久www | 精品伦理一区二区三区 | 色小说av| 国产高清精 | 国产精品久久久久久麻豆一区 | 欧美a视频| 中文字幕免费在线看 | 黄色一级大片在线免费看国产一 | 日本精品视频在线 | 国产高清精 | 亚洲精品免费视频 | 91亚洲网站| 日韩免费看片 | 精品久久久久国产免费第一页 | 欧美二区在线播放 | 久久久久国产精品视频 | 国内精品中文字幕 | 亚洲少妇久久 | 亚洲年轻女教师毛茸茸 | 日韩在线观看免费 | 久久99久久99免费视频 | 久久久私人影院 | 亚洲 欧美日韩 国产 中文 | 国产精品久久久久久久久免费看 | 色综合天天综合 | 韩国精品一区二区三区六区色诱 | 国产一级特黄毛片在线毛片 | 美女国产精品 | 91九色蝌蚪国产 | 8x8x在线观看视频 | 99热国产在线观看 | 精品9999| 99视频免费观看 | 国产免费小视频 | 一级黄色在线视频 | 亚洲一区二区黄色 | 99精品美女| 国产成人精品一区二区三区福利 | 中文字幕亚洲欧美 | 亚洲日本一区二区在线 | 国产精品久久久久久99 | 超碰免费在线公开 | 成人黄色免费在线观看 | 又色又爽又黄高潮的免费视频 | 激情综合色图 | 精品福利在线 | 国产精品久久久久一区二区国产 | 亚洲欧美日韩精品一区二区 | 精品视频在线免费观看 | 99久久99久国产黄毛片 | 精品国产一区二区三区不卡 | 欧美日韩1区2区 | 狠狠的干狠狠的操 | 日本久久成人中文字幕电影 | 午夜久久久久 | 久久婷婷精品 | 九九视频一区 | www.久久久精品 | 亚洲一级国产 | 五月开心激情 | 日本精品视频在线观看 | 九九电影在线 | 久久公开视频 | 国产一区免费看 | www久草 | 国产精品久久久久久久久久免费 | 国产精品久久久久久久久久久免费 | 中文字幕在线影视资源 | 久久久影院官网 | 国产成人精品午夜在线播放 | 久久午夜精品 | 日韩在线免费播放 | 综合网婷婷 | 国产在线 一区二区三区 | 91成人在线观看高潮 | 精品自拍网 | 久久综合九色99 | 四虎成人精品永久免费av九九 | 中文字幕免费高清在线观看 | 日韩av线观看 | 狠狠色伊人亚洲综合网站色 | 欧美性护士 | 日韩在线观看视频免费 | 日韩色在线 | 美女网站色 | 国产色资源| 国产精品系列在线 | 国产精品九九视频 | 亚洲一区二区三区四区在线视频 | 日韩黄色大片在线观看 | 91在线视频免费91 | 久久久国产精品一区二区三区 | 日日综合 | 日韩在线观看电影 | 在线观看日韩国产 | 久久精品99国产精品亚洲最刺激 | 国产精品久久久久免费a∨ 欧美一级性生活片 | 色婷婷电影网 | 国产高清无av久久 | 亚洲一区av | 天天做天天看 | 97精品国自产拍在线观看 | 国产精品日韩欧美一区二区 | av中文字幕在线观看网站 | 一级一片免费视频 | 欧美久久久久久久久中文字幕 | 成年人在线视频观看 | 亚洲1级片 | 日本中文字幕免费观看 | 黄色国产高清 | 国产在线 一区二区三区 | 亚洲永久精品视频 | 九色porny真实丨国产18 | 久久综合偷偷噜噜噜色 | 国产在线视频导航 | 久久婷婷一区二区三区 | 最近中文字幕免费大全 | 亚洲成免费 | 精品在线二区 | 亚洲好视频 | 美女精品久久久 | 国产精品久久久精品 | 亚洲最大在线视频 | 五月婷婷丁香激情 | 成人av在线观 | 成年人免费看片网站 | 亚洲少妇激情 | 一色屋精品视频在线观看 | www久| av 一区二区三区四区 | 久久a国产 | 欧美在线观看视频一区二区三区 | 三级av网站| 天天鲁一鲁摸一摸爽一爽 | 日韩欧美高清一区二区 | 美女国产在线 | 成人免费在线观看入口 | 黄色毛片视频免费观看中文 | 精品国产一区二区三区男人吃奶 | 久久av电影 | 天天干天天做 | 久久国产手机看片 | 中国美女一级看片 | 国产91电影在线观看 | 国产尤物在线视频 | 亚洲精品88欧美一区二区 | www免费黄色 | 国色天香第二季 | 天天摸日日摸人人看 | 丁香六月色 | 日日摸日日添夜夜爽97 | 亚洲精品国 | 欧美 亚洲 另类 激情 另类 | 久久看免费视频 | 久久久久久国产精品 | 狠狠色丁香九九婷婷综合五月 | 一本一道久久a久久精品蜜桃 | 午夜久久久久久久久久久 | 中字幕视频在线永久在线观看免费 | www.福利视频 | 欧美孕交vivoestv另类 | 公开超碰在线 | 国产精品久久麻豆 | av丝袜制服 | 日韩一区二区免费在线观看 | 亚洲国产播放 | av网站在线观看免费 | 视频一区二区三区视频 | 午夜精品视频一区 | 亚洲综合涩 | 中文字幕丝袜一区二区 | 欧美国产视频在线 | 亚洲国产操 | 亚洲毛片一区二区三区 | 在线免费观看视频你懂的 | 网站在线观看你们懂的 | 国产成人区 | 国产91电影在线观看 | 久久精品中文字幕一区二区三区 | 国产小视频在线观看 | 午夜色影院 | 中文字幕丝袜 | 天天干天天天天 | 国产免费人成xvideos视频 | 久久国产精彩视频 | 黄影院| 久久九九精品久久 | 精品影院一区二区久久久 | 九色在线视频 | 日韩久久久 | 国产精品毛片 | 精品国产乱码 | 中文字幕在线播放日韩 | 亚洲精品资源在线 | 亚洲精品久久久久久久不卡四虎 | 亚洲区二区 | 欧美午夜理伦三级在线观看 | 色www免费视频 | 日本大片免费观看在线 | 国产亚洲精品久久久久久久久久久久 | 国产伦精品一区二区三区免费 | 成人免费中文字幕 | 亚洲国产精品电影在线观看 | 中文字幕亚洲高清 | 国产视频一区精品 | 在线激情网 | 欧美性粗大hdvideo | 亚洲高清视频在线播放 | 在线观看视频一区二区三区 | 成人午夜性影院 | 99精品热| 久久免费在线观看视频 | 亚洲精品免费在线观看视频 | www.国产高清 | 日韩亚洲在线 | 99精品欧美一区二区蜜桃免费 | 福利一区在线 | 中文字幕亚洲情99在线 | 中午字幕在线 | 国产精品久久久久久久久久白浆 | 久久久久国产成人免费精品免费 | 国产精品一区二区在线 | 国产青草视频在线观看 | 欧美a级在线免费观看 | 日日精品 | 香蕉视频在线视频 | 亚洲精品乱码久久久一二三 | www.久久久com | 日韩理论片在线观看 | 2023av| 丁香婷婷综合五月 | 91亚·色| 特级毛片在线 | 免费在线精品视频 | 韩国在线一区 | 91精品国产成人观看 | 在线岛国av| 日本免费一二三区 | 中文视频一区二区 | 国产免费激情久久 | 国产成人精品电影久久久 | 日韩精品中文字幕有码 | 免费在线播放 | 亚洲美女在线国产 | 亚洲精品在线观看av | 韩日精品在线 | 在线观看成人福利 | 中文字幕在线播出 | 激情综合网在线观看 | 久久久久国产成人免费精品免费 | 免费观看全黄做爰大片国产 | 日韩黄色在线观看 | 亚洲性视频 | 欧美污网站 | 91亚洲成人| a黄色一级片 | 日日夜操| 91精品在线视频 | 午夜精品久久久久久99热明星 | 免费在线成人 | 亚洲精品国产拍在线 | 日本中文字幕在线一区 | 亚洲毛片久久 | 国产亚洲精品v | 午夜的福利 | www.91av在线 | 午夜91在线 | 久久久久久久久久久久亚洲 | 国产亚洲观看 | 亚洲电影在线看 | 国产香蕉视频在线观看 | 九九热免费视频在线观看 | 日韩av在线免费看 | 日韩久久久久久久久 | 在线观看日韩国产 | 国产精品永久久久久久久www | 激情久久伊人 | 超碰在线人 | 亚洲综合视频在线播放 | 精品一区二区三区香蕉蜜桃 | 激情五月激情综合网 | 午夜精品久久久久久久久久久久久久 | 中文理论片 | 四虎永久网站 | 99精品热视频只有精品10 | 亚洲视频 在线观看 | 又黄又刺激视频 | 日韩资源在线观看 | 国产视频1 | 九九久 | 超碰在线cao | 免费在线激情电影 | 麻豆视频免费在线 | 国产一级在线观看视频 | 三级毛片视频 | japanesexxxhd奶水 91在线精品一区二区 | 久久不射网站 | a在线一区| 天天射射天天 | 精品亚洲二区 | 国产日产精品久久久久快鸭 | 99久久国产免费看 | 国产精品永久免费观看 | 国产精品九九九九九 | 人人草在线视频 | 久久久久久伊人 | 夜夜夜草 | 免费大片黄在线 | 五月天婷婷视频 | 在线观看麻豆av | 国产尤物一区二区三区 | 四虎影视成人永久免费观看视频 | 青春草免费在线视频 | 日韩动漫免费观看高清完整版在线观看 | 亚洲精品乱码久久久久久蜜桃不爽 | 日韩欧美99 | 欧美一区二区三区四区夜夜大片 | 欧美日韩高清一区二区 | av资源免费在线观看 | 日本黄网站 | 国产99久久久精品视频 | 久草香蕉在线 | 中文视频一区二区 | 国产午夜视频在线观看 | 911国产 | 欧美在线观看视频一区二区 | 精品久久久久国产 | 久久精品导航 | 亚洲va欧美 | 中文字幕一区二区三区在线播放 | 日本精品视频网站 | 久久国产麻豆 | 国产91精品久久久久久 | 色狠狠综合 | 欧美成人视 | 国产成人精品综合久久久久99 | 欧美了一区在线观看 | 国产精品久久久久三级 | 国产色秀视频 | 国产精品久久久久久久久久久久 | 久草精品视频在线看网站免费 | 高潮毛片无遮挡高清免费 | 国产成人精品一区二区三区在线观看 | 免费在线一区二区 | 九九视频网站 | 久久免费视频8 | 91天堂在线观看 | www.天天干.com | 日韩免费在线观看视频 | www.99热精品 | 久久综合九色综合97_ 久久久 | 久久露脸国产精品 | av在线短片 | 久久久www成人免费毛片麻豆 | 天天操天天操天天操天天操天天操 | 日本久久综合网 | 国产九九九九九 | 久久久综合九色合综国产精品 | 亚洲黄色免费在线看 | 在线免费观看国产 | 一二三区av | 国产精品高清一区二区三区 | 91香蕉视频 | 日韩激情小视频 | 天天操天天曰 | 亚洲成人精品国产 | 香蕉视频网站在线观看 | 国产精品 国产精品 | 国产香蕉久久 | 国产一级片免费观看 | 九九有精品| 国产美女永久免费 | 狠狠色香婷婷久久亚洲精品 | 五月婷婷av在线 | 久章草在线 | 免费进去里的视频 | 色偷偷av男人天堂 | 欧美日韩精品在线观看视频 | 久久免费在线视频 | 国内精品一区二区 | 玖玖视频 | 久久精品免费播放 | 国产一区二区高清不卡 | 久久99免费观看 | 成人免费观看a | 久久麻豆视频 | 久久免费高清视频 | 午夜精品久久久久久 | 色88久久 | 久久精品伊人 | 玖玖精品在线 | 九色视频自拍 | 成人在线观看影院 | 人人玩人人添人人 | 三级毛片视频 | 国产色在线观看 | 国产直播av | 人人爽人人爽人人片 | 91麻豆操| 四虎影视成人永久免费观看亚洲欧美 | 99视频在线免费 | 国产原创在线 | 97操碰| 蜜臀av性久久久久av蜜臀妖精 | 成人精品一区二区三区中文字幕 | 天天夜夜操 | 欧美福利在线播放 | 美女国产网站 | 久久免费视频2 | 亚洲国产成人在线 | 色播激情五月 | 91av手机在线观看 | 99久久精品一区二区成人 | 97在线免费视频观看 | 国内久久精品 | 欧美 国产 视频 | 亚洲一区精品二人人爽久久 | 国产福利一区二区三区视频 | 草久中文字幕 | 日韩视频免费在线 | 日韩无在线 | 日韩高清免费在线观看 | 亚洲干视频在线观看 | 高清有码中文字幕 | 欧美精品久久久久久久久久丰满 | 操操操干干干 | 18国产精品白浆在线观看免费 | 免费av一级电影 | 亚洲高清国产视频 | 久久综合福利 | 国产私拍在线 | 亚洲一区二区三区精品在线观看 | 波多野结衣日韩 | 久草在线中文视频 | 亚洲午夜久久久久久久久电影网 | 欧美成年人在线观看 | 国产一在线精品一区在线观看 | 中文字幕人成人 | 日韩视频在线一区 | 色综合久久88 | 91九色蝌蚪 | 在线观看成人小视频 | 国产精品免费小视频 | 超碰人人av | www夜夜| 亚洲精品国精品久久99热 | 成年人av在线播放 | 中文乱码视频在线观看 | 一色屋精品视频在线观看 | 91香蕉视频720p | 免费a视频在线 | 欧美极品少妇xbxb性爽爽视频 | 日韩欧美黄色网址 | 天天操天天操天天操 | 中文字幕一区二区三区在线播放 | 成人v| 久久躁日日躁aaaaxxxx | www.狠狠 | 中文字幕高清免费日韩视频在线 | 久久久免费观看 | 国产麻豆精品一区 | 亚洲一区二区黄色 | 美女福利视频一区二区 | 伊人网综合在线观看 | 久久精品高清视频 | 国产视频18 | 国产精品一区二区久久精品爱涩 | 黄色片视频在线观看 | 日韩av免费在线看 | 午夜视频一区二区三区 | 日韩一二三区不卡 | 久久久国产精品网站 | 久久综合色综合88 | 婷婷丁香五 | 人人爱人人做人人爽 | 久久激情婷婷 | av丁香花| 中文字幕av有码 | 国产中文字幕大全 | 狠狠综合久久av | 91丨精品丨蝌蚪丨白丝jk | 国产字幕av | 五月婷丁香 | a级国产乱理伦片在线观看 亚洲3级 | 免费进去里的视频 | 国产高清日韩欧美 | 99视频这里有精品 | 日本精品久久久一区二区三区 | 国产va精品免费观看 | 成 人 a v天堂 | 精品国产人成亚洲区 | 日本三级香港三级人妇99 | av免费网页 | 亚洲激情六月 | 亚洲九九爱 | 久热只有精品 | 天天操天天操天天 | 日韩欧美一区二区三区在线 | 黄www在线观看 | 国产不卡在线观看视频 | 射久久久| 久久精品中文字幕一区二区三区 | 日韩最新中文字幕 | 国产精品一区二区久久久 | 亚洲精品小视频 | 中文字幕精品视频 | 国产日韩欧美在线播放 | av网址在线播放 | 日本精品久久久一区二区三区 | 亚洲精品国产品国语在线 | 欧美精品一区二区免费 | av免费网 | 国产高清不卡av | 久久久精品久久日韩一区综合 | 亚洲美女精品区人人人人 | www狠狠操 | 国产片免费在线观看视频 | 色婷婷亚洲婷婷 | 久久经典国产 | 国产理论一区二区三区 | 99精品美女 | 中文字幕国产精品 | 日韩一二三在线 | 国产一区二区三区免费视频 | 国产成人av网站 | 国产视频99 | 天天人人综合 | av在线播放不卡 | 天天操天天干天天干 | 丁香婷婷综合激情五月色 | a在线一区| 男女拍拍免费视频 | 亚洲第一中文网 | 天天操天天射天天舔 | 狠狠色丁香婷婷综合基地 | 中文国产字幕 | 午夜精品久久一牛影视 | 国产亚洲在线视频 | 国产成人av| 欧美性网站 | 日韩av一区二区三区在线观看 | 在线电影日韩 | 天天干视频在线 | 99精品观看 | 久久久福利视频 | 久久免费视频这里只有精品 | 在线观看国产一区 | 97精品国产97久久久久久免费 | 精品福利国产 | 又爽又黄又刺激的视频 | 久久久亚洲电影 | 这里只有精彩视频 | bbbbb女女女女女bbbbb国产 | 一区二区三区中文字幕在线观看 | 日日日日 | 综合av在线 | 久久久综合电影 | 久久久久国产a免费观看rela | 国产999精品久久久影片官网 | 免费精品国产va自在自线 | 欧美aaa视频 | 亚洲综合一区二区精品导航 | 国产精品久久久久免费a∨ 欧美一级性生活片 | 午夜视频在线观看网站 | 日本久久久久 | 国产精品第52页 | 人人舔人人干 | 国产黄色观看 | 国产精品久久久久久av | 成人高清av在线 | 国产原创在线观看 | 91正在播放 | 久久久五月婷婷 | 中文字幕日本电影 | 天堂av在线免费 | 中文字幕日韩高清 | 亚洲欧美视频在线观看 | 欧美日本不卡 | 视频在线国产 | 免费观看成人网 | 福利视频午夜 | 天天爽天天摸 | av福利免费 | 国产精品久久久久久久久久久免费 | 亚洲涩涩涩涩涩涩 | 国产黄色片久久久 | 黄色av一区二区三区 | 亚洲国产精品免费 | 黄色免费网战 | 午夜黄色影院 | 99精品视频在线观看播放 | 日韩精品视频免费 | 亚洲va欧洲va国产va不卡 | 美女网站久久 | av中文字幕av | 天天爽夜夜爽精品视频婷婷 | 中文国产字幕 | 久久成人免费视频 | 在线播放日韩av | 亚洲狠狠干 | 一区二区久久 | 久久免费试看 | 激情图片qvod | 久久99久久99精品免费看小说 | 婷婷日| 91天堂在线观看 | 欧美日韩高清 | 色偷偷人人澡久久超碰69 | 国产精品99页 | 香蕉视频国产在线观看 | 色婷婷国产在线 | 麻豆传媒在线视频 | 亚洲精品久久久久久中文传媒 | 亚洲一区不卡视频 | 成人黄色毛片 | 欧美日韩视频在线观看一区二区 | 亚洲国产久 | 国产麻豆剧传媒免费观看 | 国产精品成人免费一区久久羞羞 | 亚洲乱码一区 | 99热这里只有精品久久 | 欧美日韩中文字幕综合视频 | 天天综合五月天 | 91精品啪在线观看国产线免费 | 久久国产精品一区二区 | 色婷婷综合久久久中文字幕 | 国产精品久久久久av免费 | 日韩激情视频在线 | 久久夜色网 | 日本三级大片 | 麻豆果冻剧传媒在线播放 | 久草视频免费在线观看 | 国产精品99久久久久久大便 | 在线播放国产一区二区三区 | 久久人人爽人人爽人人 | 久久精品精品电影网 | 国产一区二区三区 在线 | 久久99国产精品视频 | 国产视频1| 国产精品久久久久久一二三四五 | 99精品系列 | 亚洲成人999 | 亚洲成av片人久久久 | 天天爽天天爽夜夜爽 | 亚洲欧美日本A∨在线观看 青青河边草观看完整版高清 | 欧美超碰在线 | 国产99视频在线观看 | 88av网站| 亚洲深夜影院 | 国内精品久久久久影院一蜜桃 | 91九色免费视频 | 欧美大码xxxx| 东方av在线免费观看 | 欧美一区二区在线刺激视频 | 国产精品国产三级国产不产一地 | 99热在线免费观看 | 亚洲美女免费精品视频在线观看 | 91自拍91 | 国产91精品看黄网站在线观看动漫 | 91在线视频在线观看 | 婷婷亚洲综合五月天小说 | 中文免费在线观看 | 久久人人爽爽人人爽人人片av | 国产成人在线网站 | a级国产乱理伦片在线播放 久久久久国产精品一区 | 九九热精品视频在线播放 | 久久不射影院 | 中文字幕91视频 | 欧美a级在线免费观看 | 91精品欧美 | 91精品视屏 | 亚洲欧美视频网站 | 天天射成人 | 久久成人精品电影 | 国产精品毛片一区二区三区 | 特级西西www44高清大胆图片 | 中午字幕在线观看 | 久久电影国产免费久久电影 | 欧美成人一区二区 | 高清精品久久 | 最近中文字幕视频网 | 97精品国产97久久久久久久久久久久 | 97人人澡人人添人人爽超碰 | 成人一区电影 | 97成人在线观看视频 | 国产日本在线观看 | 色88久久| 黄色小说18 | 色婷婷成人网 | 综合在线观看 | 国产精品一区二区免费 | 国产1区在线 | 欧美黄色高清 | 黄色在线观看免费 | 国产一级h| 美女天天操 | 综合色婷婷 | 在线免费性生活片 | 五月天中文字幕mv在线 | 日韩av影视在线观看 | 日韩电影中文,亚洲精品乱码 | 91视频下载| 天天搞天天 | 婷婷电影在线观看 | 欧洲激情综合 | 日韩三级精品 | 久久久国产一区二区三区四区小说 | www五月天com | 天天激情| 欧美天天综合网 | 中文字幕在线第一页 | 黄污网 | 亚洲高清不卡av | 久久精品国产一区二区电影 | 中文字幕精品一区二区三区电影 | 最近2019年日本中文免费字幕 | 一区二区三区播放 | 综合国产视频 | 91精品国产自产老师啪 | 国产字幕在线看 | 国产一区在线免费观看 | 91成熟丰满女人少妇 | 午夜少妇一区二区三区 | 国产精品久久久久久爽爽爽 | 免费在线国产精品 | 五月婷婷黄色网 | 中文字幕第 | 欧美精品亚洲精品 | 久久久激情网 | 四虎国产精品永久在线国在线 | 91porny九色91啦中文 | 国产精品美女久久久久久网站 | 91日韩在线专区 | 国产精品免费人成网站 | 西西www4444大胆在线 | 日韩在线看片 | 免费观看特级毛片 | 婷婷色狠狠 | www.亚洲精品在线 | 四虎在线影视 | 久久精品久久综合 | 国产高清视频网 | 天天综合在线观看 | 久久久久国产精品免费 | 国产一级二级av | 开心激情综合网 | 亚洲高清视频在线观看 | 免费午夜av | 超碰97成人| 免费在线观看黄色网 | 亚洲成人资源在线 | 99人久久精品视频最新地址 | 免费进去里的视频 | 亚洲精品国产精品乱码在线观看 | 91字幕 | 精品99视频 | 97国产电影 | 日韩欧美在线国产 | 一区中文字幕在线观看 | 日韩视频在线播放 | 久久精品人人做人人综合老师 | 91色在线观看视频 | 天天色天天爱天天射综合 | 91麻豆精品久久久久久 | 亚洲天堂网在线观看视频 | 亚洲最大av网 | 欧美日韩另类在线 | 中文av不卡 | 免费看搞黄视频网站 | 亚洲国产精品一区二区尤物区 | 天天综合操 | 国产精品一区二区久久国产 | 天天舔天天射天天操 | 中文字幕在线观看完整版电影 | 五月天亚洲激情 | 欧洲在线免费视频 | 国产又粗又猛又爽 | 91精品国产99久久久久 | 久久黄色片 | 国产香蕉视频在线播放 | 亚洲激情校园春色 | 伊人永久在线 | 亚洲精品黄网站 | 五月天欧美精品 | 日韩不卡高清视频 | 日韩av三区 | 成年人视频在线免费 | 免费观看一级视频 | 日韩免费成人av | 国产一区二区久久久久 | 又大又硬又黄又爽视频在线观看 | 欧美国产在线看 | 日日爱影视 | 91丨九色丨国产在线 | 天天操天天操天天操天天 | 午夜18视频在线观看 | 97超级碰碰碰碰久久久久 | 成人黄性视频 | 国产一区二区三区视频在线 | 91精品国产91久久久久久三级 | 天堂在线成人 | 久热超碰 | 玖草在线观看 | 国产精品成人免费一区久久羞羞 | 在线不卡视频 | 色综合网| 99精品久久久 | 日本一区二区三区免费观看 | 丝袜美女在线观看 | 免费观看一级一片 | 麻豆一区二区三区视频 | 久久精品站| 国产精品美女久久久久久久久久久 | 国产黄在线 | 欧美综合色 | 高潮久久久久久 | 手机av观看 | 91成人欧美 | 日韩欧美一区二区不卡 | 亚洲欧美日韩国产一区二区 | 欧美激情精品久久久久久免费印度 | 日韩av网站在线播放 | 国产96在线观看 | 国产99爱 | 欧洲亚洲激情 | 日韩视频一区二区在线观看 | 久久精品久久精品 | 97福利 | 在线观看视频在线观看 | 亚洲精品视频在线观看网站 | 亚洲 欧美 变态 国产 另类 | 欧美另类tv | 丁香六月婷婷开心 | 免费视频久久 | 99在线看| 亚洲国产中文在线观看 | 9999精品| www.五月天激情 | 日韩欧美在线综合网 | 国产麻豆精品免费视频 | 亚洲波多野结衣 | 精品国产一区二区三区久久久蜜月 | 91视频在线免费 | 日韩激情中文字幕 | 麻花豆传媒一二三产区 | 手机看片中文字幕 | 日韩在线观看视频中文字幕 | 99久久精品国产亚洲 | 欧美一区二区在线刺激视频 | 91亚洲精品久久久久图片蜜桃 | 日韩三级视频在线看 | 亚洲成av人片在线观看www | 久久tv视频 | 天天操夜夜叫 | 国产香蕉久久精品综合网 | 精品国产1区二区 | 日韩超碰 | 国产精品久久久久久久久久99 | 日日精品 | 日韩二区三区在线观看 | 日韩高清网站 | 久久久久久久久网站 | 亚洲综合在线视频 | 蜜臀av在线一区二区三区 | 狠狠色婷婷丁香六月 | 日韩欧美视频二区 | 91视频高清| 久久超碰97| 精品国产99国产精品 | 91插插影库 | 成人亚洲精品国产www | 2023亚洲精品国偷拍自产在线 | 中文久草 | 中文字幕中文字幕在线中文字幕三区 | 69国产精品成人在线播放 | 久久免费视频一区 | 国产精品精品国产色婷婷 | 国产精品12| 亚洲人成在线电影 | 中文字幕文字幕一区二区 | 精品视频免费久久久看 | 中文视频一区二区 | 色噜噜狠狠狠狠色综合 | 欧美视频日韩视频 | 亚洲女人av | 久久久久在线 | 国内视频 | 日韩欧美一区二区三区黑寡妇 | 色哟哟国产精品 | 免费a一级 | 亚洲精品午夜一区人人爽 | 国产群p视频 | 亚洲高清91| 欧美 日韩精品 | 99久久婷婷国产综合精品 | 亚洲三级在线免费观看 | 久久精品视频在线免费观看 | 国产偷在线 | 九九久久影院 | 亚洲国产wwwccc36天堂 | 日韩欧美在线影院 | 国产精品久久 | 伊人www22综合色 | 精品国产一区二区三区四区vr | 99精品成人 | 狠狠久久伊人 | 欧美日韩精品在线一区二区 | 国产精品视频在线观看 | 日韩美一区二区三区 | 午夜精品一区二区三区四区 | 伊人久久国产精品 | 国产精品乱看 | 久精品视频在线 | av资源免费观看 | 久久综合色播五月 | 91成人午夜| 免费毛片aaaaaa | 亚洲专区视频在线观看 | 国产精品9999久久久久仙踪林 | 韩国av免费在线 | 在线观看 亚洲 | 91 中文字幕 | 欧美日韩裸体免费视频 | 日韩欧美在线不卡 | 国产日韩在线看 | 99久久精品免费看国产一区二区三区 | 中文字幕网站视频在线 | 久久视频这里有精品 | 国产精品黄色 | 在线精品视频免费观看 | 欧美日韩一区二区免费在线观看 | 久久高清国产 | 视频99爱 | 日本一区二区三区免费看 | 国产999精品久久久 免费a网站 | 一区二区三区视频 | 福利视频一二区 | 在线精品在线 | 国产对白av | 美女视频一区二区 | 在线精品视频免费观看 | 久久亚洲私人国产精品 | 中文字幕av影院 | 香蕉网在线播放 | 五月天丁香亚洲 | 一区二区丝袜 | 欧美美女视频在线观看 | 国产精品igao视频网网址 | 国产在线传媒 | 91丨精品丨蝌蚪丨白丝jk | 毛片永久新网址首页 | 国产精品第十页 | 国产91粉嫩白浆在线观看 | 99精品免费久久久久久日本 | 国产黄色片免费在线观看 | 成人一区二区三区在线 | 一级欧美日韩 | 又黄又色又爽 | 欧美日韩性视频 | 亚洲 欧洲 国产 精品 | 亚洲激情在线观看 | 在线观看亚洲精品视频 | 久久久午夜电影 | 久久久综合色 | 18av在线视频 | 久久这里只有精品久久 | 亚洲视屏在线播放 | 亚洲国产欧美在线看片xxoo | adc在线观看| 国产精品美乳一区二区免费 | 久久成年人 | 四虎亚洲精品 | 国产破处在线视频 | 伊人国产女 | 国产日韩欧美中文 | 亚洲最新av在线网站 | 国产一级免费在线观看 | 久久国产精彩视频 | 免费视频成人 | 大胆欧美gogo免费视频一二区 | 欧美日韩精品网站 | 久久亚洲在线 | 国产看片 色 | 亚洲欧洲精品一区二区精品久久久 | 欧美一二区在线 | 亚洲电影在线看 | 日韩欧美在线观看一区二区三区 | 成人免费看片98欧美 | 国产精品美女久久久久久久网站 | 欧美日韩另类在线 |