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

Spring Boot打的包為什么能直接運行?

開發 后端
Spring Boot 提供了一個插件 spring-boot-maven-plugin 用于把程序打包成一個可執行的jar包。

Spring Boot 提供了一個插件 spring-boot-maven-plugin 用于把程序打包成一個可執行的jar包。

在pom文件里加入這個插件即可: 

  1. <build>    
  2.  <plugins>    
  3.  <plugin>    
  4.  <groupId>org.springframework.boot</groupId>    
  5.  <artifactId>spring-boot-maven-plugin</artifactId>    
  6.  </plugin>    
  7.  </plugins>    
  8. </build>   

打包完生成的executable-jar-1.0-SNAPSHOT.jar內部的結構如下: 

  1. ├── META-INF  
  2. │   ├── MANIFEST.MF  
  3. │   └── maven  
  4. │       └── spring.study  
  5. │           └── executable-jar  
  6. │               ├── pom.properties  
  7. │               └── pom.xml  
  8. ├── lib  
  9. │   ├── aopalliance-1.0.jar  
  10. │   ├── classmate-1.1.0.jar  
  11. │   ├── spring-boot-1.3.5.RELEASE.jar  
  12. │   ├── spring-boot-autoconfigure-1.3.5.RELEASE.jar  
  13. │   ├── ...  
  14. ├── org  
  15. │   └── springframework  
  16. │       └── boot  
  17. │           └── loader  
  18. │               ├── ExecutableArchiveLauncher$1.class  
  19. │               ├── ...  
  20. └── spring  
  21.     └── study  
  22.         └── executablejar  
  23.             └── ExecutableJarApplication.class 

然后可以直接執行jar包就能啟動程序了: 

  1. java -jar executable-jar-1.0-SNAPSHOT.jar 

運行 Spring Boot 應用的幾種方式看這篇:運行 Spring Boot 應用的3種方式。

打包出來fat jar內部有4種文件類型:

  1.  META-INF文件夾:程序入口,其中MANIFEST.MF用于描述jar包的信息
  2.  lib目錄:放置第三方依賴的jar包,比如springboot的一些jar包
  3.  spring boot loader相關的代碼
  4.  模塊自身的代碼

MANIFEST.MF文件的內容: 

  1. Manifest-Version: 1.0  
  2. Implementation-Title: executable-jar  
  3. Implementation-Version: 1.0-SNAPSHOT  
  4. Archiver-Version: Plexus Archiver  
  5. Built-By: Format  
  6. Start-Class: spring.study.executablejar.ExecutableJarApplication  
  7. Implementation-Vendor-Id: spring.study  
  8. Spring-Boot-Version: 1.3.5.RELEASE  
  9. Created-By: Apache Maven 3.2.3  
  10. Build-Jdk: 1.8.0_20  
  11. Implementation-Vendor: Pivotal Software, Inc.  
  12. Main-Class: org.springframework.boot.loader.JarLauncher 

我們看到,它的Main-Class是org.springframework.boot.loader.JarLauncher,當我們使用java -jar執行jar包的時候會調用JarLauncher的main方法,而不是我們編寫的SpringApplication。

那么JarLauncher這個類是的作用是什么的?

它是SpringBoot內部提供的工具Spring Boot Loader提供的一個用于執行Application類的工具類(fat jar內部有spring loader相關的代碼就是因為這里用到了)。相當于Spring Boot Loader提供了一套標準用于執行SpringBoot打包出來的jar。

關注微信公眾號:Java技術棧,在后臺回復:boot,可以獲取我整理的 N 篇 Spring boot 教程,都是干貨。

Spring Boot Loader抽象的一些類

抽象類Launcher:各種Launcher的基礎抽象類,用于啟動應用程序;跟Archive配合使用;目前有3種實現,分別是JarLauncher、WarLauncher以及PropertiesLauncher。

Archive:歸檔文件的基礎抽象類。JarFileArchive就是jar包文件的抽象。它提供了一些方法比如getUrl會返回這個Archive對應的URL;getManifest方法會獲得Manifest數據等。ExplodedArchive是文件目錄的抽象

JarFile:對jar包的封裝,每個JarFileArchive都會對應一個JarFile。JarFile被構造的時候會解析內部結構,去獲取jar包里的各個文件或文件夾,這些文件或文件夾會被封裝到Entry中,也存儲在JarFileArchive中。如果Entry是個jar,會解析成JarFileArchive。

