精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

面試官:說說你對Spring AOP的實現機制的理解!

開發 后端
靜態代理是編譯期實現,動態代理是運行期實現,可想而知前者擁有更好的性能。本文主要介紹Spring AOP的兩種代理實現機制,JDK動態代理和CGLIB動態代理。

 

AOP(Aspect Orient Programming),一般稱為面向切面編程,作為面向對象的一種補充,用于處理系統中分布于各個模塊的橫切關注點,比如事務管理、日志、緩存等等。AOP實現的關鍵在于AOP框架自動創建的AOP代理,AOP代理主要分為靜態代理和動態代理,靜態代理的代表為AspectJ;而動態代理則以Spring AOP為代表。靜態代理是編譯期實現,動態代理是運行期實現,可想而知前者擁有更好的性能。

本文主要介紹Spring AOP的兩種代理實現機制,JDK動態代理和CGLIB動態代理。

靜態代理是編譯階段生成AOP代理類,也就是說生成的字節碼就織入了增強后的AOP對象;動態代理則不會修改字節碼,而是在內存中臨時生成一個AOP對象,這個AOP對象包含了目標對象的全部方法,并且在特定的切點做了增強處理,并回調原對象的方法。

Spring AOP中的動態代理主要有兩種方式,JDK動態代理和CGLIB動態代理。JDK動態代理通過反射來接收被代理的類,并且要求被代理的類必須實現一個接口。JDK動態代理的核心是InvocationHandler接口和Proxy類。

如果目標類沒有實現接口,那么Spring AOP會選擇使用CGLIB來動態代理目標類。CGLIB(Code Generation Library),是一個代碼生成的類庫,可以在運行時動態的生成某個類的子類,注意,CGLIB是通過繼承的方式做的動態代理,因此如果某個類被標記為final,那么它是無法使用CGLIB做動態代理的,諸如private的方法也是不可以作為切面的。

我們分別通過實例來研究AOP的具體實現。

直接使用Spring AOP

