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

溫習 SPI 機制 (Java SPI 、Spring SPI、Dubbo SPI)

開發
SPI 的本質是將接口實現類的全限定名配置在文件中,并由服務加載器讀取配置文件,加載實現類。這樣可以在運行時,動態為接口替換實現類。正因此特性,我們可以很容易的通過 SPI 機制為我們的程序提供拓展功能。

SPI 全稱為 Service Provider Interface,是一種服務發現機制。

SPI 的本質是將接口實現類的全限定名配置在文件中,并由服務加載器讀取配置文件,加載實現類。這樣可以在運行時,動態為接口替換實現類。正因此特性,我們可以很容易的通過 SPI 機制為我們的程序提供拓展功能。

圖片圖片

1 Java SPI 示例

本節通過一個示例演示 Java SPI 的使用方法。首先,我們定義一個接口,名稱為 Robot。

public interface Robot {
    void sayHello();
}

接下來定義兩個實現類,分別為 OptimusPrime 和 Bumblebee。

public class OptimusPrime implements Robot {
    
    @Override
    public void sayHello() {
        System.out.println("Hello, I am Optimus Prime.");
    }
  
}

public class Bumblebee implements Robot {

    @Override
    public void sayHello() {
        System.out.println("Hello, I am Bumblebee.");
    }
  
}

接下來 META-INF/services 文件夾下創建一個文件,名稱為 Robot 的全限定名 org.apache.spi.Robot。文件內容為實現類的全限定的類名,如下:

org.apache.spi.OptimusPrime
org.apache.spi.Bumblebee

做好所需的準備工作,接下來編寫代碼進行測試。

public class JavaSPITest {
    @Test
    public void sayHello() throws Exception {
        ServiceLoader<Robot> serviceLoader = ServiceLoader.load(Robot.class);
        System.out.println("Java SPI");
        // 1. forEach 模式
        serviceLoader.forEach(Robot::sayHello);
        // 2. 迭代器模式
        Iterator<Robot> iterator = serviceLoader.iterator();
        while (iterator.hasNext()) {
            Robot robot = iterator.next();
          //System.out.println(robot);
          //robot.sayHello();
        }
    }
}

最后來看一下測試結果,如下 :

圖片圖片

2 經典 Java SPI 應用 : JDBC DriverManager

在JDBC4.0 之前,我們開發有連接數據庫的時候,通常先加載數據庫相關的驅動,然后再進行獲取連接等的操作。

// STEP 1: Register JDBC driver
Class.forName("com.mysql.jdbc.Driver");
// STEP 2: Open a connection
String url = "jdbc:xxxx://xxxx:xxxx/xxxx";
Connection conn = DriverManager.getConnection(url,username,password);

JDBC4.0之后使用了 Java 的 SPI 擴展機制,不再需要用 Class.forName("com.mysql.jdbc.Driver") 來加載驅動,直接就可以獲取 JDBC 連接。

接下來,我們來看看應用如何加載 MySQL JDBC 8.0.22 驅動:

圖片圖片

首先 DriverManager類是驅動管理器,也是驅動加載的入口。

/**
 * Load the initial JDBC drivers by checking the System property
 * jdbc.properties and then use the {@code ServiceLoader} mechanism
 */
static {
     loadInitialDrivers();
     println("JDBC DriverManager initialized");
}

在 Java 中,static 塊用于靜態初始化,它在類被加載到 Java 虛擬機中時執行。

靜態塊會加載實例化驅動,接下來我們看看loadInitialDrivers 方法。

圖片圖片

加載驅動代碼包含四個步驟:

  1. 系統變量中獲取有關驅動的定義。
  2. 使用 SPI 來獲取驅動的實現類(字符串的形式)。
  3. 遍歷使用 SPI 獲取到的具體實現,實例化各個實現類。
  4. 根據第一步獲取到的驅動列表來實例化具體實現類。

我們重點關注 SPI 的用法,首先看第二步,使用 SPI 來獲取驅動的實現類 , 對應的代碼是:

ServiceLoader<Driver> loadedDrivers = ServiceLoader.load(Driver.class);

這里沒有去 META-INF/services目錄下查找配置文件,也沒有加載具體實現類,做的事情就是封裝了我們的接口類型和類加載器,并初始化了一個迭代器。

接著看第三步,遍歷使用SPI獲取到的具體實現,實例化各個實現類,對應的代碼如下:

Iterator<Driver> driversIterator = loadedDrivers.iterator();
//遍歷所有的驅動實現
while(driversIterator.hasNext()) {
    driversIterator.next();
}

在遍歷的時候,首先調用driversIterator.hasNext()方法,這里會搜索 classpath 下以及 jar 包中所有的META-INF/services目錄下的java.sql.Driver文件,并找到文件中的實現類的名字,此時并沒有實例化具體的實現類。

然后是調用driversIterator.next()方法,此時就會根據驅動名字具體實例化各個實現類了,現在驅動就被找到并實例化了。

3 Java SPI 機制源碼解析

我們根據第一節 JDK SPI 示例,學習 ServiceLoader 類的實現。

ServiceLoader類ServiceLoader類

進入 ServiceLoader 類的load方法:

public static <S> ServiceLoader<S> load(Class<S> service) {
     ClassLoader cl = Thread.currentThread().getContextClassLoader();
     return ServiceLoader.load(service, cl);
}

public static <S> ServiceLoader<S> load(Class<S> service , ClassLoader loader) {
     return new ServiceLoader<>(service, loader);
}

上面的代碼,load 方法會通過傳遞的服務類型和類加載器classLoader 創建一個 ServiceLoader 對象。

private ServiceLoader(Class<S> svc, ClassLoader cl) {
     service = Objects.requireNonNull(svc, "Service interface cannot be null");
     loader = (cl == null) ? ClassLoader.getSystemClassLoader() : cl;
     acc = (System.getSecurityManager() != null) ? AccessController.getContext() : null;
     reload();
}

// 緩存已經被實例化的服務提供者,按照實例化的順序存儲
private LinkedHashMap<String,S> providers = new LinkedHashMap<>();

public void reload() {
     providers.clear();
     lookupIterator = new LazyIterator(service, loader);
}

私有構造器會創建懶迭代器 LazyIterator 對象 ,所謂懶迭代器,就是對象初始化時,僅僅是初始化,只有在真正調用迭代方法時,才執行加載邏輯。

示例代碼中創建完 serviceLoader 之后,接著調用iterator()方法:

Iterator<Robot> iterator = serviceLoader.iterator();

// 迭代方法實現
public Iterator<S> iterator() {
     return new Iterator<S>() {
          Iterator<Map.Entry<String,S>> knownProviders
                = providers.entrySet().iterator();

          public boolean hasNext() {
                if (knownProviders.hasNext())
                    return true;
                return lookupIterator.hasNext();
          }

          public S next() {
                if (knownProviders.hasNext())
                    return knownProviders.next().getValue();
                return lookupIterator.next();
          }

          public void remove() {
                throw new UnsupportedOperationException();
          }
     };
}

迭代方法的實現本質是調用懶迭代器 lookupIterator 的 hasNext() 和 next() 方法。

1)hasNext() 方法

public boolean hasNext() {
      if (acc == null) {
           return hasNextService();
      } else {
           PrivilegedAction<Boolean> action = new PrivilegedAction<Boolean>() {
                 public Boolean run() { return hasNextService(); }
           };
           return AccessController.doPrivileged(action, acc);
      }
}
public S next() {
       if (acc == null) {
            return nextService();
       } else {
            PrivilegedAction<S> action = new PrivilegedAction<S>() {
                 public S run() { return nextService(); }
            };
            return AccessController.doPrivileged(action, acc);
       }
}

懶迭代器的hasNextService方法首先會通過加載器通過文件全名獲取配置對象 Enumeration<URL> configs ,然后調用解析parse方法解析classpath下的META-INF/services/目錄里以服務接口命名的文件。