比如一個JarFileArchive對應的URL為: 

  1. jar:file:/Users/format/Develop/gitrepository/springboot-analysis/springboot-executable-jar/target/executable-jar-1.0-SNAPSHOT.jar!/ 

它對應的JarFile為: 

  1. /Users/format/Develop/gitrepository/springboot-analysis/springboot-executable-jar/target/executable-jar-1.0-SNAPSHOT.jar 

這個JarFile有很多Entry,比如: 

  1. META-INF/  
  2. META-INF/MANIFEST.MF  
  3. spring/  
  4. spring/study/  
  5. ....  
  6. spring/study/executablejar/ExecutableJarApplication.class  
  7. lib/spring-boot-starter-1.3.5.RELEASE.jar  
  8. lib/spring-boot-1.3.5.RELEASE.jar  
  9. ... 

JarFileArchive內部的一些依賴jar對應的URL(SpringBoot使用org.springframework.boot.loader.jar.Handler處理器來處理這些URL): 

  1. jar:file:/Users/Format/Develop/gitrepository/springboot-analysis/springboot-executable-jar/target/executable-jar-1.0-SNAPSHOT.jar!/lib/spring-boot-starter-web-1.3.5.RELEASE.jar!/ 
  2. jar:file:/Users/Format/Develop/gitrepository/springboot-analysis/springboot-executable-jar/target/executable-jar-1.0-SNAPSHOT.jar!/lib/spring-boot-loader-1.3.5.RELEASE.jar!/org/springframework/boot/loader/JarLauncher.class 

 我們看到如果有jar包中包含jar,或者jar包中包含jar包里面的class文件,那么會使用 !/ 分隔開,這種方式只有org.springframework.boot.loader.jar.Handler能處理,它是 Spring Boot 內部擴展出來的一種URL協議。

JarLauncher的執行過程

JarLauncher的main方法: 

  1. public static void main(String\[\] args) {    
  2.  // 構造JarLauncher,然后調用它的launch方法。參數是控制臺傳遞的    
  3.  new JarLauncher().launch(args);    
  4. }   

JarLauncher被構造的時候會調用父類ExecutableArchiveLauncher的構造方法。

ExecutableArchiveLauncher的構造方法內部會去構造Archive,這里構造了JarFileArchive。構造JarFileArchive的過程中還會構造很多東西,比如JarFile,Entry …

JarLauncher的launch方法: 

  1. protected void launch(String\[\] args) {    
  2.  try {    
  3.  // 在系統屬性中設置注冊了自定義的URL處理器:org.springframework.boot.loader.jar.Handler。如果URL中沒有指定處理器,會去系統屬性中查詢    
  4.  JarFile.registerUrlProtocolHandler();    
  5.  // getClassPathArchives方法在會去找lib目錄下對應的第三方依賴JarFileArchive,同時也會項目自身的JarFileArchive    
  6.  // 根據getClassPathArchives得到的JarFileArchive集合去創建類加載器ClassLoader。這里會構造一個LaunchedURLClassLoader類加載器,這個類加載器繼承URLClassLoader,并使用這些JarFileArchive集合的URL構造成URLClassPath   
  7.   // LaunchedURLClassLoader類加載器的父類加載器是當前執行類JarLauncher的類加載器   
  8.  ClassLoader classLoader = createClassLoader(getClassPathArchives());    
  9.  // getMainClass方法會去項目自身的Archive中的Manifest中找出key為Start-Class的類    
  10.  // 調用重載方法launch    
  11.  launch(args, getMainClass(), classLoader);    
  12.  }    
  13.  catch (Exception ex) {    
  14.  ex.printStackTrace();    
  15.  System.exit(1);    
  16.  }    
  17. }    
  18. // Archive的getMainClass方法    
  19. // 這里會找出spring.study.executablejar.ExecutableJarApplication這個類    
  20. public String getMainClass() throws Exception {    
  21.  Manifest manifest = getManifest();   
  22.   String mainClass = null;    
  23.  if (manifest != null) {    
  24.  mainClass = manifest.getMainAttributes().getValue("Start-Class");    
  25.  }    
  26.  if (mainClass == null) {    
  27.  throw new IllegalStateException(    
  28.  "No 'Start-Class' manifest entry specified in " \+ this);    
  29.  }    
  30.  return mainClass;    
  31. }    
  32. // launch重載方法    
  33. protected void launch(String\[\] args, String mainClass, ClassLoader classLoader)    
  34.  throws Exception {   
  35.   // 創建一個MainMethodRunner,并把args和Start-Class傳遞給它    
  36.  Runnable runner = createMainMethodRunner(mainClass, args, classLoader);    
  37.  // 構造新線程    
  38.  Thread runnerThread = new Thread(runner);    
  39.  // 線程設置類加載器以及名字,然后啟動    
  40.  runnerThread.setContextClassLoader(classLoader);  
  41.  runnerThread.setName(Thread.currentThread().getName());    
  42.  runnerThread.start();    
  43. }   