首先定義需要切入的接口和實現。為了簡單起見,定義一個Speakable接口和一個具體的實現類,只有兩個方法sayHi()和sayBye()。 

  1. public interface Speakable {  
  2.  void sayHi();  
  3.  void sayBye();  
  4.  
  5. @Service  
  6. public class PersonSpring implements Speakable {  
  7.  @Override  
  8.  public void sayHi() {  
  9.  try {  
  10.  Thread.currentThread().sleep(30);  
  11.  } catch (Exception e) {  
  12.  throw new RuntimeException(e);  
  13.  }  
  14.  System.out.println("Hi!!");  
  15.  }  
  16.  @Override  
  17.  public void sayBye() {  
  18.  try {  
  19.  Thread.currentThread().sleep(10);  
  20.  } catch (Exception e) {  
  21.  throw new RuntimeException(e);  
  22.  }  
  23.  System.out.println("Bye!!");  
  24.  }  

接下來我們希望實現一個記錄sayHi()和sayBye()執行時間的功能。

定義一個MethodMonitor類用來記錄Method執行時間 

  1. public class MethodMonitor {  
  2.  private long start;  
  3.  private String method;  
  4.  public MethodMonitor(String method) {  
  5.  this.method = method;  
  6.  System.out.println("begin monitor..");  
  7.  this.start = System.currentTimeMillis();  
  8.  }  
  9.  public void log() {  
  10.  long elapsedTime = System.currentTimeMillis() - start;  
  11.  System.out.println("end monitor..");  
  12.  System.out.println("Method: " + method + ", execution time: " + elapsedTime + " milliseconds.");  
  13.  }  

光有這個類還是不夠的,希望有個靜態方法用起來更順手,像這樣 

  1. MonitorSession.begin();  
  2. doWork();  
  3. MonitorSession.end(); 

說干就干,定義一個MonitorSession 

  1. public class MonitorSession {  
  2.  private static ThreadLocal<MethodMonitor> monitorThreadLocal = new ThreadLocal<>();  
  3.  public static void begin(String method) {  
  4.  MethodMonitor logger = new MethodMonitor(method);  
  5.  monitorThreadLocal.set(logger);  
  6.  }  
  7.  public static void end() {  
  8.  MethodMonitor logger = monitorThreadLocal.get();  
  9.  logger.log();  
  10.  }  

萬事具備,接下來只需要我們做好切面的編碼, 

  1. @Aspect  
  2. @Component  
  3. public class MonitorAdvice {  
  4.  @Pointcut("execution (* com.deanwangpro.aop.service.Speakable.*(..))")  
  5.  public void pointcut() {  
  6.  }  
  7.  @Around("pointcut()")  
  8.  public void around(ProceedingJoinPoint pjp) throws Throwable {  
  9.  MonitorSession.begin(pjp.getSignature().getName());  
  10.  pjp.proceed();  
  11.  MonitorSession.end();  
  12.  }  

如何使用?我用了spring boot,寫一個啟動函數吧。 

  1. @SpringBootApplication  
  2. public class Application {  
  3.  @Autowired  
  4.  private Speakable personSpring;  
  5.  public static void main(String[] args) {  
  6.  SpringApplication.run(Application.class, args);  
  7.  }  
  8.  @Bean  
  9.  public CommandLineRunner commandLineRunner(ApplicationContext ctx) {  
  10.  return args -> {  
  11.  // spring aop  
  12.  System.out.println("******** spring aop ******** ");  
  13.  personSpring.sayHi();  
  14.  personSpring.sayBye();  
  15.  System.exit(0);  
  16.  };  
  17.  }  

運行后輸出:   

  1. jdk dynamic proxy begin monitor..Hi!!end monitor..Method: sayHi, execution time: 32 milliseconds.begin monitor..Bye!!end monitor..Method: sayBye, execution time: 22 milliseconds. 

JDK動態代理

剛剛的例子其實內部實現機制就是JDK動態代理,因為Person實現了一個接口。

為了不和***個例子沖突,我們再定義一個Person來實現Speakable, 這個實現是不帶Spring Annotation的,所以他不會被Spring托管。 

  1. public class PersonImpl implements Speakable {  
  2.  @Override  
  3.  public void sayHi() {  
  4.  try {  
  5.  Thread.currentThread().sleep(30);  
  6.  } catch (Exception e) {  
  7.  throw new RuntimeException(e);  
  8.  }  
  9.  System.out.println("Hi!!");  
  10.  }  
  11.  @Override  
  12.  public void sayBye() {  
  13.  try {  
  14.  Thread.currentThread().sleep(10);  
  15.  } catch (Exception e) {  
  16.  throw new RuntimeException(e);  
  17.  }  
  18.  System.out.println("Bye!!");  
  19.  }  

重頭戲來了,我們需要利用InvocationHandler實現一個代理,讓它去包含Person這個對象。那么再運行期實際上是執行這個代理的方法,然后代理再去執行真正的方法。所以我們得以在執行真正方法的前后做一些手腳。JDK動態代理是利用反射實現,直接看代碼。 

  1. public class DynamicProxy implements InvocationHandler {  
  2.  private Object target;  
  3.  public DynamicProxy(Object object) {  
  4.  this.target = object 
  5.  }  
  6.  @Override  
  7.  public Object invoke(Object arg0, Method arg1, Object[] arg2)  
  8.  throws Throwable {  
  9.  MonitorSession.begin(arg1.getName());  
  10.  Object obj = arg1.invoke(target, arg2);  
  11.  MonitorSession.end();  
  12.  return obj;  
  13.  }  
  14.  @SuppressWarnings("unchecked")  
  15.  public <T> T getProxy() {  
  16.  return (T) Proxy.newProxyInstance(  
  17.  target.getClass().getClassLoader(),  
  18.  target.getClass().getInterfaces(),  
  19.  this  
  20.  );  
  21.  }  

通過getProxy可以得到這個代理對象,invoke就是具體的執行方法,可以看到我們在執行每個真正的方法前后都加了Monitor。

我實現了一個工廠類來獲取Person代理對象 

  1. public class PersonProxyFactory {  
  2.  public static Speakable newJdkProxy() {  
  3.  // 代理PersonImpl  
  4.  DynamicProxy dynamicProxy = new DynamicProxy(new PersonImpl());  
  5.  Speakable proxy = dynamicProxy.getProxy();  
  6.  return proxy;  
  7.  }  

具體使用 

  1. // jdk dynamic proxy  
  2. System.out.println("******** jdk dynamic proxy ******** ");  
  3. Speakable jdkProxy = PersonProxyFactory.newJdkProxy();  
  4. jdkProxy.sayHi();  
  5. jdkProxy.sayBye(); 

輸出結果: 

  1. ******** jdk dynamic proxy ********   
  2. begin monitor..  
  3. Hi!!  
  4. end monitor..  
  5. Method: sayHi, execution time: 32 milliseconds.  
  6. begin monitor..  
  7. Bye!!  
  8. end monitor..  
  9. Method: sayBye, execution time: 22 milliseconds. 

CGLib動態代理

我們再新建一個Person來,這次不實現任何接口。 

  1. public class Person {  
  2.  public void sayHi() {  
  3.  try {  
  4.  Thread.currentThread().sleep(30);  
  5.  } catch (Exception e) {  
  6.  throw new RuntimeException(e);  
  7.  }  
  8.  System.out.println("Hi!!");  
  9.  }  
  10.  public void sayBye() {  
  11.  try {  
  12.  Thread.currentThread().sleep(10);  
  13.  } catch (Exception e) {  
  14.  throw new RuntimeException(e);  
  15.  }  
  16.  System.out.println("Bye!!");  
  17.  }  

如果Spring識別到所代理的類沒有實現Interface,那么就會使用CGLib來創建動態代理,原理實際上成為所代理類的子類。 

  1. public class CGLibProxy implements MethodInterceptor {  
  2.  private static CGLibProxy instance = new CGLibProxy();  
  3.  private CGLibProxy() {  
  4.  }  
  5.  public static CGLibProxy getInstance() {  
  6.  return instance;  
  7.  }  
  8.  private Enhancer enhancer = new Enhancer();  
  9.  @SuppressWarnings("unchecked")  
  10.  public <T> T getProxy(Class<T> clazz) {  
  11.  enhancer.setSuperclass(clazz);  
  12.  enhancer.setCallback(this);  
  13.  return (T) enhancer.create();  
  14.  }  
  15.  @Override  
  16.  public Object intercept(Object arg0, Method arg1, Object[] arg2,  
  17.  MethodProxy arg3) throws Throwable {  
  18.  MonitorSession.begin(arg1.getName());  
  19.  Object obj = arg3.invokeSuper(arg0, arg2);  
  20.  MonitorSession.end();  
  21.  return obj;  
  22.  }  

類似的通過getProxy可以得到這個代理對象,intercept就是具體的執行方法,可以看到我們在執行每個真正的方法前后都加了Monitor。

在工廠類中增加獲得Person代理類的方法, 

  1. public static Person newCglibProxy() {  
  2.  CGLibProxy cglibProxy = CGLibProxy.getInstance();  
  3.  Person proxy = cglibProxy.getProxy(Person.class);  
  4.  return proxy;  

具體使用 

  1. // cglib dynamic proxy  
  2. System.out.println("******** cglib proxy ******** ");  
  3. Person cglibProxy = PersonProxyFactory.newCglibProxy();  
  4. cglibProxy.sayHi();  
  5. cglibProxy.sayBye(); 

輸出結果: 

  1. begin monitor..Hi!!end monitor..Method: sayHi, execution time: 53 milliseconds.begin monitor..Bye!!end monitor..Method: sayBye, execution time: 14 milliseconds. 

小結

對比JDK動態代理和CGLib代理,在實際使用中發現CGLib在創建代理對象時所花費的時間卻比JDK動態代理要長,實測數據 

  1. Method: newJdkProxy, execution time: 5 milliseconds.  
  2. Method: newCglibProxy, execution time: 18 milliseconds. 

所以CGLib更適合代理不需要頻繁實例化的類。

在具體方法執行效率方面,理應是不通過反射的CGlib更快一些,然后測試結果并非如此,還需要高手指教。   

  1. JDKMethod: sayHi, execution time: 32 milliseconds.CGLibMethod: sayHi, execution time: 53 milliseconds.  
責任編輯:龐桂玉 來源: 今日頭條
相關推薦

2021-08-09 07:47:40

Git面試版本

2021-11-25 10:18:42

RESTfulJava互聯網

2020-06-12 15:50:56

options前端服務器

2020-12-01 08:47:36

Java異常開發

2021-11-02 22:04:58

模式

2021-09-16 07:52:18

算法應用場景

2021-09-29 07:24:20

場景數據

2021-09-28 07:12:09

測試路徑

2021-06-30 07:19:36

React事件機制

2021-10-09 10:25:41

排序應用場景

2021-11-10 07:47:49

組合模式場景

2021-08-16 08:33:26

git

2022-02-21 17:24:18

序列化對象存儲

2021-11-03 14:10:28

工廠模式場景

2021-10-13 18:01:33

快速排序場景

2021-10-08 09:59:32

冒泡排序場景

2021-11-05 07:47:56

代理模式對象

2020-12-04 06:27:04

序列化面試官Java

2021-11-09 08:51:13

模式命令面試

2021-09-27 06:50:04

非線性數據
點贊
收藏

51CTO技術棧公眾號

成人全视频在线观看在线播放高清| 91国内精品视频| 中日韩免视频上线全都免费| 欧美午夜宅男影院| 男人添女荫道口女人有什么感觉| 三级在线电影| 国产一区久久久| 青草青草久热精品视频在线网站| 国产aaaaaaaaa| 国产另类在线| 91精品婷婷国产综合久久 | 国产精品夜夜夜| 少妇高潮久久久久久潘金莲| 日本少妇xxxx| 国产aⅴ精品一区二区四区| 欧美性猛交xxxx| 成人国产在线看| www.在线播放| 91美女精品福利| 国产高清在线一区| 91影院在线播放| 日本视频一区二区三区| 韩国欧美亚洲国产| 国产传媒免费在线观看| 精品久久久亚洲| 日韩精品在线观看一区| 农村末发育av片一区二区| 日韩毛片免费看| 色婷婷激情综合| 国产精品一区二区免费在线观看| 亚洲资源一区| 亚洲欧洲成人av每日更新| 欧洲高清一区二区| 亚洲av成人精品日韩在线播放| 国产999精品久久久久久| 成人免费看吃奶视频网站| 亚洲av无码乱码国产精品fc2| 99视频一区| 国语自产精品视频在线看一大j8| 精品人妻在线播放| 牛夜精品久久久久久久99黑人| 中文字幕亚洲一区| 国产三级在线观看完整版| 国产精品一区二区av日韩在线| 亚洲国产成人久久| 日韩无码精品一区二区| 丁香婷婷成人| 亚洲韩国青草视频| xxxx黄色片| 人体久久天天| 亚洲欧美另类在线观看| a级在线免费观看| 欧美日韩激情| 久久精品在线视频| www青青草原| 一区免费在线| 欧美人与物videos| 日韩高清精品免费观看| 99国产精品自拍| 热久久这里只有| 免费看av在线| 经典三级在线一区| 51精品国产人成在线观看| 亚洲黄色一级大片| 99精品久久只有精品| 久久综合九色欧美狠狠| 黄色影院在线播放| 国产精品乱人伦| 人妻无码一区二区三区四区| 黄网站在线观| 欧美视频第一页| 国产一区二区在线免费播放| 国产剧情一区二区在线观看| 精品奇米国产一区二区三区| 亚洲永久无码7777kkk| 成人高清av| 日韩一区二区三区在线播放| 日本a级片视频| 一本色道精品久久一区二区三区 | www毛片com| 琪琪一区二区三区| 91福利视频导航| 天天色综合久久| 国产精品你懂的在线欣赏| 久久亚洲a v| 欧美电影免费看| 日韩一区二区三区电影在线观看| av鲁丝一区鲁丝二区鲁丝三区| 欧美日韩一区二区三区视频播放| 久久色在线播放| 中文字幕亚洲精品一区| 美女在线视频一区| 国产亚洲一区二区三区在线播放 | 色先锋久久影院av| 久久久成人精品视频| 91看片在线播放| 美女www一区二区| 国产综合av一区二区三区| 91亚洲精选| 亚瑟在线精品视频| 五月婷婷之婷婷| 欧美一区自拍| 久久亚洲国产精品成人av秋霞| 韩国av中文字幕| 国产精品2024| 亚洲欧洲在线一区| 成人免费看视频网站| 日韩视频一区二区三区在线播放| 国产熟女一区二区| 在线日韩av| 亚洲xxx自由成熟| 成人性生交大片免费看午夜 | 久久精品国产精品亚洲| 亚洲午夜18毛片在线看| 国产成人av资源| 杨幂一区欧美专区| 秋霞国产精品| 亚洲精品suv精品一区二区| 色老板免费视频| 免费成人av在线播放| 免费成人深夜夜行视频| a国产在线视频| 日韩久久精品一区| 来吧亚洲综合网| 免费av成人在线| 欧美日韩成人一区二区三区| 欧美aa免费在线| 精品国产乱码久久久久久蜜臀| 国产高潮流白浆| 经典一区二区三区| 日本三级福利片| 欧美三级电影网址| 在线播放国产一区二区三区| 永久免费无码av网站在线观看| 91一区一区三区| 中国丰满人妻videoshd | 亚洲欧洲精品在线 | 欧美午夜理伦三级在线观看| 在线观看福利片| 美女网站久久| 日本精品一区二区| 69堂精品视频在线播放| 亚洲人成网站999久久久综合| 亚洲伊人成人网| 91麻豆免费视频| 免费毛片小视频| 美女网站一区| 国产精国产精品| avav免费在线观看| 欧美日韩国产免费| 暗呦丨小u女国产精品| 国产一区二区精品在线观看| 久久香蕉视频网站| 黑人久久a级毛片免费观看| 久久久人成影片一区二区三区| 人妻无码中文字幕| 欧美视频中文在线看| 欧美黄色一级生活片| 青草国产精品久久久久久| 在线视频欧美一区| 性欧美video另类hd尤物| 欧美剧在线观看| 日韩有码第一页| 色久综合一二码| 操她视频在线观看| 国产69精品久久99不卡| 国产婷婷一区二区三区| 美女亚洲一区| 成人精品久久一区二区三区| 国模雨婷捆绑高清在线| 日韩高清av一区二区三区| 黄色网址中文字幕| |精品福利一区二区三区| 国产伦理在线观看| 奶水喷射视频一区| 一区二区三区视频| 二区三区精品| 97超碰色婷婷| 色网站在线看| 亚洲国产免费av| 91片黄在线观看喷潮| 亚洲第一av色| 综合 欧美 亚洲日本| 成人免费毛片高清视频| 一区二区三区国产免费| 欧美一区二区三区另类| 欧美精品一区三区在线观看| 国产精品麻豆| 日本高清不卡在线| 欧美午夜大胆人体| 中文字幕av一区二区| 天天干视频在线| 欧美三级三级三级爽爽爽| 久久久国产成人| 欧美激情一区二区三区| 97人妻精品一区二区三区免费| 蜜臀久久久久久久| 日韩精品xxxx| 欧美成人久久| 手机在线观看国产精品| 菁菁伊人国产精品| 91九色综合久久| 韩国久久久久久| 久久久久久久久久久免费| 午夜精品一区| 亚洲国产中文字幕在线观看 | 日韩精品福利在线| 国产成人三级在线播放 | 成人毛片在线精品国产| 欧美乱熟臀69xxxxxx| 黄色在线视频网址| 午夜电影网一区| www.色小姐com| 国产精品久久久久影院色老大| 中文字幕在线观看的网站| 国产a级毛片一区| caoporm在线视频| 免费国产亚洲视频| 色欲av无码一区二区人妻| 亚洲精品1区| 久久男人资源站| 欧美一区综合| av动漫免费观看| 久久中文亚洲字幕| 欧洲在线视频一区| 免费欧美激情| 九九九久久久| 欧美日韩麻豆| 韩国精品一区二区三区六区色诱| 九九九九九九精品任你躁| 国产精品亚洲аv天堂网| 制服丝袜专区在线| 5278欧美一区二区三区| h片精品在线观看| 欧美精品www| 美女日批视频在线观看| 欧美日本精品在线| 污影院在线观看| 欧美激情欧美激情在线五月| 在线免费观看的av| 欧美精品情趣视频| 新版中文在线官网| 欧美高清无遮挡| 久操av在线| 性色av一区二区三区免费| 18aaaa精品欧美大片h| 午夜精品久久久久久久男人的天堂| gogo高清午夜人体在线| 97成人超碰免| 日韩免费va| 国产精品一区二区三区久久| 日韩一级特黄| 亚洲xxxxx电影| 999久久久精品一区二区| 国产精品久久国产精品| 日韩高清成人在线| 日韩精品久久久| 91视频精品| 国产精品无码电影在线观看| 亚洲视频福利| 免费在线观看亚洲视频| 石原莉奈在线亚洲三区| 天天干天天爽天天射| 国产一区二区在线观看视频| 肉丝美足丝袜一区二区三区四| 成人av网址在线观看| 精品无人区无码乱码毛片国产| 欧美韩国一区二区| 1024手机在线视频| 欧美日韩国产精品一区| 在线观看亚洲黄色| 91精品国产综合久久国产大片| 亚洲大尺度网站| 亚洲欧美在线一区二区| wwwww在线观看免费视频| 欧美第一黄色网| 欧美极度另类| 亚洲精品日产aⅴ| 少妇一区二区三区| 久久久国产精华液999999| 在线看片欧美| 国产高潮免费视频| 豆国产96在线|亚洲| 一级片手机在线观看| 亚洲九九爱视频| 人人草在线观看| 日韩一区二区高清| 国产在线一二三| 欧美成aaa人片在线观看蜜臀| 无遮挡在线观看| 91在线|亚洲| 蜜臀av免费一区二区三区| 小泽玛利亚av在线| 日本aⅴ亚洲精品中文乱码| 亚洲麻豆一区二区三区| 中文字幕日韩av资源站| 人人干人人干人人干| 欧美久久高跟鞋激| 日韩av免费观影| 久久久电影免费观看完整版| 欧美成人精品三级网站| 成人欧美一区二区三区在线观看| 久久精品国产68国产精品亚洲| 女人天堂av手机在线| 狠狠色丁香婷婷综合久久片| 亚洲人成人无码网www国产| 一区二区三区av电影| 亚洲天堂国产精品| 国产亚洲福利一区| а√天堂中文资源在线bt| 91亚洲国产成人久久精品网站 | 黑人巨大国产9丨视频| 久久久久.com| 精品无码在线视频| 午夜精品久久久久久久蜜桃app| 国产日韩免费视频| 日韩小视频在线| jizz亚洲女人高潮大叫| 蜜桃视频在线观看91| 亚洲精选91| 95视频在线观看| 亚洲精品成a人| 国产精品一区二区av白丝下载| 亚洲最大在线视频| 另类中文字幕国产精品| 奇米精品在线| 视频在线观看91| 我和岳m愉情xxxⅹ视频| 精品美女永久免费视频| 人妻91麻豆一区二区三区| 欧美激情欧美激情在线五月| 在线日韩成人| 日韩美女爱爱视频| 播五月开心婷婷综合| 亚洲综合一二三| 亚洲国产精品人人爽夜夜爽| a国产在线视频| 久久久99国产精品免费| 国产日韩欧美在线播放不卡| 人妻体内射精一区二区三区| 亚洲狠狠爱一区二区三区| 免费国产精品视频| 97精品视频在线观看| 猫咪成人在线观看| 国产极品尤物在线| 久久综合av免费| а中文在线天堂| 色悠悠国产精品| 一区在线不卡| 青青草原网站在线观看| 国产一区二区电影| 久久午夜无码鲁丝片| 亚洲第一视频网站| 中文字幕影音在线| 日本一区二区久久精品| 日本不卡的三区四区五区| 国产18无套直看片| 日韩视频在线永久播放| 超碰资源在线| 欧美在线日韩精品| 久久99精品国产.久久久久久| 欧美做爰啪啪xxxⅹ性| 精品国产乱码久久久久久牛牛| 日韩av影片| 天堂资源在线亚洲视频| 国产在线精品免费| 日本熟妇毛茸茸丰满| 国产一区二区三区在线视频| 999久久久国产999久久久| 欧美性潮喷xxxxx免费视频看| 久久男人中文字幕资源站| 在线观看中文字幕av| 欧美日韩成人在线播放| 九九精品久久| 黄色aaaaaa| 欧美三级欧美成人高清www| 日本不卡不卡| 国产视频在线观看一区| 免费人成网站在线观看欧美高清| 91高清免费观看| 亚洲欧洲国产一区| 免费看日产一区二区三区| 日本不卡在线观看视频| 亚洲丝袜美腿综合| 青青青免费视频在线2| 亚洲xxxxx性| 日韩成人一级片| 18精品爽视频在线观看| 国产一区二区三区网站| jizz国产精品| 久热在线视频观看| 欧美日韩在线另类| 黄色在线免费网站| 欧美日韩一区二区视频在线观看| 国产一区二三区| 欧美男人天堂网| 91产国在线观看动作片喷水| 亚洲电影影音先锋| 夜夜春很很躁夜夜躁| 亚洲成色777777女色窝|