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

超全MyBatis動態代理詳解!

開發 前端
眾所周知哈,Mybatis 底層封裝使用的 JDK 動態代理。說 Mybatis 動態代理之前,先來看一下平常我們寫的動態代理 Demo,拋磚引玉.

[[375755]]

本文轉載自微信公眾號「源碼興趣圈」,作者龍臺  。轉載本文請聯系源碼興趣圈公眾號。 

前言

假如有人問你這么幾個問題,看能不能答上來

  1. Mybatis Mapper 接口沒有實現類,怎么實現的動態代理
  2. JDK 動態代理為什么不能對類進行代理(充話費送的問題)
  3. 抽象類可不可以進行 JDK 動態代理(附加問題)

答不上來的鐵汁,證明 Proxy、Mybatis 源碼還沒看到位。不過沒有關系,繼續往下看就明白了

動態代理實戰

眾所周知哈,Mybatis 底層封裝使用的 JDK 動態代理。說 Mybatis 動態代理之前,先來看一下平常我們寫的動態代理 Demo,拋磚引玉

一般來說定義 JDK 動態代理分為三個步驟,如下所示

  1. 定義代理接口
  2. 定義代理接口實現類
  3. 定義動態代理調用處理器

三步代碼如下所示,玩過動態代理的小伙伴看過就能明白

  1. public interface Subject { // 定義代理接口 
  2.     String sayHello(); 
  3.  
  4. public class SubjectImpl implements Subject {  // 定義代理接口實現類 
  5.     @Override 
  6.     public String sayHello() { 
  7.         System.out.println(" Hello World"); 
  8.         return "success"
  9.     } 
  10.  
  11. public class ProxyInvocationHandler implements InvocationHandler {  // 定義動態代理調用處理器 
  12.     private Object target; 
  13.  
  14.     public ProxyInvocationHandler(Object target) { 
  15.         this.target = target; 
  16.     } 
  17.  
  18.     @Override 
  19.     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 
  20.         System.out.println(" 🧱 🧱 🧱 進入代理調用處理器 "); 
  21.         return method.invoke(target, args); 
  22.     } 

1.寫個測試程序,運行一下看看效果,同樣是分三步

2.創建被代理接口的實現類

  • 創建動態代理類,說一下三個參數
  • 類加載器
  • 被代理類所實現的接口數組

3.用處理器(調用被代理類方法,每次都經過它)

被代理實現類調用方法

  1. public class ProxyTest { 
  2.     public static void main(String[] args) { 
  3.         Subject subject = new SubjectImpl(); 
  4.         Subject proxy = (Subject) Proxy 
  5.                 .newProxyInstance( 
  6.                         subject.getClass().getClassLoader(), 
  7.                         subject.getClass().getInterfaces(), 
  8.                         new ProxyInvocationHandler(subject)); 
  9.  
  10.         proxy.sayHello(); 
  11.         /** 
  12.          * 打印輸出如下 
  13.          * 調用處理器:🧱 🧱 🧱 進入代理調用處理器 
  14.          * 被代理實現類:Hello World 
  15.          */ 
  16.     } 

Demo 功能實現了,大致運行流程也清楚了,下面要針對原理實現展開分析

動態代理原理分析

從原理的角度上解析一下,上面動態代理測試程序是如何執行的

第一步簡單明了,創建了 Subject 接口的實現類,也是我們常規的實現

第二步是創建被代理對象的動態代理對象。這里有朋友就問了,怎么證明這是個動態代理對象?如圖所示

JDK 動態代理對象名稱是有規則的,凡是經過 Proxy 類生成的動態代理對象,前綴必然是 $Proxy,后面的數字也是名稱組成部分

如果有小伙伴想要一探究竟,關注 Proxy 內部類 ProxyClassFactory,這里會有想要的答案

回歸正題,繼續看一下 ProxyInvocationHandler,內部保持了被代理接口實現類的引用,invoke 方法內部使用反射調用被代理接口實現類方法

可以看出生成的動態代理類,繼承了 Proxy 類,然后對 Subject 接口進行了實現,而實現方法 sayHello 中實際調用的是 ProxyInvocationHandler 的 invoke 方法

一不小心發現了 JDK 動態代理不能對類進行代理的原因 ^ ^

也就是說,當我們調用 Subject#sayHello 時,方法調用鏈是這樣的

但是,Demo 里有被代理接口的實現類,Mybatis Mapper 沒有,這要怎么玩

不知道不要緊,知道了估計也看不到這了,一起看下 mybatis 源碼是怎么玩的

mybatis version:3.4.x

Mybatis 源碼實現

不知道大家考沒考慮過這么一個問題,Mybatis Mapper 為什么不需要實現類?

假如說,我們項目使用的三層設計,Controller 控制請求接收,Service 負責業務處理,Mapper 負責數據庫交互

Mapper 層也就是我們常說的數據庫映射層,負責對數據庫的操作,比如對數據的查詢或者新增、刪除等

大膽設想下,項目沒有使用 Mybatis,需要在 Mapper 實現層寫數據庫交互,會寫一些什么內容?

會寫一些常規的 JDBC 操作,比如:

  1. // 裝載Mysql驅動 
  2. Class.forName(driveName); 
  3. // 獲取連接 
  4. con = DriverManager.getConnection(url, user, pass); 
  5. // 創建Statement 
  6. Statement state = con.createStatement(); 
  7. // 構建SQL語句 
  8. String stuQuerySqlStr = "SELECT * FROM STUDENT"
  9. // 執行SQL返回結果 
  10. ResultSet result = state.executeQuery(stuQuerySqlStr); 
  11. ... 

如果項目中所有 Mapper 實現層都要這么玩,那豈不是很想打人...

所以 Mybatis 結合項目痛點,應運而生,怎么做的呢

將所有和 JDBC 交互的操作,底層采用 JDK 動態代理封裝,使用者只需要自定義 Mapper 和 .xml 文件

SQL 語句定義在 .xml 文件或者 Mapper 中,項目啟動時通過解析器解析 SQL 語句組裝為 Java 中的對象

解析器分為多種,因為 Mybatis 中不僅有靜態語句,同時也包含動態 SQL 語句

這也就是為什么 Mapper 接口不需要實現類,因為都已經被 Mybatis 通過動態代理封裝了,如果每個 Mapper 都來一個實現類,臃腫且無用。經過這一頓操作,展示給我們的就是項目里用到的 Mybatis 框架

上面鋪墊這么久,終于要到主角了,為什么 Mybatis Mapper 接口沒有實現類也可以實現動態代理

想要嚴格按照先后順序介紹 Mybatis 動態代理流程,而不超前引用未介紹過的術語,這幾乎是不可能的,筆者盡量說的通俗易懂

無實現類完成動態代理

核心點來了,拿起小本本坐板正了

我們先來看下普通動態代理有沒有可能不用實現類,僅靠接口完成

  1. public interface Subject { 
  2.     String sayHello(); 
  3.  
  4. public class ProxyInvocationHandler implements InvocationHandler { 
  5.  
  6.     @Override 
  7.     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 
  8.         System.out.println(" 🧱 🧱 🧱 進入代理調用處理器 "); 
  9.         return "success"
  10.     } 

根據代碼可以看到,我們并沒有實現接口 Subject,繼續看一下怎么實現動態代理

  1. public class ProxyTest { 
  2.     public static void main(String[] args) { 
  3.         Subject proxy = (Subject) Proxy 
  4.                 .newProxyInstance( 
  5.                         subject.getClass().getClassLoader(), 
  6.                         new Class[]{Subject.class}, 
  7.                         new ProxyInvocationHandler()); 
  8.  
  9.         proxy.sayHello(); 
  10.         /** 
  11.          * 打印輸出如下 
  12.          * 調用處理器:🧱 🧱 🧱 進入代理調用處理器 
  13.          */ 
  14.     } 

可以看到,對比文初的 Demo,這里對 Proxy.newProxyInstance 方法的參數作出了變化

之前是通過實現類獲取所實現接口的 Class 數組,而這里是把接口本身放到 Class 數組中,殊歸同途

有實現類接口和無實現類接口產生的動態代理類有什么區別

  1. 有實現類接口是對 InvocationHandler#invoke 方法調用,invoke 方法通過反射調用被代理對象(SubjectImpl)方法(sayHello)
  2. 無實現類接口則是僅對 InvocationHandler#invoke 產生調用。所以有實現類接口返回的是被代理對象接口返回值,而無實現類接口返回的僅是 invoke 方法返回值

InvocationHandler#invoke 方法返回值是 success 字符串,定義個字符串變量,是否能成功返回

現在第一個問題答案已經浮現,Mapper 沒有實現類,所有調用 JDBC 等操作都是在 Mybatis InvocationHandler 實現的

問題既然已經得到了解決,給人一種感覺,好像沒那么難,但是你不好奇,Mybatis 底層怎么做的么?

先拋出一個問題,然后帶著問題去看源碼,可能讓你記憶 Double 倍深刻

咱們 Demo 里的接口是固定的,Mybatis Mapper 可是不固定的,怎么搞?

Mybatis 是這么說的

看看 Mybatis 底層它怎么實現的動態接口代理,小伙伴只需要關注標記處的代碼即可

和我們的 Demo 代碼很像,核心點在于 mapperInterface 它是怎么賦值的

先來說一下 Mybatis 代理工廠中具體生成動態代理類具體邏輯

  1. 根據 .xml 上關聯的 namespace, 通過 Class#forName 反射的方式返回 Class 對象(不止 .xml namespace 一種方式)
  2. 將得到的 Class 對象(實際就是接口對象)傳遞給 Mybatis 代理工廠生成代理對象,也就是剛才 mapperInterface 屬性

謎底揭曉,Mybatis 使用接口全限定名通過 Class#forName 生成 Class 對象,這個 Class 對象類型就是接口

為了方便大家理解,通過 Mybatis 源碼提供的測試類舉例。假設已有接口 AutoConstructorMapper 以及對應的 .xml 如下

執行第一步,根據 .xml namespace 得到 Class 對象

首先第一步獲取 .xml 上 mapper 標簽 namespace 屬性,得到 mapper 接口全限定信息

根據 mapper 全限定信息獲取 Class 對象

添加到對應的映射器容器中,等待生成動態代理對象

如果此時調用生成動態代理對象,代理工廠 newInstance 方法如下:

至此,文初提的 Proxy、Mybatis 動態代理相關問題已全部答疑

抽象類能否 JDK 動態代理

說代碼前結論先行,不能!

  1. public abstract class AbstractProxy { 
  2.     abstract void sayHello(); 
  3.  
  4. AbstractProxy proxyInterface = (AbstractProxy) Proxy 
  5.         .newProxyInstance( 
  6.                 ProxyTest.class.getClassLoader(), 
  7.                 new Class[]{AbstractProxy.class}, 
  8.                 new ProxyInvocationHandler()); 
  9. proxyInterface.sayHello(); 

毫無疑問,報錯是必然的,JDK 是不能對類進行代理的

帶著小疑惑我們看一下 Proxy 源碼報錯位置,JDK 動態代理在生成代理類的過程代碼中,會有是否接口驗證

抽象類終歸是類,加個 abstract 也成不了接口(就像我,雖然胖了 60 斤,但依然是帥哥)

下次面試官如果有問這問題的,斬釘截鐵一點,就是不能

結言

結合 Mybatis 使用 JDK 動態代理相關的問題,展開了文章的講述,這里總結如下

Q:JDK 動態代理能否對類代理?

因為 JDK 動態代理生成的代理類,會繼承 Proxy 類,由于 Java 無法多繼承,所以無法對類進行代理

Q:抽象類是否可以 JDK 動態代理?

不可以,抽象類本質上也是類,Proxy 生成代理類過程中,會校驗傳入 Class 是否接口

Q:Mybatis Mapper 接口沒有實現類,怎么實現的動態代理?

Mybatis 會通過 Class#forname 得到 Mapper 接口 Class 對象,生成對應的動態代理對象,核心業務處理都會在 InvocationHandler#invoke 進行處理

希望讀過的小伙伴都能有所收獲,如果對于文章內容有所疑惑,可以通過留言或者添加作者好友的方式溝通,祝好!

 

責任編輯:武曉燕 來源: 源碼興趣圈
相關推薦

2023-12-06 08:23:44

代理模式設計模式

2021-07-06 06:39:22

Java靜態代理動態代理

2021-03-23 09:52:39

鴻蒙HarmonyOS應用開發

2017-05-11 21:30:01

Android動態代理ServiceHook

2011-03-07 17:15:52

ProFTPD配置

2011-03-07 17:25:33

ProFTPD啟動

2011-04-06 11:41:25

Java動態代理

2011-03-07 17:24:33

ProFTPD安裝

2015-08-26 16:38:37

mybatissql

2012-08-28 10:59:26

JavaJava動態代理Proxy

2025-07-29 07:30:23

Spring動態代理代碼

2015-09-22 11:09:47

Java 8動態代理

2011-03-23 10:40:51

java代理模式

2022-01-26 00:05:00

AOPRPC遠程調用

2020-12-28 07:47:35

動態代理AOP

2017-10-12 14:56:11

2024-11-07 16:39:42

SpringBoo常用注解Bean

2020-12-28 09:41:40

MySQL數據庫函數

2015-09-28 15:59:00

Java動態代理機制
點贊
收藏

51CTO技術棧公眾號

欧美最新大片在线看| 国产精品欧美综合| 天堂网2014av| 色天天综合网| 国产亚洲综合色| 欧美精品第一页在线播放| 五月婷婷六月合| 完全免费av在线播放| 影音先锋男人资源在线观看| av中文字幕电影在线看| 韩国精品免费视频| 一本久久综合亚洲鲁鲁| 久在线观看视频| 欧美性受xxxx狂喷水| 欧美激情综合色综合啪啪| 欧美日韩电影在线| 永久域名在线精品| 91欧美日韩麻豆精品| 成人在线免费观看网站| 欧美午夜在线观看| 性欧美大战久久久久久久免费观看 | 蜜桃精品噜噜噜成人av| 亚洲国产欧美日韩另类综合| 99久久99久久| 久久精品一级片| 成人动态视频| 精品福利一区二区| 狠狠色综合欧美激情| 国产一区二区三区影院| 麻豆一区一区三区四区| 欧美性猛交xxxx富婆| 久久久久se| 亚洲第一网站在线观看| 精品不卡一区| 欧美人妇做爰xxxⅹ性高电影 | 三级资源在线| 丁香激情综合国产| 97人洗澡人人免费公开视频碰碰碰| ass极品水嫩小美女ass| av影片在线| 亚洲精品国产第一综合99久久 | 99精品在线免费视频| 成人免费在线| 成人av在线影院| 欧美在线激情网| 国产综合精品在线| 成人在线日韩| 亚洲高清视频在线| 成年在线观看视频| 亚洲欧美日韩综合在线| 三级精品在线观看| 久久精品在线播放| 黄色av网址在线观看| 日韩欧美精品一区二区综合视频| 1区2区3区精品视频| 不卡视频一区二区三区| 99热这里只有精品在线观看| 亚洲清纯自拍| 中文字幕av一区| 岛国精品一区二区三区| 中文字幕色婷婷在线视频| 国产精品久久久一本精品| 亚洲xxxxx性| 国产在线观看黄色| 国产精品久久久久久久久妇女| 亚洲精品一区在线观看| www.涩涩涩| www.26天天久久天堂| 亚洲一区二区三区自拍| 24小时免费看片在线观看| 亚洲视频碰碰| 亚洲国产女人aaa毛片在线| 日韩av三级在线| 小早川怜子影音先锋在线观看| 精品久久香蕉国产线看观看亚洲| 欧美日韩在线一| 美女福利一区二区| 一区2区3区在线看| 视频一区不卡| 黄色一级大片在线免费看产| 久久精品一级爱片| 99理论电影网| 性xxxfllreexxx少妇| www日韩大片| 国产精品久久久久久久久久直播 | 91久久久久久久久| aaaaaa毛片| 激情91久久| 欧美最猛黑人xxxx黑人猛叫黄| 伊人中文字幕在线观看| 美女看a上一区| 青草成人免费视频| 中文字幕二区三区| 久久xxxx精品视频| 久久久久久午夜| 黄色在线免费观看| 久久99精品国产麻豆婷婷| 欧美一区二区三区四区在线| 久久久精品一区二区涩爱| 成人黄色小视频| 欧美精品在线免费观看| 91精品久久久久久久久久久久| 欧美18免费视频| 精品国产乱码久久久久久久久| 一级国产黄色片| 91精品高清| 久久精品中文字幕电影| 日韩免费黄色片| 精品一区免费av| 免费日韩电影在线观看| 日本在线丨区| 久久久不卡网国产精品一区| 91社在线播放| bt在线麻豆视频| 日韩欧美福利视频| 97中文字幕在线观看| 成人无号精品一区二区三区| 97超级碰碰碰久久久| 日韩手机在线观看| 精品亚洲欧美一区| 日本一区二区三区免费观看| 邻家有女韩剧在线观看国语| 久久只精品国产| 你懂的视频在线一区二区| 99自拍视频在线观看| 夜夜操天天操亚洲| 日韩av在线中文| 亚洲视频资源| 欧美一级在线免费| 欧美熟妇精品一区二区| 粉嫩av一区二区| 精品在线小视频| 久久中文字幕精品| 久久社区一区| 欧美国产精品人人做人人爱| 国产主播在线播放| 久久xxxx| 欧美二区在线看| 午夜视频成人| 一级日本不卡的影视| 91福利国产成人精品播放| 欧美**字幕| 欧美一区二区影院| 亚洲区小说区图片区| 亚洲成人av在线电影| www.黄色网| 国户精品久久久久久久久久久不卡| 91精品视频在线免费观看| 蜜桃视频网站在线观看| 亚洲成人免费视频| 亚洲精品久久一区二区三区777| 亚洲午夜精品一区二区国产| 久久人人爽人人爽人人片av高清| 欧美一区免费看| 26uuu成人网一区二区三区| 男人用嘴添女人下身免费视频| 精品免费av一区二区三区| 亚洲欧洲视频在线| 欧美视频www| 欧美亚洲专区| 成人91免费视频| 国产盗摄在线视频网站| 91官网在线免费观看| 日本r级电影在线观看| 伊人久久大香线蕉av不卡| 久久久精品国产| 精品国产伦一区二区三区| 26uuu久久天堂性欧美| 国产黄色特级片| 91精品导航| 色琪琪综合男人的天堂aⅴ视频| 中文字幕一区二区三区手机版| 久热成人在线视频| 欧美日韩一区二区视频在线| 免费日韩电影| 精品久久久久av影院| 一级片黄色录像| 久久久噜噜噜| 亚洲欧美电影在线观看| 原纱央莉成人av片| 伊人伊成久久人综合网站| 一区二区三区黄| 亚洲综合久久久| 手机av免费看| 亚洲区国产区| 日本一区二区三区在线视频| 日本一区二区中文字幕| 亚洲日韩欧美视频| 91无套直看片红桃| 亚洲午夜免费视频| a级大片在线观看| 国产色综合网| 国产精品乱子乱xxxx| 在线免费看h| 久久亚洲成人精品| 97超碰资源站| 午夜精品福利一区二区三区蜜桃| 青娱乐精品在线| 日韩午夜高潮| 国模精品一区二区三区| 免费在线看电影| 欧美一区二区三区啪啪| 国产又黄又粗又爽| 91在线视频观看| 日本在线xxx| 天天做天天爱天天综合网| 精品国产综合| 国产亚洲字幕| 国产精品黄色影片导航在线观看| 亚洲 精品 综合 精品 自拍| 欧美日韩国产乱码电影| 久久狠狠高潮亚洲精品| 亚洲欧美成人一区二区三区| 日本77777| 天天超碰亚洲| 欧美日韩在线一二三| 亚洲一区二区三区中文字幕在线观看| 国产精品福利在线| 天堂中文av在线资源库| 久久91精品国产91久久久| 精品美女www爽爽爽视频| 在线观看视频欧美| 国产又大又黑又粗免费视频| 一区二区视频在线看| 黄色片网站在线播放| 国产日本欧洲亚洲| 欧美激情国内自拍| 美女国产一区二区三区| 亚洲国产精品久久久久婷蜜芽| 国产va免费精品观看精品视频| 国产精品精品久久久久久| 美女露胸视频在线观看| 亚洲天堂男人天堂女人天堂| 一级黄色片在线| 91成人网在线| 天天射天天干天天| 亚洲人成小说网站色在线| 欧美一级大片免费看| 国产在线不卡一区| 亚洲美免无码中文字幕在线| 国内综合精品午夜久久资源| 亚洲色图都市激情| 日韩在线影视| 国产女人18毛片水18精品| 日本伦理一区二区| 久久99热精品| 国产网红在线观看| 欧美交受高潮1| 草美女在线观看| 国模gogo一区二区大胆私拍 | 亚洲激情一二三区| 国产大片免费看| 亚洲一区免费视频| 中文字幕第28页| 狠狠色香婷婷久久亚洲精品| 亚洲一级黄色录像| 中文字幕+乱码+中文字幕一区| 国产精品欧美性爱| 本田岬高潮一区二区三区| 成人免费观看cn| 在线视频亚洲| 别急慢慢来1978如如2| 欧美日本一区| 日韩av在线播放不卡| 日本久久精品| 日本福利视频导航| 黄色工厂这里只有精品| 国产婷婷一区二区三区| 香蕉久久a毛片| 国产又猛又黄的视频| 91成人观看| 精品国偷自产一区二区三区| 色婷婷热久久| 在线观看18视频网站| 免费毛片在线不卡| 午夜精品一区二区在线观看| 国产精品二区不卡| 精品一二三四五区| 亚洲精品小说| 日本中文字幕网址| 日韩福利视频导航| 中文字幕55页| 91麻豆成人久久精品二区三区| 国产主播av在线| 亚洲一区二区四区蜜桃| 九九热最新视频| 日韩一区二区在线看片| 91国在线视频| 亚洲高清不卡av| 精品国产亚洲AV| 国产视频一区在线| 好吊日视频在线观看| 97国产成人精品视频| 久久久久伊人| 国产精品视频区1| 欧美三区四区| 日韩av高清不卡| 伊人久久精品一区二区三区| 国产精品视频内| 精品福利一区| 亚洲在线视频一区二区| 青青一区二区三区| 日韩精品在线观看av| 日韩电影免费在线看| 国产69视频在线观看| 床上的激情91.| 成年人看的免费视频| 亚洲五码中文字幕| 91av久久久| 亚洲欧美日韩直播| 国产污视频在线| 在线观看精品国产视频| 欧美xxxbbb| 国产日韩欧美电影在线观看| 色8久久久久| 欧美lavv| 99人久久精品视频最新地址| √天堂资源在线| 国产成人在线视频网站| 国产吃瓜黑料一区二区| 中文av字幕一区| www.中文字幕在线观看| 精品处破学生在线二十三| 麻豆网站在线| 国产日本欧美在线观看| 国产亚洲一区二区三区不卡| 欧美大片在线播放| 成人av在线播放网址| 欧美黑人性猛交xxx| 7777精品伊人久久久大香线蕉超级流畅| 国产乱淫av片免费| 精品日韩一区二区三区| 毛片在线播放a| 国产美女精彩久久| 日本女优一区| 日韩av片网站| 国产日本欧洲亚洲| 无码一区二区三区在线观看| 日韩精品在线影院| аⅴ资源天堂资源库在线| 日韩美女视频中文字幕| 在线日韩一区| 人人干人人视频| 日本一区二区免费在线| 中文字幕人妻色偷偷久久| 伊人亚洲福利一区二区三区| 粉嫩91精品久久久久久久99蜜桃| 日本在线高清视频一区| 在线中文一区| 伊人五月天婷婷| 樱桃视频在线观看一区| 精品乱子伦一区二区| 欧美精品video| 欧美电影在线观看免费| 中文字幕无码精品亚洲35| 99精品视频一区二区| 国产又大又黄又粗| 亚洲视频在线播放| 91精品美女| 黄色网zhan| av网站一区二区三区| 亚洲免费黄色网址| 中文字幕在线成人| 欧美影院在线| 亚洲一卡二卡| 国产麻豆精品在线观看| 精品无码人妻一区二区免费蜜桃| 日本精品视频一区二区三区| 97电影在线观看| 人人爽久久涩噜噜噜网站| 国产亚洲电影| 日本特黄在线观看| 午夜视频久久久久久| 免费一级在线观看| 国产日本欧美一区二区三区| 欧美精品激情| 色婷婷av777| 欧美丰满一区二区免费视频 | 伊人久久久久久久久久| 日韩免费大片| 国产主播自拍av| 国产欧美日本一区视频| jizz中国少妇| 欧美专区在线播放| 综合在线视频| 看欧美ab黄色大片视频免费| 国产精品福利电影一区二区三区四区 | 女同激情久久av久久| 国产亚洲欧美日韩在线一区| 国产一区二区三区四区视频 | 特级西西444www大精品视频免费看| 一个色综合导航| 亚洲网一区二区三区| 蜜臀av午夜一区二区三区| 亚洲欧美日韩国产一区二区三区| 深爱五月激情五月| 91精品久久久久久久久中文字幕| 国产一卡不卡| 国产乱国产乱老熟300部视频| 色婷婷久久99综合精品jk白丝|