MainMethodRunner的run方法: 

  1. @Override    
  2. public void run() {    
  3.  try {    
  4.  // 根據Start-Class進行實例化  
  5.  Class<?> mainClass = Thread.currentThread().getContextClassLoader()    
  6.  .loadClass(this.mainClassName);    
  7.  // 找出main方法    
  8.  Method mainMethod = mainClass.getDeclaredMethod("main", String\[\].class);    
  9.  // 如果main方法不存在,拋出異常    
  10.  if (mainMethod == null) {    
  11.  throw new IllegalStateException(    
  12.  this.mainClassName + " does not have a main method");    
  13.  }    
  14.  // 調用    
  15.  mainMethod.invoke(null, new Object\[\] { this.args });    
  16.  }    
  17.  catch (Exception ex) {    
  18.  UncaughtExceptionHandler handler = Thread.currentThread()    
  19.  .getUncaughtExceptionHandler();    
  20.  if (handler != null) {    
  21.  handler.uncaughtException(Thread.currentThread(), ex);    
  22.  }    
  23.  throw new RuntimeException(ex);    
  24.  }    
  25. }   

Start-Class的main方法調用之后,內部會構造Spring容器,啟動內置Servlet容器等過程。這些過程我們都已經分析過了。Spring Boo主類及目錄結構介紹,這篇看下。

關于自定義的類加載器LaunchedURLClassLoader

LaunchedURLClassLoader重寫了loadClass方法,也就是說它修改了默認的類加載方式(先看該類是否已加載這部分不變,后面真正去加載類的規則改變了,不再是直接從父類加載器中去加載)。LaunchedURLClassLoader定義了自己的類加載規則: 

  1. private Class<?> doLoadClass(String name) throws ClassNotFoundException {   
  2.  // 1) Try the root class loader    
  3.  try {    
  4.  if (this.rootClassLoader != null) {   
  5.  return this.rootClassLoader.loadClass(name);    
  6.  }    
  7.  }    
  8.  catch (Exception ex) {    
  9.  // Ignore and continue    
  10.  }    
  11.  // 2) Try to find locally    
  12.  try {   
  13.   findPackage(name);    
  14.  Class<?> cls = findClass(name);   
  15.  return cls;    
  16.  }    
  17.  catch (Exception ex) {    
  18.  // Ignore and continue    
  19.  }    
  20.  // 3) Use standard loading    
  21.  return super.loadClass(name, false);    
  22. }   

加載規則:

  1.  如果根類加載器存在,調用它的加載方法。這里是根類加載是ExtClassLoader
  2.  調用LaunchedURLClassLoader自身的findClass方法,也就是URLClassLoader的findClass方法
  3.  調用父類的loadClass方法,也就是執行默認的類加載順序(從BootstrapClassLoader開始從下往下尋找)