private boolean hasNextService() {
        if (nextName != null) {
              return true;
        }
        if (configs == null) {
             try {
                 String fullName = PREFIX + service.getName();
                 if (loader == null)
                     configs = ClassLoader.getSystemResources(fullName);
                 else
                     configs = loader.getResources(fullName);
              } catch (IOException x) {
                    fail(service, "Error locating configuration files", x);
              }
         }
         while ((pending == null) || !pending.hasNext()) {
             if (!configs.hasMoreElements()) {
                  return false;
             }
             pending = parse(service, configs.nextElement());
         }
         nextName = pending.next();
         return true;
}

當 hasNextService 方法返回 true , 我們可以調用迭代器的 next 方法 ,本質是調用懶加載器 lookupIterator 的 next() 方法:

2)next() 方法

Robot robot = iterator.next();

// 調用懶加載器 lookupIterator 的  `next()` 方法
private S nextService() {
          if (!hasNextService())
              throw new NoSuchElementException();
          String cn = nextName;
          nextName = null;
          Class<?> c = null;
          try {
              c = Class.forName(cn, false, loader);
          } catch (ClassNotFoundException x) {
             fail(service,
                   "Provider " + cn + " not found");
          }
          if (!service.isAssignableFrom(c)) {
              fail(service,
                     "Provider " + cn  + " not a subtype");
          }
          try {
              S p = service.cast(c.newInstance());
              providers.put(cn, p);
              return p;
          } catch (Throwable x) {
              fail(service,
                     "Provider " + cn + " could not be instantiated",
                     x);
          }
          throw new Error();  // This cannot happen
  }

通過反射方法 Class.forName() 加載類對象,并用newInstance方法將類實例化,并把實例化后的類緩存到providers對象中,(LinkedHashMap<String,S>類型,然后返回實例對象。

4 Java SPI 機制的缺陷

通過上面的解析,可以發現,我們使用 JDK SPI 機制的缺陷 :

  • 不能按需加載,需要遍歷所有的實現,并實例化,然后在循環中才能找到我們需要的實現。如果不想用某些實現類,或者某些類實例化很耗時,它也被載入并實例化了,這就造成了浪費。
  • 獲取某個實現類的方式不夠靈活,只能通過 Iterator 形式獲取,不能根據某個參數來獲取對應的實現類。
  • 多個并發多線程使用 ServiceLoader 類的實例是不安全的。

5 Spring SPI 機制

Spring SPI 沿用了 Java SPI 的設計思想,Spring 采用的是 spring.factories 方式實現 SPI 機制,可以在不修改 Spring 源碼的前提下,提供 Spring 框架的擴展性。

圖片圖片

1)創建 MyTestService 接口

public interface MyTestService {
    void printMylife();
}

2)創建 MyTestService 接口實現類

  • WorkTestService :
public class WorkTestService implements MyTestService {
    public WorkTestService(){
        System.out.println("WorkTestService");
    }
    public void printMylife() {
        System.out.println("我的工作");
    }
}
  • FamilyTestService :
public class FamilyTestService implements MyTestService {
    public FamilyTestService(){
        System.out.println("FamilyTestService");
    }
    public void printMylife() {
        System.out.println("我的家庭");
    }
}

3)在資源文件目錄,創建一個固定的文件 META-INF/spring.factories。

#key是接口的全限定名,value是接口的實現類
com.courage.platform.sms.demo.service.MyTestService = com.courage.platform.sms.demo.service.impl.FamilyTestService,com.courage.platform.sms.demo.service.impl.WorkTestService

4)運行代碼

// 調用 SpringFactoriesLoader.loadFactories 方法加載 MyTestService 接口所有實現類的實例
List<MyTestService> myTestServices = SpringFactoriesLoader.loadFactories(
            MyTestService.class,
            Thread.currentThread().getContextClassLoader()
);

for (MyTestService testService : myTestServices) {
     testService.printMylife();
}

運行結果:

FamilyTestService
WorkTestService
我的家庭
我的工作

