精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

精品午夜福利视频| 国产亚洲视频一区| 国产日本在线| 奇米在线7777在线精品 | 午夜精品一区二区三区在线视| 制服丝袜第一页在线观看| 91精品影视| 一区二区成人在线观看| 欧美日韩国产高清视频| 国产又粗又大又黄| 一区二区91| 久久久av网站| 波多野结衣av在线免费观看| 亚洲精品大全| 欧美色播在线播放| 特色特色大片在线| 久草视频在线看| 国产一区二区三区四区五区美女| 欧美亚洲国产精品| 91九色丨porny丨极品女神| 天堂成人娱乐在线视频免费播放网站 | 青娱乐国产盛宴| 国模精品一区| 亚洲精美色品网站| 国产一级片中文字幕| 456成人影院在线观看| 亚洲福利电影网| 最新中文字幕久久| 91在线高清| 91网站黄www| 成人av网站观看| 91丨porny丨在线中文 | 182午夜在线观看| 手机在线理论片| 一区二区三区在线视频播放| 视频一区视频二区视频三区视频四区国产| 人人妻人人玩人人澡人人爽| 国产麻豆视频精品| 成人av.网址在线网站| 91精品国产高清一区二区三密臀| 樱桃成人精品视频在线播放| 欧美成人午夜激情在线| 手机av在线看| 99久久99久久精品国产片桃花| 国产一区二区日韩精品欧美精品| 亚洲制服丝袜在线播放| 国产成人精品亚洲线观看| 欧美一区二区三区在线看| 欧美日韩激情一区二区| 久久免费一区| 色久视频在线播放| 99久久er热在这里只有精品66| 波多野结衣成人在线| av中文在线观看| 国产毛片精品一区| 亚洲淫片在线视频| 国产xxxx在线观看| 国产精品一区二区三区99| 91精品久久久久久久久中文字幕| 又色又爽又黄无遮挡的免费视频| 日韩精品一区不卡| 日韩综合一区| 一区二区三区国产视频| 免费看黄色的视频| gogogo高清在线观看一区二区| 国产一区二区三区18| 亚洲最大成人网站| 国产亚洲一区| 中文字幕在线观看亚洲| 999精品在线视频| 伊人久久大香线| 久久99热精品这里久久精品| 国产成人精品亚洲男人的天堂| 18成人免费观看视频| 91超碰caoporn97人人| 国产成人无码一区二区三区在线| 亚洲免费婷婷| 国产极品精品在线观看| 97精品久久人人爽人人爽| 国产精品系列在线观看| 久久国产一区| 成人网视频在线观看| 国产亚洲欧美一区在线观看| 日本一区二区精品视频| 黄色成年人视频在线观看| 美女黄视频在线观看| 97精品超碰一区二区三区| 欧美日韩一区在线观看视频| 永久免费av在线| 亚洲一区二区综合| 男人透女人免费视频| 99久久久成人国产精品| 亚洲精品www久久久| 国产18无套直看片| 亚洲黄色av| 91精品国产综合久久久久久蜜臀 | 最近2019中文字幕一页二页| 中文字幕在线2021| 亚洲欧美视频| 亚洲a中文字幕| 欧美777四色影视在线| 综合色天天鬼久久鬼色| 欧美 日本 亚洲| 狂野欧美性猛交xxxx| 日韩av在线高清| 麻豆天美蜜桃91| 日日摸夜夜添夜夜添国产精品| 亚洲综合精品伊人久久| 国产视频第一区| 天天色综合天天| 国产高清av片| 国产精品欧美三级在线观看| 欧美激情中文字幕乱码免费| 欧美性猛交xxxx乱大交hd| 国产aⅴ综合色| 亚洲精品高清国产一线久久| 欧美xxxhd| 日韩欧美一区二区在线视频| 美国黄色特级片| 一区二区动漫| 国产午夜精品一区| av色综合久久天堂av色综合在| 一道本成人在线| 稀缺呦国内精品呦| 亚洲一级毛片| 国产综合视频在线观看| 成年人视频在线观看免费| 欧美日韩精品国产| 伊人久久一区二区三区| 国产在线欧美| 亚洲一区亚洲二区亚洲三区| av在线电影院| 91福利在线播放| 人妻大战黑人白浆狂泄| 中文一区在线| 国产嫩草一区二区三区在线观看| 国产秀色在线www免费观看| 欧美自拍丝袜亚洲| 中字幕一区二区三区乱码| 美女久久一区| 欧美午夜精品理论片a级大开眼界 欧美午夜精品久久久久免费视 | 日韩免费高清在线| 嫩草精品影院| 亚洲影院免费观看| 天天操精品视频| 国产精品麻豆久久| 91久久国产精品91久久性色| 调教视频免费在线观看| 欧美另类久久久品| 人人澡人人澡人人看| 国产综合久久久久久久久久久久| 在线一区亚洲| 精品国产18久久久久久二百| 久久天天躁夜夜躁狠狠躁2022| 国产又粗又长又大视频| 国产精品久久福利| av在线免费观看不卡| 国产精品激情| 精品无人乱码一区二区三区的优势| 92久久精品| 亚洲黄色片网站| 制服.丝袜.亚洲.中文.综合懂色| 91麻豆精东视频| 成年人视频在线免费| 日韩成人综合| 91九色露脸| av资源中文在线天堂| 亚洲精品中文字幕有码专区| 亚洲精品毛片一区二区三区| 一色桃子久久精品亚洲| 四虎1515hh.com| 欧美日韩 国产精品| 极品尤物一区二区三区| 偷拍精品精品一区二区三区| 日韩一区二区精品视频| 亚洲成人777777| 欧美视频一区二区三区…| 影音先锋男人在线| 国产精品88888| 精品国产免费av| 成人情趣视频网站| 99视频免费观看蜜桃视频| 国产直播在线| 中文字幕无线精品亚洲乱码一区 | 国产精品国产三级国产aⅴ中文| 在线视频观看91| 亚洲黄色影院| 亚洲欧洲日夜超级视频| 999在线精品| 国产精品99导航| av片在线观看| 日韩毛片在线观看| 97免费观看视频| 天天av天天翘天天综合网色鬼国产| 阿v天堂2014| 国产高清不卡一区二区| 欧美一级黄色影院| 国产精品啊啊啊| 亚洲精品影院| 精品日产乱码久久久久久仙踪林| 国产精品亚洲美女av网站| sm在线播放| 久久久91精品国产| 蜜桃免费在线| 精品久久久久久久久久久久久久久| aaa在线视频| 亚洲一卡二卡三卡四卡五卡| 亚洲天堂精品一区| 91免费看`日韩一区二区| www.成人黄色| 日韩和的一区二区| www国产精品内射老熟女| 亚洲国产精品91| 性欧美大战久久久久久久免费观看| julia中文字幕一区二区99在线| 国产精品久久中文| 日韩伦理在线一区| 欧美激情在线播放| a在线免费观看| 国产午夜精品一区二区三区| 日批视频免费播放| 日韩一级黄色片| 一级特黄aaa大片| 91精品福利视频| 欧美videossex极品| ...xxx性欧美| 成人无码精品1区2区3区免费看| 久久一区二区三区国产精品| 亚洲色偷偷色噜噜狠狠99网| 夫妻av一区二区| 麻豆精品国产传媒| 国产一区二区三区美女| 91福利国产成人精品播放| 久久免费高清| 秋霞无码一区二区| 日韩视频在线一区二区三区| 亚洲 欧美 综合 另类 中字| 欧美午夜视频| 91午夜在线观看| 国产精品xvideos88| 丁香婷婷综合激情| 欧美日韩久久| 国产成人在线小视频| 在线精品观看| 人妻少妇精品久久| 日韩网站在线| 国产免费成人在线| 久久男女视频| 爱情岛论坛成人| 免费一级片91| 亚洲欧美日韩精品一区| 精品一区二区三区的国产在线播放 | 欧美午夜精品久久久久久蜜| 黑丝美女一区二区| 色狠狠久久av五月综合|| 色综合久久一区二区三区| 在线看成人av电影| 综合激情在线| 一卡二卡三卡视频| 国产亚洲一级| 日本爱爱免费视频| 黄网站免费久久| 亚洲欧洲日韩综合| 成人v精品蜜桃久久一区| 国产一级二级视频| 国产午夜精品一区二区三区嫩草 | 国产免费一区二区三区香蕉精| 欧美高清你懂的| 91影院未满十八岁禁止入内| 国产精品宾馆| 日韩国产精品一区二区| 欧美黄色大片在线观看| 91精品国产毛片武则天| 国产精品毛片在线看| 国产视频一区二区视频| 国产一区二区伦理| 久久一区二区电影| 亚洲国产精品黑人久久久 | 日韩欧美中文免费| 中文字幕永久在线视频| 精品少妇一区二区三区日产乱码 | 日韩av免费大片| av片在线免费| 视频精品一区二区| 国产探花在线观看视频| 91在线播放网址| 性爱在线免费视频| 亚洲国产精品久久不卡毛片| 国产99久久久久久免费看| 91精品欧美综合在线观看最新| 黄色av小说在线观看| 伊人久久久久久久久久| 国产极品人妖在线观看| 国产精品久久久av| jizz久久精品永久免费| 一区二区精品免费视频| 亚洲精品社区| 免费黄频在线观看| 久久毛片高清国产| 久久这里只有精品国产| 欧美午夜一区二区三区| 日本美女一级视频| 久久深夜福利免费观看| 欧美专区福利免费| 国产精品免费一区二区三区| 欧美岛国激情| 日韩av资源在线| 国产成人精品三级麻豆| 91狠狠综合久久久久久| 欧美日韩一区二区三区在线免费观看| 国产精品久久影视| 亚洲人在线视频| 波多野一区二区| 亚洲一区二区久久久久久| 欧美三级情趣内衣| 毛片在线视频播放| 国产99一区视频免费| 成人免费毛片xxx| 欧美在线色视频| 色在线免费视频| 久久久久久欧美| 日韩一二三区| 国产欧美综合一区| 久久99久久99小草精品免视看| 双性尿奴穿贞c带憋尿| 亚洲国产wwwccc36天堂| 成人av无码一区二区三区| 日韩一区二区三区在线播放| 国产在线|日韩| 日本一区免费| 久久精品女人| 爱爱免费小视频| 欧美特级www| 三级在线观看| 全球成人中文在线| 亚洲最大在线| 成人在线观看黄| 久久精品人人做人人爽人人| 国产一区二区视频网站| 亚洲欧美变态国产另类| 97se综合| 欧美中日韩一区二区三区| 久久一二三四| 久久国产柳州莫菁门| 在线免费观看成人短视频| 国产高清一区在线观看| 国产精品久久中文| 久久久久午夜电影| 性生活一级大片| 一区二区三区免费看视频| 亚洲爱爱综合网| 777777777亚洲妇女| 亚洲福利网站| 九九热免费精品视频| 国产精品久久毛片a| 国产免费视频一区二区三区| 欧美乱妇40p| 女人抽搐喷水高潮国产精品| 妞干网在线免费视频| 国产欧美日韩另类视频免费观看| 亚洲性猛交富婆| 久久天天躁狠狠躁老女人| 一本色道69色精品综合久久| 最新av在线免费观看| 国产高清亚洲一区| 毛片在线免费视频| 亚洲最新在线视频| 精品久久国产一区| 日本人体一区二区| 国产午夜精品理论片a级大结局| 中文字幕有码视频| 欧美国产中文字幕| 三级精品视频| 91pony九色| 亚洲成a人片在线观看中文| 男同在线观看| 亚洲综合色av| 亚洲女人av| 精品国产大片大片大片| 精品国产免费视频| 巨胸喷奶水www久久久免费动漫| 黄色网址在线免费看| 91在线观看高清| 亚洲一区中文字幕在线| 久久久久久亚洲| 日韩在线中文| 中文视频在线观看| 欧美在线视频不卡| av影院在线免费观看| 一本一道久久a久久精品综合 | 免费看男女www网站入口在线| 奇米影视首页 狠狠色丁香婷婷久久综合 | 国产最新视频在线观看| 91福利视频导航| 久久99伊人| 久操免费在线视频| 夜夜嗨av一区二区三区免费区| 亚洲精品a区| 五月天亚洲视频| 精品久久久久久中文字幕一区奶水|