LaunchedURLClassLoader自身的findClass方法: 

  1. protected Class<?> findClass(final String name)  
  2.  throws ClassNotFoundException    
  3. {    
  4.  try {    
  5.  return AccessController.doPrivileged(    
  6.  new PrivilegedExceptionAction<Class<?>>() {    
  7.  public Class<?> run() throws ClassNotFoundException {    
  8.  // 把類名解析成路徑并加上.class后綴    
  9.  String path = name.replace('.', '/').concat(".class");    
  10.  // 基于之前得到的第三方jar包依賴以及自己的jar包得到URL數組,進行遍歷找出對應類名的資源    
  11.  // 比如path是org/springframework/boot/loader/JarLauncher.class,它在jar:file:/Users/Format/Develop/gitrepository/springboot-analysis/springboot-executable-jar/target/executable-jar-1.0-SNAPSHOT.jar!/lib/spring-boot-loader-1.3.5.RELEASE.jar!/中被找出   
  12.   // 那么找出的資源對應的URL為jar:file:/Users/Format/Develop/gitrepository/springboot-analysis/springboot-executable-jar/target/executable-jar-1.0-SNAPSHOT.jar!/lib/spring-boot-loader-1.3.5.RELEASE.jar!/org/springframework/boot/loader/JarLauncher.class   
  13.   Resource res = ucp.getResource(path, false);    
  14.  if (res != null) { // 找到了資源    
  15.  try {    
  16.  return defineClass(name, res);    
  17.  } catch (IOException e) {    
  18.  throw new ClassNotFoundException(name, e); 
  19.  }    
  20.  } else { // 找不到資源的話直接拋出ClassNotFoundException異常    
  21.  throw new ClassNotFoundException(name);    
  22.  }    
  23.  }    
  24.  }, acc);    
  25.  } catch (java.security.PrivilegedActionException pae) {
  26.   throw (ClassNotFoundException) pae.getException();   
  27.  }    
  28. }   

 下面是LaunchedURLClassLoader的一個測試: 

  1. // 注冊org.springframework.boot.loader.jar.Handler URL協議處理器    
  2. JarFile.registerUrlProtocolHandler();    
  3. // 構造LaunchedURLClassLoader類加載器,這里使用了2個URL,分別對應jar包中依賴包spring-boot-loader和spring-boot,使用 "!/" 分開,需要org.springframework.boot.loader.jar.Handler處理器處理   
  4. LaunchedURLClassLoader classLoader = new LaunchedURLClassLoader(    
  5.  new URL\[\] {    
  6.  new URL("jar:file:/Users/Format/Develop/gitrepository/springboot-analysis/springboot-executable-jar/target/executable-jar-1.0-SNAPSHOT.jar!/lib/spring-boot-loader-1.3.5.RELEASE.jar!/")   
  7.   , new URL("jar:file:/Users/Format/Develop/gitrepository/springboot-analysis/springboot-executable-jar/target/executable-jar-1.0-SNAPSHOT.jar!/lib/spring-boot-1.3.5.RELEASE.jar!/")   
  8.   },   
  9.  LaunchedURLClassLoaderTest.class.getClassLoader());    
  10. // 加載類    
  11. // 這2個類都會在第二步本地查找中被找出(URLClassLoader的findClass方法)    
  12. classLoader.loadClass("org.springframework.boot.loader.JarLauncher");    
  13. classLoader.loadClass("org.springframework.boot.SpringApplication");    
  14. // 在第三步使用默認的加載順序在ApplicationClassLoader中被找出    
  15. classLoader.loadClass("org.springframework.boot.autoconfigure.web.DispatcherServletAutoConfiguration");   

Spring Boot Loader的作用

Spring Boot 在可執行jar包中定義了自己的一套規則,比如第三方依賴jar包在/lib目錄下,jar包的URL路徑使用自定義的規則并且這個規則需要使用org.springframework.boot.loader.jar.Handler處理器處理。

它的Main-Class使用JarLauncher,如果是war包,使用WarLauncher執行。這些Launcher內部都會另起一個線程啟動自定義的SpringApplication類。

這些特性通過spring-boot-maven-plugin插件打包完成。 

 

責任編輯:龐桂玉 來源: Java技術棧
相關推薦

2022-02-13 20:31:26

SpringBootjarmanifests

2024-11-26 08:36:56

SpringJar機制

2023-11-30 08:16:19

SpringjarTomcat

2024-04-03 09:01:34

SpringTomcat容器

2015-08-17 10:16:00

CentOSDocker命令root

2023-04-04 22:23:09

2009-06-29 18:35:41

操作系統服務器軟件

2019-03-06 13:45:20

Windows 10Xbox微軟

2020-06-30 14:25:28

MavenGradle Spring

2020-08-27 11:35:36

Python 開發編程語言

2025-04-01 08:08:29

2020-08-14 10:40:35

RestTemplatRetrofitJava

2022-05-07 07:47:23

SpringJava開發

2020-11-11 16:46:35

蘋果macOS操作系統

2023-05-29 08:43:46

SpringJava

2023-07-31 07:45:12

