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

女朋友都能看懂,Spring如何解決循環依賴?

開發 架構
先說一下什么是循環依賴,Spring在初始化A的時候需要注入B,而初始化B的時候需要注入A,在Spring啟動后這2個Bean都要被初始化完成。

 

本文轉載自微信公眾號「 Java識堂」,作者李立敏。轉載本文請聯系 Java識堂公眾號。

介紹

先說一下什么是循環依賴,Spring在初始化A的時候需要注入B,而初始化B的時候需要注入A,在Spring啟動后這2個Bean都要被初始化完成

[[330848]]

Spring的循環依賴有兩種場景

  1. 構造器的循環依賴
  2. 屬性的循環依賴

構造器的循環依賴,可以在構造函數中使用@Lazy注解延遲加載。在注入依賴時,先注入代理對象,當首次使用時再創建對象完成注入

屬性的循環依賴主要是通過3個map來解決的

構造器的循環依賴

  1. @Component 
  2. public class ConstructorA { 
  3.  
  4.  private ConstructorB constructorB; 
  5.  
  6.  @Autowired 
  7.  public ConstructorA(ConstructorB constructorB) { 
  8.   this.constructorB = constructorB; 
  9.  } 
  10. @Component 
  11. public class ConstructorB { 
  12.  
  13.  private ConstructorA constructorA; 
  14.  
  15.  @Autowired 
  16.  public ConstructorB(ConstructorA constructorA) { 
  17.   this.constructorA = constructorA; 
  18.  } 
  19. @Configuration 
  20. @ComponentScan("com.javashitang.dependency.constructor"
  21. public class ConstructorConfig { 
  22. public class ConstructorMain { 
  23.  
  24.  public static void main(String[] args) { 
  25.   AnnotationConfigApplicationContext context = 
  26.     new AnnotationConfigApplicationContext(ConstructorConfig.class); 
  27.   System.out.println(context.getBean(ConstructorA.class)); 
  28.   System.out.println(context.getBean(ConstructorB.class)); 
  29.  } 

運行ConstructorMain的main方法的時候會在第一行就報異常,說明Spring沒辦法初始化所有的Bean,即上面這種形式的循環依賴Spring無法解決。

我們可以在ConstructorA或者ConstructorB構造函數的參數上加上@Lazy注解就可以解決

  1. @Autowired 
  2. public ConstructorB(@Lazy ConstructorA constructorA) { 
  3.  this.constructorA = constructorA; 

因為我們主要關注屬性的循環依賴,構造器的循環依賴就不做過多分析了

屬性的循環依賴

先演示一下什么是屬性的循環依賴

  1. @Component 
  2. public class FieldA { 
  3.  
  4.  @Autowired 
  5.  private FieldB fieldB; 
  6. @Component 
  7. public class FieldB { 
  8.  
  9.  @Autowired 
  10.  private FieldA fieldA; 
  11. @Configuration 
  12. @ComponentScan("com.javashitang.dependency.field"
  13. public class FieldConfig { 
  14. public class FieldMain { 
  15.  
  16.  public static void main(String[] args) { 
  17.   AnnotationConfigApplicationContext context = 
  18.     new AnnotationConfigApplicationContext(FieldConfig.class); 
  19.   // com.javashitang.dependency.field.FieldA@3aa9e816 
  20.   System.out.println(context.getBean(FieldA.class)); 
  21.   // com.javashitang.dependency.field.FieldB@17d99928 
  22.   System.out.println(context.getBean(FieldB.class)); 
  23.  } 

Spring容器正常啟動,能獲取到FieldA和FieldB這2個Bean

屬性的循環依賴在面試中還是經常被問到的。總體來說也不復雜,但是涉及到Spring Bean的初始化過程,所以感覺比較復雜,我寫個demo演示一下整個過程

Spring的Bean的初始化過程其實比較復雜,為了方便理解Demo,我就把Spring Bean的初始化過程分為2部分

  1. bean的實例化過程,即調用構造函數將對象創建出來
  2. bean的初始化過程,即填充bean的各種屬性

bean初始化過程完畢,則bean就能被正常創建出來了

下面開始寫Demo,ObjectFactory接口用來生產Bean,和Spring中定義的接口一樣

  1. public interface ObjectFactory<T> { 
  2.  T getObject(); 
  3. public class DependencyDemo { 
  4.  
  5.  // 初始化完畢的Bean 
  6.  private final Map<String, Object> singletonObjects = 
  7.    new ConcurrentHashMap<>(256); 
  8.  
  9.  // 正在初始化的Bean對應的工廠,此時對象已經被實例化 
  10.  private final Map<String, ObjectFactory<?>> singletonFactories = 
  11.    new HashMap<>(16); 
  12.  
  13.  // 存放正在初始化的Bean,對象還沒有被實例化之前就放進來了 
  14.  private final Set<String> singletonsCurrentlyInCreation = 
  15.    Collections.newSetFromMap(new ConcurrentHashMap<>(16)); 
  16.  
  17.  public  <T> T getBean(Class<T> beanClass) throws Exception { 
  18.   // 類名為Bean的名字 
  19.   String beanName = beanClass.getSimpleName(); 
  20.   // 已經初始化好了,或者正在初始化 
  21.   Object initObj = getSingleton(beanName, true); 
  22.   if (initObj != null) { 
  23.    return (T) initObj; 
  24.   } 
  25.   // bean正在被初始化 
  26.   singletonsCurrentlyInCreation.add(beanName); 
  27.   // 實例化bean 
  28.   Object object = beanClass.getDeclaredConstructor().newInstance(); 
  29.   singletonFactories.put(beanName, () -> { 
  30.    return object; 
  31.   }); 
  32.   // 開始初始化bean,即填充屬性 
  33.   Field[] fields = object.getClass().getDeclaredFields(); 
  34.   for (Field field : fields) { 
  35.    field.setAccessible(true); 
  36.    // 獲取需要注入字段的class 
  37.    Class<?> fieldClass = field.getType(); 
  38.    field.set(object, getBean(fieldClass)); 
  39.   } 
  40.   // 初始化完畢 
  41.   singletonObjects.put(beanName, object); 
  42.   singletonsCurrentlyInCreation.remove(beanName); 
  43.   return (T) object; 
  44.  } 
  45.  
  46.  /** 
  47.   * allowEarlyReference參數的含義是Spring是否允許循環依賴,默認為true 
  48.   * 所以當allowEarlyReference設置為false的時候,當項目存在循環依賴,會啟動失敗 
  49.   */ 
  50.  public Object getSingleton(String beanName, boolean allowEarlyReference) { 
  51.   Object singletonObject = this.singletonObjects.get(beanName); 
  52.   if (singletonObject == null  
  53.     && isSingletonCurrentlyInCreation(beanName)) { 
  54.    synchronized (this.singletonObjects) { 
  55.     if (singletonObject == null && allowEarlyReference) { 
  56.      ObjectFactory<?> singletonFactory = 
  57.        this.singletonFactories.get(beanName); 
  58.      if (singletonFactory != null) { 
  59.       singletonObject = singletonFactory.getObject(); 
  60.      } 
  61.     } 
  62.    } 
  63.   } 
  64.   return singletonObject; 
  65.  } 
  66.  
  67.  /** 
  68.   * 判斷bean是否正在被初始化 
  69.   */ 
  70.  public boolean isSingletonCurrentlyInCreation(String beanName) { 
  71.   return this.singletonsCurrentlyInCreation.contains(beanName); 
  72.  } 
  73.  

測試一波

  1. public static void main(String[] args) throws Exception { 
  2.  DependencyDemo dependencyDemo = new DependencyDemo(); 
  3.  // 假裝掃描出來的對象 
  4.  Class[] classes = {A.class, B.class}; 
  5.  // 假裝項目初始化所有bean 
  6.  for (Class aClass : classes) { 
  7.   dependencyDemo.getBean(aClass); 
  8.  } 
  9.  // true 
  10.  System.out.println( 
  11.    dependencyDemo.getBean(B.class).getA() == dependencyDemo.getBean(A.class)); 
  12.  // true 
  13.  System.out.println( 
  14.    dependencyDemo.getBean(A.class).getB() == dependencyDemo.getBean(B.class)); 

是不是很簡單?我們只用了2個map就搞定了Spring的循環依賴

2個Map就能搞定循環依賴,那為什么Spring要用3個Map呢?

原因其實也很簡單,當我們從singletonFactories中根據BeanName獲取相應的ObjectFactory,然后調用getObject()這個方法返回對應的Bean。在我們的例子中 ObjectFactory的實現很簡單哈,就是將實例化好的對象直接返回,但是在Spring中就沒有這么簡單了,執行過程比較復雜,為了避免每次拿到ObjectFactory然后調用getObject(),我們直接把ObjectFactory創建的對象緩存起來不就行了,這樣就能提高效率了

比如A依賴B和C,B和C又依賴A,如果不做緩存那么初始化B和C都會調用A對應的ObjectFactory的getObject()方法。如果做緩存只需要B或者C調用一次即可。

知道了思路,我們把上面的代碼改一波,加個緩存。

  1. public class DependencyDemo { 
  2.  
  3.  // 初始化完畢的Bean 
  4.  private final Map<String, Object> singletonObjects = 
  5.    new ConcurrentHashMap<>(256); 
  6.  
  7.  // 正在初始化的Bean對應的工廠,此時對象已經被實例化 
  8.  private final Map<String, ObjectFactory<?>> singletonFactories = 
  9.    new HashMap<>(16); 
  10.  
  11.  // 緩存Bean對應的工廠生產好的Bean 
  12.  private final Map<String, Object> earlySingletonObjects = 
  13.    new HashMap<>(16); 
  14.  
  15.  // 存放正在初始化的Bean,對象還沒有被實例化之前就放進來了 
  16.  private final Set<String> singletonsCurrentlyInCreation = 
  17.    Collections.newSetFromMap(new ConcurrentHashMap<>(16)); 
  18.  
  19.  public  <T> T getBean(Class<T> beanClass) throws Exception { 
  20.   // 類名為Bean的名字 
  21.   String beanName = beanClass.getSimpleName(); 
  22.   // 已經初始化好了,或者正在初始化 
  23.   Object initObj = getSingleton(beanName, true); 
  24.   if (initObj != null) { 
  25.    return (T) initObj; 
  26.   } 
  27.   // bean正在被初始化 
  28.   singletonsCurrentlyInCreation.add(beanName); 
  29.   // 實例化bean 
  30.   Object object = beanClass.getDeclaredConstructor().newInstance(); 
  31.   singletonFactories.put(beanName, () -> { 
  32.    return object; 
  33.   }); 
  34.   // 開始初始化bean,即填充屬性 
  35.   Field[] fields = object.getClass().getDeclaredFields(); 
  36.   for (Field field : fields) { 
  37.    field.setAccessible(true); 
  38.    // 獲取需要注入字段的class 
  39.    Class<?> fieldClass = field.getType(); 
  40.    field.set(object, getBean(fieldClass)); 
  41.   } 
  42.   singletonObjects.put(beanName, object); 
  43.   singletonsCurrentlyInCreation.remove(beanName); 
  44.   earlySingletonObjects.remove(beanName); 
  45.   return (T) object; 
  46.  } 
  47.  
  48.  /** 
  49.   * allowEarlyReference參數的含義是Spring是否允許循環依賴,默認為true 
  50.   */ 
  51.  public Object getSingleton(String beanName, boolean allowEarlyReference) { 
  52.   Object singletonObject = this.singletonObjects.get(beanName); 
  53.   if (singletonObject == null 
  54.     && isSingletonCurrentlyInCreation(beanName)) { 
  55.    synchronized (this.singletonObjects) { 
  56.     singletonObject = this.earlySingletonObjects.get(beanName); 
  57.     if (singletonObject == null && allowEarlyReference) { 
  58.      ObjectFactory<?> singletonFactory = 
  59.        this.singletonFactories.get(beanName); 
  60.      if (singletonFactory != null) { 
  61.       singletonObject = singletonFactory.getObject(); 
  62.       this.earlySingletonObjects.put(beanName, singletonObject); 
  63.       this.singletonFactories.remove(beanName); 
  64.      } 
  65.     } 
  66.    } 
  67.   } 
  68.   return singletonObject; 
  69.  } 

我們寫的getSingleton的實現和org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#getSingleton(java.lang.String, boolean)的實現一模一樣,這個方法幾乎所有分析Spring循環依賴的文章都會提到,這次你明白工作原理是什么了把

總結一波

拿bean的時候先從singletonObjects(一級緩存)中獲取

如果獲取不到,并且對象正在創建中,就從earlySingletonObjects(二級緩存)中獲取

如果還是獲取不到就從singletonFactories(三級緩存)中獲取,然后將獲取到的對象放到earlySingletonObjects(二級緩存)中,并且將bean對應的singletonFactories(三級緩存)清除

bean初始化完畢,放到singletonObjects(一級緩存)中,將bean對應的earlySingletonObjects(二級緩存)清除

 

責任編輯:武曉燕 來源: Java識堂
相關推薦

2023-01-26 00:22:01

分布式架構大文件

2020-02-15 17:16:05

Kubernetes容器

2020-09-28 14:25:39

HTTPS加密算法

2022-07-04 08:31:42

GitOpsGit基礎設施

2019-12-27 09:47:05

大數據TomcatWeb

2021-10-21 08:31:31

Spring循環依賴面試

2019-10-08 10:10:52

中臺 IT后臺

2020-12-01 09:03:22

分庫分表MySQL

2020-01-21 10:16:15

Kubernetes教程容器

2018-11-21 09:40:57

熔斷實踐AOP

2018-11-21 15:40:08

HTTP協議前端

2019-11-26 14:30:20

Spring循環依賴Java

2023-10-07 08:40:57

緩存屬性Spring

2021-09-27 13:50:13

Python裝飾器函數

2019-09-05 11:14:12

監控系統拓撲圖

2022-08-17 07:52:31

Spring循環依賴單例池

2020-12-29 08:34:08

spring循環依賴開發

2019-01-22 09:37:47

紅黑樹數據二叉樹

2021-09-01 10:13:07

數據庫面試節點

2023-11-28 08:00:00

SpringJava
點贊
收藏

51CTO技術棧公眾號

www.午夜av| 精品一区二区不卡| 青娱乐91视频| 西野翔中文久久精品字幕| 色美美综合视频| 中文字幕剧情在线观看一区| 午夜精品久久久久久久99| 国产人成精品一区二区三| 尤物九九久久国产精品的分类 | 黄色在线免费看| 成人av在线影院| 国产精品国语对白| 欧美成人黄色网| 国产欧美日韩影院| 欧美大片在线观看一区| 毛葺葺老太做受视频| 亚洲七七久久综合桃花剧情介绍| 97精品视频在线观看自产线路二| 成人免费看吃奶视频网站| 日韩字幕在线观看| 91精品亚洲| 亚洲视频一区二区三区| 久久久久国产免费| 日韩综合久久| 色呦呦日韩精品| 国产精品久久国产| 欧美96在线| 国产日本一区二区| 精品久久久久久中文字幕动漫| 91丨porny丨在线中文 | 日韩成人黄色| 国产传媒欧美日韩成人| 国产欧美日韩最新| 波多野结衣在线观看一区| 亚洲三级免费| 欧美激情一级二级| 国产老头老太做爰视频| 欧美理论电影大全| 亚洲奶大毛多的老太婆| 人妻av一区二区| 亚洲天堂av资源在线观看| 欧美日产国产精品| 日本www.色| 激情亚洲影院在线观看| 欧美性极品xxxx做受| 国产精品www在线观看| a级片国产精品自在拍在线播放| 国产精品视频九色porn| 欧美一区二区三区精美影视| 少妇喷水在线观看| 成人禁用看黄a在线| 91丝袜脚交足在线播放| 国产黄色av片| 国产成人av电影在线| 亚洲精品欧美一区二区三区| 国产精品久久久久久久一区二区 | 围产精品久久久久久久| 日日噜噜噜夜夜爽亚洲精品| 日韩精品电影一区二区三区| 成人在线一区| 日韩在线高清视频| 婷婷伊人五月天| 伊人久久大香线蕉综合四虎小说| 欧美精品在线观看| 欧美人妻精品一区二区免费看| 欧美福利电影在线观看| 欧美激情xxxx性bbbb| 日韩女同强女同hd| 免费视频一区二区三区在线观看| 国产v综合ⅴ日韩v欧美大片| 99re热视频| 精品一区二区免费视频| 99久久久精品免费观看国产| 视频二区在线观看| 久久日一线二线三线suv| 色乱码一区二区三在线看| 中文字幕在线播放| 亚洲色大成网站www久久九九| 视频一区二区视频| 大香伊人久久| 欧美中文字幕一二三区视频| 91丨九色丨蝌蚪| 成人av综合网| 国产小视频91| 精品99在线观看| 国产精品色网| 成人免费大片黄在线播放| 午夜精品一二三区| 国产欧美日韩精品在线| 18视频在线观看娇喘| sm捆绑调教国产免费网站在线观看 | 日韩福利电影在线观看| 91最新在线免费观看| 香蕉视频免费在线看| 国产精品视频看| 成人黄色av片| 色综合.com| 亚洲黄色在线看| 中文字幕观看av| 一区二区久久| 91亚洲精品久久久| 极品美乳网红视频免费在线观看| 亚洲色图在线看| 97xxxxx| 一区二区三区视频播放| 在线看国产精品| 久久国产精品二区| 蜜桃av噜噜一区| 久久综合久久久| 日本在线观看高清完整版| 欧美性videosxxxxx| 91九色蝌蚪porny| 欧美第一精品| 日本精品在线视频| 成人免费视频国产免费麻豆| 国产精品色噜噜| 国产男女无遮挡| 凹凸成人在线| 九九热视频这里只有精品| 中文字幕一区二区三区波野结| 成人高清免费观看| 日韩精品第1页| 国产精品无码久久久久| 亚洲另类xxxx| 国产网友自拍视频| 国产精品123| 丰满女人性猛交| 国产成人精品一区二区三区在线 | 亚洲无人区码一码二码三码的含义| 欧美精品一卡| 91精品中文在线| 日韩理伦片在线| 欧美婷婷六月丁香综合色| aaaaa级少妇高潮大片免费看| 尤物在线精品| 国产v亚洲v天堂无码| 91精选在线| 制服丝袜一区二区三区| 人人艹在线视频| 奇米精品一区二区三区四区| 欧美日韩在线一二三| 亚洲精品中文字幕| 亚洲欧美另类人妖| 国语对白永久免费| 久久久99精品久久| 精品久久久久久久免费人妻| 蜜桃成人av| 欧洲一区二区视频| 日本精品一二区| 香蕉久久一区二区不卡无毒影院 | 国产日韩欧美一区二区东京热| 国产精品蜜臀在线观看| 色www免费视频| 999国产精品999久久久久久| 国产免费观看久久黄| 日本高清中文字幕在线| 69久久夜色精品国产69蝌蚪网| 51精品免费网站| 国产麻豆精品theporn| 日本福利视频在线观看| caoporn成人免费视频在线| 久99久在线视频| 婷婷久久久久久| 欧美性猛交xxxx富婆弯腰| 中文字幕第20页| 美腿丝袜亚洲一区| 成人性做爰片免费视频| 国产精品久av福利在线观看| 欧美一区在线直播| 成人77777| 欧美一区二区免费视频| 国产无遮挡免费视频| 91美女精品福利| 另类小说第一页| 亚洲综合色网| 久久资源亚洲| 色婷婷成人网| 色综合久久综合网97色综合| 精品久久久视频| 亚洲视频你懂的| 国产白丝精品91爽爽久久| 久久99久久99| 高潮精品一区videoshd| 国产精品二区一区二区aⅴ污介绍| 精品国产乱码久久久久久虫虫漫画| 国内精品中文字幕| 日韩性xxxx| 欧美中文一区二区三区| 国产十六处破外女视频| 99re这里只有精品6| 黄色成人免费看| 一区二区中文| 欧美二级三级| 香蕉久久久久久| 91chinesevideo永久地址| 91sp网站在线观看入口| 精品久久久久久久久久久久久久久久久| 日本天堂在线视频| 国产精品麻豆久久久| 国产一级免费片| 久久精品国产网站| 欧美 国产 综合| 91精品国产91久久综合 | 亚洲伦理久久| 91黑丝在线观看| 二区三区在线观看| 亚洲欧洲xxxx| 懂色av成人一区二区三区| 欧美专区亚洲专区| 国产成人一区二区三区影院在线| 国产精品久久夜| 日本黄色特级片| 成人午夜碰碰视频| 91精品999| 久久字幕精品一区| 黄页免费在线观看视频| 在线成人激情| 一区二区在线不卡| 欧美色就是色| 九色综合日本| 国产精品白丝一区二区三区| 国产精品久久一区| 欧美一级鲁丝片| 国模gogo一区二区大胆私拍 | 亚洲黄色小视频在线观看| 国产日韩1区| 97在线国产视频| 中文字幕一区二区三区在线视频| 水蜜桃亚洲一二三四在线| 神马午夜久久| 激情小说网站亚洲综合网| 97久久综合精品久久久综合| 国产综合久久久久久| 欧美日韩国产网站| 国产精品96久久久久久| 国产高清不卡| 欧美在线性视频| 国产精品25p| 韩国一区二区电影| bl视频在线免费观看| 欧美精品第一页在线播放| 成人影院www在线观看| 天堂午夜影视日韩欧美一区二区| 欧美成ee人免费视频| 国产精品久久久久av蜜臀| 成人动漫在线观看视频| 97久久亚洲| 国模精品一区二区三区| 久久精品国产亚洲blacked| 成人欧美视频在线| www国产精品| 狠狠爱一区二区三区| 激情亚洲另类图片区小说区| 激情视频一区二区| 亚洲黄页网站| 色播亚洲视频在线观看| 欧美gayvideo| 国产精品8888| 日韩视频一区二区三区在线播放免费观看| 成人免费在线网| 欧美专区18| 69久久久久久| 国产成人综合亚洲网站| 日本精品一二三| 2021国产精品久久精品| 欧美亚洲色综久久精品国产| 国产精品久久精品日日| 青青草激情视频| 天天综合天天综合色| 国产一级淫片a视频免费观看| 欧美综合视频在线观看| 国产免费黄色片| 亚洲第一福利网站| 你懂的免费在线观看视频网站| 国产一区二区三区在线| 老司机在线永久免费观看| 欧美人交a欧美精品| 麻豆免费在线| 国产精品美女主播| 免费观看亚洲天堂| 欧美二区三区在线| 图片小说视频色综合| 精品久久久久久久久久中文字幕| 老牛影视一区二区三区| 超碰在线免费av| 91一区二区在线| 日本美女bbw| 亚洲图片欧美综合| 免费一级a毛片| 精品美女被调教视频大全网站| 你懂的视频在线| 欧美国产高跟鞋裸体秀xxxhd| 亚洲美女炮图| 91久久精品国产| 精品中文一区| 4444在线观看| 免费不卡在线视频| 波多野结衣影院| 亚洲视频一区在线| 日韩人妻精品中文字幕| 日韩三区在线观看| 自拍视频在线免费观看| 4438全国亚洲精品在线观看视频| 欧美三级电影网址| 久久综合九色综合久99| 欧美精品福利| 污污的视频免费| 久久久不卡影院| 日韩av大片在线观看| 日韩女优av电影| 蜜桃视频网站在线| 国产精品久久久久9999| 老司机凹凸av亚洲导航| 肉大捧一出免费观看网站在线播放| 日韩电影在线观看一区| 色婷婷精品久久二区二区密| 日韩久久一区二区| 国内av在线播放| 亚洲欧美日韩国产精品| 欧美人与动牲性行为| 91青草视频久久| 日本不卡高清| 国产嫩草在线观看| 国产网红主播福利一区二区| 成人午夜淫片100集| 日韩色视频在线观看| jizz性欧美10| 成人a在线视频| 欧美大片aaaa| 亚洲高清免费在线观看| 国产午夜精品久久| 中文在线第一页| 亚洲欧美日韩一区二区在线 | 亚洲在线观看免费| 999国产精品视频免费| 日韩一中文字幕| 性欧美video另类hd尤物| 一道精品一区二区三区| 喷白浆一区二区| 亚洲一级片在线播放| 欧美在线看片a免费观看| 触手亚洲一区二区三区| 日韩美女在线观看一区| 国产成人精品一区二区免费看京 | 久久亚洲精品大全| 日韩精品一区二区三区中文精品| av片在线观看永久免费| 亚洲xxx视频| 国内揄拍国内精品久久| 99re这里只有| 欧美日韩国产丝袜美女| 免费黄网站在线观看| 国产精品久久久久久久久借妻 | www污在线观看| 波多野洁衣一区| 成年人视频在线免费看| 亚洲人成在线一二| 国产精品亚洲成在人线| 亚洲欧美日韩不卡| 国产91丝袜在线播放0| 日韩av无码中文字幕| 国产视频综合在线| 成人h在线观看| 久久久久久久久影视| 暴力调教一区二区三区| 久久久久久91亚洲精品中文字幕| 亚洲视频精品在线| 国产成人久久精品一区二区三区| 日韩精品第1页| 99久久精品免费| 337p粉嫩色噜噜噜大肥臀| www.亚洲人.com| 999久久久精品一区二区| 成年人视频网站免费观看| 国产精品午夜在线| 国产黄色大片网站| 日本精品久久久| 国产高清欧美| 亚洲精品乱码久久| 欧美午夜片在线看| 久草在线新免费首页资源站| 欧美aaaaa喷水| 久草精品在线观看| 日本熟女一区二区| 日日骚久久av| 日韩深夜影院| 热久久久久久久久| 粉嫩av一区二区三区免费野| 91porn在线观看| 久久久精品有限公司| 九色porny丨国产精品| 国产成人精品a视频一区| 日韩中文字幕在线视频| 久久悠悠精品综合网| 亚洲综合婷婷久久| 欧美视频第一页| 青春草视频在线| 亚洲精品在线免费看| 99久久久久免费精品国产| 亚洲一区二区三区高清视频|