Spring SPI 機制非常類似 ,但還是有一些差異:

  • Java SPI 是一個服務提供接口對應一個配置文件,配置文件中存放當前接口的所有實現類,多個服務提供接口對應多個配置文件,所有配置都在 services 目錄下。
  • Spring  SPI 是一個 spring.factories 配置文件存放多個接口及對應的實現類,以接口全限定名作為key,實現類作為value來配置,多個實現類用逗號隔開,僅 spring.factories 一個配置文件。

和 Java SPI 一樣,Spring SPI 也無法獲取某個固定的實現,只能按順序獲取所有實現。

6 Dubbo SPI 機制

基于 Java SPI 的缺陷無法支持按需加載接口實現類,Dubbo 并未使用 Java SPI,而是重新實現了一套功能更強的 SPI 機制。

Dubbo SPI 的相關邏輯被封裝在了 ExtensionLoader 類中,通過 ExtensionLoader,我們可以加載指定的實現類。

Dubbo SPI 所需的配置文件需放置在 META-INF/dubbo 路徑下,配置內容如下:

optimusPrime = org.apache.spi.OptimusPrime
bumblebee = org.apache.spi.Bumblebee

與 Java SPI 實現類配置不同,Dubbo SPI 是通過鍵值對的方式進行配置,這樣我們可以按需加載指定的實現類。

另外,在測試 Dubbo SPI 時,需要在 Robot 接口上標注 @SPI 注解。

下面來演示 Dubbo SPI 的用法:

public class DubboSPITest {

    @Test
    public void sayHello() throws Exception {
        ExtensionLoader<Robot> extensionLoader = 
            ExtensionLoader.getExtensionLoader(Robot.class);
        Robot optimusPrime = extensionLoader.getExtension("optimusPrime");
        optimusPrime.sayHello();
        Robot bumblebee = extensionLoader.getExtension("bumblebee");
        bumblebee.sayHello();
    }
}

測試結果如下 :

圖片圖片

另外,Dubbo SPI 除了支持按需加載接口實現類,還增加了 IOC 和 AOP 等特性 。

責任編輯:武曉燕 來源: 勇哥Java實戰
相關推薦

2025-03-04 09:02:25

JavaSPI機制

2025-08-05 01:55:00

JavaSPI機制

2025-05-08 03:25:00

DubboSPI機制

2022-05-12 12:47:07

SPI主設備通信

2022-05-15 22:34:32

SPI 控制器SPI 子系統

2011-11-30 14:35:19

JavaSPI

2020-12-14 11:35:22

SPI Java機制

2021-09-10 08:31:19

DubboSPI框架

2024-01-15 08:25:53

SPI機制JavaDubbo

2025-05-20 05:53:07

DubboSPI機制

2022-05-06 08:26:32

JavaSPI機制

2025-03-27 02:00:00

SPIJava接口

2022-08-17 08:17:01

SPI機制接口

2023-12-11 07:21:12

SPI機制插件

2022-06-28 08:02:44

SPISpringJava

2020-06-30 15:35:36

JavaSPI代碼

2022-11-02 21:45:54

SPIJava

2021-05-30 07:54:24

SPI機制場景

2023-08-28 10:42:25

DubboSPIJava

2023-06-05 08:07:33

JavaJava SPI
點贊
收藏

51CTO技術棧公眾號