Spring項目Jakarta

2020-08-24 15:56:49

AndroidWindows 10三星

2024-05-29 10:43:31

2020-10-22 14:20:39

Parallels

2021-09-29 16:53:53

區塊鏈數據技術
點贊
收藏

51CTO技術棧公眾號

japanese23hdxxxx日韩 | 亚洲一区在线观看免费观看电影高清 | 日本道色综合久久| 亚洲欧洲精品在线| 国产黄色片网站| 亚洲在线播放| www.xxxx欧美| 国产精品成人99一区无码 | 国产精品欧美日韩久久| 欧美成人aaa片一区国产精品| 国内精品麻豆美女在线播放视频 | 亚洲免费av片| 亚洲精品mv在线观看| а√在线中文网新版地址在线| 久久精品视频一区二区| 91中文字幕在线| 国产又大又黄又粗| 欧美国产高清| 国产亚洲精品成人av久久ww| 久久久久久久久久久影视| 涩涩网在线视频| 亚洲精品国产一区二区精华液| 久久久综合香蕉尹人综合网| 国产裸体无遮挡| 亚洲一区二区成人| 欧美国产精品va在线观看| 日韩精品电影一区二区三区| 欧美wwwwww| 日韩一区二区在线观看视频| 欧美成人xxxxx| 天堂8中文在线| 国产精品美女久久久久aⅴ国产馆| 国产精品国产三级欧美二区| 国产一区二区在线播放视频| 美女爽到呻吟久久久久| 欧美精品videos性欧美| 日韩一卡二卡在线观看| 狠狠操综合网| 精品丝袜一区二区三区| 第一页在线视频| 一区二区三区日本视频| 欧美在线不卡视频| 日本精品免费在线观看| аⅴ资源天堂资源库在线| 亚洲少妇30p| 翔田千里亚洲一二三区| 你懂的好爽在线观看| 99久久综合狠狠综合久久| 成人在线观看网址| 超碰福利在线观看| 国产福利一区二区三区在线视频| 国产一区二区视频在线观看| 波多野结衣一区二区三区在线| 国产午夜精品一区二区三区欧美 | xxx在线免费观看| 悠悠色在线精品| 日韩一二区视频| a天堂中文在线官网在线| 综合分类小说区另类春色亚洲小说欧美| 欧美日韩系列| 嫩草研究院在线观看| 久久久久国产精品人| 美女主播视频一区| 欧美日韩激情视频一区二区三区| 91在线视频观看| 精品视频高清无人区区二区三区| 性感美女福利视频| 91丝袜高跟美女视频| 蜜桃传媒视频麻豆一区| 免费在线超碰| 久久精品人人做人人爽人人| 日本成人黄色免费看| 国产日本在线视频| 国产精品久久久久久妇女6080| 亚洲欧美综合一区| 麻豆免费在线观看| 一区二区三区中文字幕| 成人网站免费观看入口| 91网址在线观看| 亚洲风情在线资源站| 亚洲美免无码中文字幕在线| 日韩激情电影| 欧美日韩在线综合| 中文字幕55页| 国产精品久av福利在线观看| 日韩国产在线播放| 在线免费观看视频| 五月激情久久久| 久久久久久综合网天天| 国产又黄又粗又爽| 蜜臀av性久久久久蜜臀aⅴ流畅| 成人黄色免费网站在线观看| www.蜜臀av| 久久综合久久综合亚洲| 亚洲欧洲精品在线| 国产第一页在线| 在线观看日韩精品| 中文字幕一二三| 亚洲老女人视频免费| 精品国产一区二区三区久久狼黑人 | 午夜在线视频免费观看| 欧美大胆的人体xxxx| 欧美视频在线观看免费| 成人亚洲免费视频| 欧美精品国产白浆久久久久| 视频直播国产精品| 国产极品美女高潮无套嗷嗷叫酒店| 每日更新成人在线视频| 亚洲一区二区三区毛片 | 中文字幕亚洲国产| avove在线播放| 久久精品三级| 国产91精品一区二区绿帽| 高清美女视频一区| 亚洲国产一区二区三区 | 国产福利一区二区三区视频| 免费试看一区| 婷婷av在线| 欧美日韩在线不卡| 泷泽萝拉在线播放| 午夜精品网站| 国产精品视频在线观看| 熟妇人妻系列aⅴ无码专区友真希| 国产精品久久久久久久久免费丝袜 | 一区二区三区在线不卡| 亚洲视频在线a| 首页亚洲中字| 欧美激情a∨在线视频播放| 中文字幕一区二区在线视频| 91麻豆蜜桃一区二区三区| 国产又粗又长又爽视频| 婷婷激情成人| 国产亚洲a∨片在线观看| 日韩三级av在线| 国产精品88av| 久久免费看毛片| 91精品xxx在线观看| 日韩av一区二区在线| 久久久久久国产精品视频| 激情图区综合网| 亚洲不卡一卡2卡三卡4卡5卡精品| 国产91足控脚交在线观看| 日韩一卡二卡三卡国产欧美| 成人信息集中地| 视频一区在线视频| 欧美精品一区二区视频| 日韩激情电影| 亚洲美女喷白浆| 国产性猛交╳xxx乱大交| 波多野结衣91| 99久久国产综合精品五月天喷水| av成人app永久免费| 免费不卡欧美自拍视频| 国产不卡av在线播放| 亚洲色图清纯唯美| 一区二区久久精品| 亚欧美无遮挡hd高清在线视频| 国产日韩欧美中文在线播放| 一区二区三区视频网站 | 黄色片网站免费在线观看| 一区二区三区蜜桃| 日本精品一二三区| 亚洲每日在线| 久久久久久久久久久久久久久久av| 蜜桃在线视频| 国产亚洲在线播放| 亚洲午夜精品久久久| 中文字幕中文字幕在线一区| 色婷婷激情视频| 欧美午夜不卡影院在线观看完整版免费| 91久久精品一区二区别| 超级碰碰不卡在线视频| 亚洲激情国产精品| 亚洲欧美日韩激情| 国产精品久99| 极品人妻一区二区| 99精品视频免费观看视频| 麻豆av一区二区三区| 中文字幕日本一区二区| 精品久久久av| 天堂成人在线视频| 91久久精品午夜一区二区| 久久一级免费视频| 国产成人在线视频网站| www.爱色av.com| 日本精品黄色| 91嫩草在线| 在线看片福利| 在线成人一区二区| a天堂视频在线| 福利视频第一区| 长河落日免费高清观看| 高清不卡一区二区在线| 欧美韩国日本在线| 日韩在线欧美| 国产亚洲欧美一区二区 | 91九色视频在线观看| 理论不卡电影大全神| 中国人与牲禽动交精品| 性一交一乱一乱一视频| 在线亚洲精品福利网址导航| 四虎884aa成人精品| 91视频xxxx| 亚洲色图欧美自拍| 久久国产88| 91国在线高清视频| 精品免费一区二区| 懂色一区二区三区av片| 色猫猫成人app| 欧美激情在线有限公司| 日韩av中文| 日韩精品免费观看| 国产成人精品一区二三区四区五区 | 欧美h片在线观看| 不卡视频一二三| 久久精品国产露脸对白| 三级一区在线视频先锋| 国产精品久久久久久久乖乖| 婷婷丁香综合| 欧美午夜免费| 加勒比色老久久爱综合网| 91精品综合视频| 草莓视频成人appios| 午夜精品三级视频福利| 黄色一级片在线观看| 亚洲人成自拍网站| 三级网站免费观看| 欧美一三区三区四区免费在线看| 男人天堂视频在线| 欧美日韩国产精品一区二区不卡中文| 麻豆精品一区二区三区视频| 中文字幕第一页久久| 国产ts丝袜人妖系列视频| 成人动漫在线一区| wwwxxx色| 国产一区二区三区四区五区美女| 欧美精品无码一区二区三区| 国产精品免费看| 免费不卡av在线| 韩国在线一区| 欧美 亚洲 视频| 亚洲高清影视| 先锋影音男人资源| 五月精品视频| 综合视频免费看| 91一区二区| 日本黄色a视频| 99久久精品网站| 尤物一区二区三区| 成人在线免费观看网站| 午夜精品一区二区三区在线观看| 午夜精品福利影院| 蜜桃久久影院| 网红女主播少妇精品视频| 精品视频一区二区| 奇米狠狠一区二区三区| 日韩在线观看电影完整版高清免费| 沈樵精品国产成av片| www成人在线观看| 国产一级做a爰片久久| 久久福利一区| 成人黄色片视频| 亚洲女同同性videoxma| 情侣黄网站免费看| 老色鬼久久亚洲一区二区| 无码无遮挡又大又爽又黄的视频| 免费精品视频| 99精品视频播放| 日韩专区在线视频| 亚洲xxxx2d动漫1| 精品一二三四在线| 中文字幕久久久久久久| 成人精品免费视频| 亚洲乱码国产乱码精品精大量| 久久欧美一区二区| www久久久久久久| 日韩毛片一二三区| 免费在线观看黄色av| 婷婷综合在线观看| 成人a v视频| 制服丝袜国产精品| 免费观看黄一级视频| 亚洲欧美国产精品专区久久| jizz在线免费观看| 欧美理论电影在线观看| 国产自产自拍视频在线观看| 热re91久久精品国99热蜜臀| 激情久久一区二区| 成人国产1314www色视频| 伊人成综合网yiren22| 亚洲欧美影院| 91久久亚洲| 在线免费视频一区| 成人福利在线看| 男人舔女人下部高潮全视频| 亚洲蜜臀av乱码久久精品| 国产精品男女视频| 7777精品伊人久久久大香线蕉超级流畅 | 成人免费播放视频| 97se亚洲国产综合自在线不卡| 欧美日韩中文字幕视频| 亚洲综合在线观看视频| 中文字幕日韩免费| 日韩欧美电影一二三| 国产午夜在线视频| 久久久噜噜噜久久| 午夜av成人| 国产另类自拍| 999久久久精品国产| 国产精品50p| 国产综合久久久久影院| 少妇按摩一区二区三区| 玉足女爽爽91| 一级黄色小视频| 亚洲欧美色婷婷| 成年网站在线视频网站| 国产在线精品自拍| 校花撩起jk露出白色内裤国产精品| 中国一级黄色录像| 日韩成人精品视频| 国产又粗又猛又色| 亚洲精品免费看| 在线免费观看一级片| 精品偷拍各种wc美女嘘嘘| 在线观看三级视频| 国产欧美精品一区二区| 窝窝社区一区二区| 性欧美大战久久久久久久| 黑人巨大精品欧美黑白配亚洲| 新91视频在线观看| 亚欧色一区w666天堂| 精品国产亚洲一区二区麻豆| 色噜噜狠狠狠综合曰曰曰 | 91亚洲成人| 欧在线一二三四区| 99久久99久久综合| 久久久全国免费视频| 91精品免费在线| 国产原创视频在线观看| 国产精品永久免费视频| 国产欧美日韩在线一区二区| 午夜精品久久久久久久无码 | 久久人妻一区二区| 一区二区三区精品在线观看| 国产精品国产一区二区三区四区 | 米奇精品一区二区三区| 国产精品福利小视频| 久草成人资源| 成人一级片网站| 久久久久9999亚洲精品| 久久精品国产成人av| 亚洲热线99精品视频| 韩国美女久久| 日韩av一级大片| 久久精品动漫| 老头老太做爰xxx视频| 欧美色图免费看| 免费人成在线观看播放视频| 国产免费一区二区三区在线能观看| 日韩av大片| 亚洲欧美手机在线| 一区二区三区在线播放| 亚洲狼人综合网| 91av视频在线观看| 久久99视频| 手机av在线网| 亚洲精品视频在线观看免费 | 日韩电影中文字幕在线观看| 在线免费av资源| 日本一区二区三区四区高清视频| 日本网站在线观看一区二区三区| 欧美成人短视频| 在线播放中文字幕一区| 性直播体位视频在线观看| 国产伦精品一区二区三区免费视频| 亚洲深夜影院| 国产精品20p| 69堂成人精品免费视频| 超级碰碰不卡在线视频| 欧美少妇一区| 激情av综合网| 久久精品视频8| 亚洲人成电影在线播放| 亚洲aⅴ网站| 青青草综合在线| 26uuu亚洲| 91丨porny丨在线中文 | 在线播放亚洲一区| 99热99re6国产在线播放| 日本不卡二区高清三区| 狠狠色综合日日| 日本五十熟hd丰满| 在线视频日韩精品| 99国产精品免费网站| chinese少妇国语对白| 亚洲色图第一区| 亚洲色图另类小说| 成人综合国产精品| 亚洲综合国产激情另类一区| 女人18毛片毛片毛片毛片区二|