一区二区三区产品免费精品久久75| 亚洲尤物精选| 欧美videofree性高清杂交| 粉嫩av一区二区三区天美传媒| 国产成人三级一区二区在线观看一| 午夜久久久久| 亚洲精品美女久久久久| 男女爽爽爽视频| 国产不卡在线| av中文一区二区三区| 国产精品福利小视频| www.毛片com| 亚洲精品蜜桃乱晃| 91精品国产综合久久国产大片| 欧美久久久久久久久久久久久| 国产福利小视频在线观看| 国产乱人伦偷精品视频不卡 | 91精品国产自产在线老师啪| 91精品国产高清一区二区三蜜臀| 久久av免费看| 日韩欧美第一区| 国产免费视频传媒| 啪啪免费视频一区| 中文字幕第一区综合| 国产精品手机在线| 亚洲天堂久久久久| 国产日韩精品视频一区二区三区 | 免费国产一区| 国产熟女一区二区三区五月婷| 香蕉精品999视频一区二区| 久久精品影视伊人网| 丰满少妇一区二区| 91成人精品在线| 欧美日韩国产一级片| 精品这里只有精品| 欧美大片黄色| 最近中文字幕一区二区三区| 久久99精品久久久久久久久久| 99精品视频在线播放免费| 日韩成人免费电影| 欧美自拍视频在线| 黄色一级片免费看| 欧美私人啪啪vps| 久久精品国产2020观看福利| www..com.cn蕾丝视频在线观看免费版| 精品中国亚洲| 亚洲成人1234| avtt中文字幕| 日本高清精品| 欧美一区二区三区免费观看视频| 亚洲黄色小视频在线观看| 精品国产第一福利网站| 无码av中文一区二区三区桃花岛| www.国产二区| 色噜噜狠狠狠综合欧洲色8| 亚洲欧洲韩国日本视频| 亚洲一区精彩视频| h视频在线免费| 国产日韩欧美一区二区三区综合| 久久伊人资源站| 亚洲AV第二区国产精品| 99久久国产综合精品女不卡| 国产视频一区二区不卡| 天天av天天翘| 久久网站热最新地址| 欧美日韩高清在线一区| 狠狠色伊人亚洲综合网站l| 久久精品免费在线观看| 视频三区二区一区| 婷婷五月在线视频| 亚洲欧洲综合另类| wwwwww欧美| 国产在线美女| 色狠狠av一区二区三区| 国产一级做a爰片久久| 日本午夜免费一区二区| 6080yy午夜一二三区久久| 天堂av手机在线| 国产欧美日韩电影| 精品国产乱码久久| 人妻无码一区二区三区| 精品国产99| www.日韩av.com| 欧美日韩免费做爰视频| 亚洲激情国产| 国产精品v片在线观看不卡| 中文在线观看av| 国产一区二区三区四| 国产高清精品一区二区三区| 天天干,天天操,天天射| 国产亚洲视频系列| 一级全黄肉体裸体全过程| 色呦呦在线播放| 色偷偷久久人人79超碰人人澡| 9久久婷婷国产综合精品性色 | 欧美性三三影院| 不卡的一区二区| 欧美日韩播放| 欧美成人久久久| 秋霞精品一区二区三区| 国模大尺度一区二区三区| 国产精品一区二区你懂得| 狠狠狠综合7777久夜色撩人| 亚洲人精品一区| 日韩亚洲欧美视频| 国产成人77亚洲精品www| 欧美videossexotv100| 日本精品在线观看视频| 欧美日韩亚洲一区| 国产成人一区二区三区电影| 精品人妻少妇AV无码专区 | 午夜激情视频在线播放| 精品999日本| 国产日韩欧美综合| 五月婷婷六月丁香| 亚洲美女少妇撒尿| 日日摸天天爽天天爽视频| 无码国模国产在线观看| 中文日韩在线视频| 偷偷操不一样的久久| 国产一区二区三区香蕉 | 超碰免费在线| 午夜不卡在线视频| 久久久男人的天堂| 五月婷婷六月综合| 国产极品精品在线观看| 懂色av成人一区二区三区| 国产精品美日韩| 久久久久久久久久久免费视频| 午夜久久av| 色噜噜狠狠狠综合曰曰曰| 国内自拍视频在线播放| 成人丝袜18视频在线观看| 国产91av视频在线观看| 中文字幕系列一区| 国产视频精品一区二区三区| 久久精品国产亚洲AV无码麻豆| 激情五月播播久久久精品| 欧美一区视久久| 黄色在线观看www| 欧美videos大乳护士334| 国产精品白丝喷水在线观看| 蜜臀久久99精品久久久画质超高清| 另类视频在线观看+1080p| av第一福利在线导航| 精品国产自在久精品国产| 男人在线观看视频| 极品少妇一区二区三区精品视频 | 伊人影院久久| 99在线观看| 91麻豆免费在线视频| 在线播放/欧美激情| 午夜激情福利电影| 久久成人综合网| 亚洲一区二区在线观| 天天综合91| 久久精品视频网站| 99久久久国产精品无码免费| 亚洲欧美一区二区三区极速播放 | 波多野结衣午夜| 国产亚洲精品久| 国产精品人人爽人人爽| av亚洲在线观看| 成人精品久久久| caopo在线| 亚洲白拍色综合图区| 日本三级理论片| 91丨九色丨尤物| 免费激情视频在线观看| 欧洲福利电影| 91亚洲精品久久久久久久久久久久| 成人看av片| 精品免费99久久| 欧美三级午夜理伦| 国产日韩欧美制服另类| 亚洲激情在线看| 国产精品扒开腿做爽爽爽软件| 国产乱人伦精品一区二区| 水蜜桃在线视频| 国产午夜精品视频免费不卡69堂| 在线观看日韩一区二区| 亚洲精选一二三| 伊人网综合视频| 日韩福利视频导航| 妞干网这里只有精品| 成人性生交大片免费看96| 国产91精品不卡视频| www.亚洲.com| 精品日韩在线观看| 欧美一级淫片免费视频黄| 中文字幕一区av| 亚洲一级av无码毛片精品| 日韩va欧美va亚洲va久久| 国产卡一卡二在线| 神马香蕉久久| 成人亚洲综合色就1024| 国产乱码午夜在线视频| 夜夜嗨av一区二区三区免费区| 国产农村妇女毛片精品| 欧美午夜无遮挡| 欧美三级黄色大片| 91视频精品在这里| 欧美大片久久久| 亚洲在线一区| 成人在线免费观看网址| 女厕嘘嘘一区二区在线播放| 成人性生交大片免费看小说| 成人性生交大片免费网站| 久久久999成人| 毛片网站在线| 亚洲国产精久久久久久| 国产精品女同一区二区| 欧美性生交xxxxx久久久| 永久免费看黄网站| 中文一区一区三区高中清不卡| 97精品人妻一区二区三区蜜桃| 蜜桃一区二区三区在线| 青青青免费在线| 在线观看国产精品入口| 天天久久人人| 九九久久电影| 国产一区二区自拍| 1313精品午夜理伦电影| 成人国产精品色哟哟| 亚洲wwww| 欧日韩不卡在线视频| 182在线视频观看| 色综合久综合久久综合久鬼88| jizz亚洲| 国产亚洲精品久久久久久| 天堂av在线免费| 精品电影一区二区三区| 国产三级视频在线播放| 欧美性videosxxxxx| 中文在线第一页| 欧美日韩在线看| 黄色一级片免费看| 亚洲成人www| 国产亚洲精久久久久久无码77777| 中文字幕一区二区三区乱码在线| 国产福利在线导航| 国产精品拍天天在线| 一区二区黄色片| 26uuu国产一区二区三区| 中文字幕日韩三级片| 不卡视频一二三| 国产精品无码一区二区三| 成人黄页毛片网站| fc2成人免费视频| www.日韩精品| 天天插天天射天天干| 不卡一卡二卡三乱码免费网站| 亚洲av成人片无码| 成人aa视频在线观看| 欧美极品jizzhd欧美仙踪林| www.亚洲色图.com| 欧美深性狂猛ⅹxxx深喉 | 国产91视觉| 狠狠一区二区三区| 国产伦精品一区二区三区照片91| xxxx日韩| 久久久久九九九| 国产精品一区二区三区av麻| 婷婷四房综合激情五月| 欧美独立站高清久久| 最新中文字幕久久| 好看的av在线不卡观看| 日韩a∨精品日韩在线观看| 欧美专区一区二区三区| 一级特黄性色生活片| 久久99久国产精品黄毛片色诱| 色男人天堂av| 成人av在线影院| 亚洲ⅴ国产v天堂a无码二区| 亚洲欧美自拍偷拍色图| 久久免费视频精品| 欧美午夜无遮挡| 91高潮大合集爽到抽搐| 日韩免费性生活视频播放| 日韩一区av| 中文字幕亚洲无线码在线一区| 国产日产一区二区三区| 久久久噜噜噜久久| 欧美最新精品| 999热视频| 亚洲香蕉视频| 强伦女教师2:伦理在线观看| 亚洲二区免费| 麻豆三级在线观看| 成人爽a毛片一区二区免费| 波多野在线播放| 亚洲精品成人天堂一二三| 久久久久久少妇| 666欧美在线视频| 欧美在线观看在线观看| 久久精品国产久精国产一老狼 | 亚洲国产日韩a在线播放性色| 中文字字幕在线中文| 在线播放国产精品二区一二区四区| 国产综合无码一区二区色蜜蜜| 在线观看中文字幕亚洲| 激情影院在线| 国产久一一精品| 色综合久久中文| 2022中文字幕| 美腿丝袜亚洲一区| 人妻丰满熟妇aⅴ无码| 亚洲女人****多毛耸耸8| 国产剧情在线视频| 日韩色在线观看| 成人77777| 97超碰蝌蚪网人人做人人爽| 麻豆一二三区精品蜜桃| 色阁综合av| 夜夜嗨网站十八久久| 捷克做爰xxxⅹ性视频| 久久精品一区二区三区不卡牛牛| 免费麻豆国产一区二区三区四区| 欧美性猛片xxxx免费看久爱| 午夜在线视频观看| 欧美人与物videos| 欧美成人三级| 日韩精品第一页| 香蕉久久夜色精品| 免费a v网站| 亚洲一区在线观看免费观看电影高清| 影音先锋国产在线| 亚洲视频在线看| 芒果视频成人app| 欧美 日韩 国产在线| 亚洲精品影院在线观看| 色欲欲www成人网站| 亚洲激情图片qvod| 国产乱码久久久| www.xxxx精品| 激情欧美一区二区三区黑长吊| 欧美一级日本a级v片| 午夜亚洲性色视频| 中文字幕影片免费在线观看| 亚洲国产精品精华液网站 | 亚洲精品在线不卡| 99riav视频在线观看| 国产传媒欧美日韩| 好吊一区二区三区| 国产激情第一页| 午夜久久福利影院| 天天操天天插天天射| 668精品在线视频| 亚洲人成网亚洲欧洲无码| 成年网站在线免费观看| 91小视频在线| 一级久久久久久| 自拍偷拍亚洲欧美| 中文字幕成人| 成人性做爰片免费视频| 国产麻豆精品在线| 久久亚洲成人av| 亚洲精品av在线| 欧美电影免费看| 午夜精品一区二区在线观看| 蜜桃av一区二区三区| 强制高潮抽搐sm调教高h| 欧美一区二区啪啪| 欧美草逼视频| 久久手机视频| 日本免费在线视频不卡一不卡二| 女人裸体性做爰全过| 91精品国产丝袜白色高跟鞋| 性欧美videoshd高清| 国产一区视频观看| 美女尤物久久精品| 国产视频123区| 日韩一区二区视频| 嗯啊主人调教在线播放视频 | 男男激情在线| 国产日产久久高清欧美一区| 欧美91视频| 国产精品嫩草av| 欧美唯美清纯偷拍| 婷婷丁香在线| 久久久久久久久久久久久久久久av | 韩日视频在线观看| 久久看人人爽人人| 一级特黄aaa| 亚洲91av视频| 久久精品高清| 国产精品成人99一区无码| 91久久国产最好的精华液| 高潮毛片在线观看| 免费国产一区| 国产精品主播直播| 在线观看日本视频| 久久好看免费视频| 亚洲第一福利社区| 国产成人强伦免费视频网站| 日韩欧美国产网站| 菠萝蜜视频国产在线播放| 久久天天狠狠| 国产一区欧美二区| 无码人妻精品一区二区三区蜜桃91|