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

Spring如何解決循環依賴的問題

開發 后端
在關于Spring的面試中,我們經常會被問到一個問題,就是Spring是如何解決循環依賴的問題的。本文主要針對這個問題,從源碼的角度對其實現原理進行講解。

在關于Spring的面試中,我們經常會被問到一個問題,就是Spring是如何解決循環依賴的問題的。這個問題算是關于Spring的一個高頻面試題,因為如果不刻意研讀,相信即使讀過源碼,面試者也不一定能夠一下子思考出個中奧秘。本文主要針對這個問題,從源碼的角度對其實現原理進行講解。

1. 過程演示

關于Spring bean的創建,其本質上還是一個對象的創建,既然是對象,讀者朋友一定要明白一點就是,一個完整的對象包含兩部分:當前對象實例化和對象屬性的實例化。在Spring中,對象的實例化是通過反射實現的,而對象的屬性則是在對象實例化之后通過一定的方式設置的。這個過程可以按照如下方式進行理解:

理解這一個點之后,對于循環依賴的理解就已經幫助一大步了,我們這里以兩個類A和B為例進行講解,如下是A和B的聲明: 

  1. @Component  
  2. public class A {  
  3.   private B b;  
  4.   public void setB(B b) {  
  5.     this.b = b;  
  6.   }  
  7.  
  1. @Component  
  2. public class B {  
  3.   private A a;  
  4.   public void setA(A a) {  
  5.     this.a = a;  
  6.   }  

可以看到,這里A和B中各自都以對方為自己的全局屬性。這里首先需要說明的一點是,Spring實例化bean是通過ApplicationContext.getBean()方法來進行的。如果要獲取的對象依賴了另一個對象,那么其首先會創建當前對象,然后通過遞歸的調用ApplicationContext.getBean()方法來獲取所依賴的對象,最后將獲取到的對象注入到當前對象中。這里我們以上面的首先初始化A對象實例為例進行講解。首先Spring嘗試通過ApplicationContext.getBean()方法獲取A對象的實例,由于Spring容器中還沒有A對象實例,因而其會創建一個A對象,然后發現其依賴了B對象,因而會嘗試遞歸的通過ApplicationContext.getBean()方法獲取B對象的實例,但是Spring容器中此時也沒有B對象的實例,因而其還是會先創建一個B對象的實例。讀者需要注意這個時間點,此時A對象和B對象都已經創建了,并且保存在Spring容器中了,只不過A對象的屬性b和B對象的屬性a都還沒有設置進去。在前面Spring創建B對象之后,Spring發現B對象依賴了屬性A,因而此時還是會嘗試遞歸的調用ApplicationContext.getBean()方法獲取A對象的實例,因為Spring中已經有一個A對象的實例,雖然只是半成品(其屬性b還未初始化),但其也還是目標bean,因而會將該A對象的實例返回。此時,B對象的屬性a就設置進去了,然后還是ApplicationContext.getBean()方法遞歸的返回,也就是將B對象的實例返回,此時就會將該實例設置到A對象的屬性b中。這個時候,注意A對象的屬性b和B對象的屬性a都已經設置了目標對象的實例了。讀者朋友可能會比較疑惑的是,前面在為對象B設置屬性a的時候,這個A類型屬性還是個半成品。但是需要注意的是,這個A是一個引用,其本質上還是最開始就實例化的A對象。而在上面這個遞歸過程的最后,Spring將獲取到的B對象實例設置到了A對象的屬性b中了,這里的A對象其實和前面設置到實例B中的半成品A對象是同一個對象,其引用地址是同一個,這里為A對象的b屬性設置了值,其實也就是為那個半成品的a屬性設置了值。下面我們通過一個流程圖來對這個過程進行講解:

 

圖中getBean()表示調用Spring的ApplicationContext.getBean()方法,而該方法中的參數,則表示我們要嘗試獲取的目標對象。圖中的黑色箭頭表示一開始的方法調用走向,走到最后,返回了Spring中緩存的A對象之后,表示遞歸調用返回了,此時使用綠色的箭頭表示。從圖中我們可以很清楚的看到,B對象的a屬性是在第三步中注入的半成品A對象,而A對象的b屬性是在第二步中注入的成品B對象,此時半成品的A對象也就變成了成品的A對象,因為其屬性已經設置完成了。

2. 源碼講解

對于Spring處理循環依賴問題的方式,我們這里通過上面的流程圖其實很容易就可以理解,需要注意的一個點就是,Spring是如何標記開始生成的A對象是一個半成品,并且是如何保存A對象的。這里的標記工作Spring是使用ApplicationContext的屬性Set<String> singletonsCurrentlyInCreation來保存的,而半成品的A對象則是通過Map<String, ObjectFactory<?>> singletonFactories來保存的,這里的ObjectFactory是一個工廠對象,可通過調用其getObject()方法來獲取目標對象。在AbstractBeanFactory.doGetBean()方法中獲取對象的方法如下: 

  1. protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType,  
  2.     @Nullable final Object[] args, boolean typeCheckOnly) throws BeansException {  
  3.   // 嘗試通過bean名稱獲取目標bean對象,比如這里的A對象  
  4.   Object sharedInstance = getSingleton(beanName);   
  5.   // 我們這里的目標對象都是單例的  
  6.   if (mbd.isSingleton()) {  
  7.     // 這里就嘗試創建目標對象,第二個參數傳的就是一個ObjectFactory類型的對象,這里是使用Java8的lamada  
  8.     // 表達式書寫的,只要上面的getSingleton()方法返回值為空,則會調用這里的getSingleton()方法來創建  
  9.     // 目標對象 
  10.      sharedInstance = getSingleton(beanName, () -> {  
  11.       try {  
  12.         // 嘗試創建目標對象  
  13.         return createBean(beanName, mbd, args);  
  14.       } catch (BeansException ex) {  
  15.         throw ex;  
  16.       }  
  17.     });  
  18.   }  
  19.   return (T) bean;  

 這里的doGetBean()方法是非常關鍵的一個方法(中間省略了其他代碼),上面也主要有兩個步驟,第一個步驟的getSingleton()方法的作用是嘗試從緩存中獲取目標對象,如果沒有獲取到,則嘗試獲取半成品的目標對象;如果第一個步驟沒有獲取到目標對象的實例,那么就進入第二個步驟,第二個步驟的getSingleton()方法的作用是嘗試創建目標對象,并且為該對象注入其所依賴的屬性。

這里其實就是主干邏輯,我們前面圖中已經標明,在整個過程中會調用三次doGetBean()方法,第一次調用的時候會嘗試獲取A對象實例,此時走的是第一個getSingleton()方法,由于沒有已經創建的A對象的成品或半成品,因而這里得到的是null,然后就會調用第二個getSingleton()方法,創建A對象的實例,然后遞歸的調用doGetBean()方法,嘗試獲取B對象的實例以注入到A對象中,此時由于Spring容器中也沒有B對象的成品或半成品,因而還是會走到第二個getSingleton()方法,在該方法中創建B對象的實例,創建完成之后,嘗試獲取其所依賴的A的實例作為其屬性,因而還是會遞歸的調用doGetBean()方法,此時需要注意的是,在前面由于已經有了一個半成品的A對象的實例,因而這個時候,再嘗試獲取A對象的實例的時候,會走第一個getSingleton()方法,在該方法中會得到一個半成品的A對象的實例。然后將該實例返回,并且將其注入到B對象的屬性a中,此時B對象實例化完成。然后將實例化完成的B對象遞歸的返回,此時就會將該實例注入到A對象中,這樣就得到了一個成品的A對象。我們這里可以閱讀上面的第一個getSingleton()方法: 

  1. @Nullable  
  2. protected Object getSingleton(String beanName, boolean allowEarlyReference) {  
  3.   // 嘗試從緩存中獲取成品的目標對象,如果存在,則直接返回  
  4.   Object singletonObject = this.singletonObjects.get(beanName);  
  5.   // 如果緩存中不存在目標對象,則判斷當前對象是否已經處于創建過程中,在前面的講解中,第一次嘗試獲取A對象  
  6.   // 的實例之后,就會將A對象標記為正在創建中,因而最后再嘗試獲取A對象的時候,這里的if判斷就會為true  
  7.   if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {  
  8.     synchronized (this.singletonObjects) {  
  9.       singletonObject = this.earlySingletonObjects.get(beanName);  
  10.       if (singletonObject == null && allowEarlyReference) { 
  11.          // 這里的singletonFactories是一個Map,其key是bean的名稱,而值是一個ObjectFactory類型的  
  12.         // 對象,這里對于A和B而言,調用圖其getObject()方法返回的就是A和B對象的實例,無論是否是半成品  
  13.         ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);  
  14.         if (singletonFactory != null) {  
  15.           // 獲取目標對象的實例  
  16.           singletonObject = singletonFactory.getObject();  
  17.           this.earlySingletonObjects.put(beanName, singletonObject);  
  18.           this.singletonFactories.remove(beanName);  
  19.         }  
  20.       }  
  21.     }  
  22.   }  
  23.   return singletonObject;  

這里我們會存在一個問題就是A的半成品實例是如何實例化的,然后是如何將其封裝為一個ObjectFactory類型的對象,并且將其放到上面的singletonFactories屬性中的。這主要是在前面的第二個getSingleton()方法中,其最終會通過其傳入的第二個參數,從而調用createBean()方法,該方法的最終調用是委托給了另一個doCreateBean()方法進行的,這里面有如下一段代碼: 

  1. protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)  
  2.   throws BeanCreationException {  
  3.   // 實例化當前嘗試獲取的bean對象,比如A對象和B對象都是在這里實例化的  
  4.   BeanWrapper instanceWrapper = null 
  5.   if (mbd.isSingleton()) {  
  6.     instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);  
  7.   }  
  8.   if (instanceWrapper == null) {  
  9.     instanceWrapper = createBeanInstance(beanName, mbd, args);  
  10.   }  
  11.   // 判斷Spring是否配置了支持提前暴露目標bean,也就是是否支持提前暴露半成品的bean  
  12.   boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences   
  13.     && isSingletonCurrentlyInCreation(beanName));  
  14.   if (earlySingletonExposure) {  
  15.     // 如果支持,這里就會將當前生成的半成品的bean放到singletonFactories中,這個singletonFactories  
  16.     // 就是前面第一個getSingleton()方法中所使用到的singletonFactories屬性,也就是說,這里就是  
  17.     // 封裝半成品的bean的地方。而這里的getEarlyBeanReference()本質上是直接將放入的第三個參數,也就是  
  18.     // 目標bean直接返回  
  19.     addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));  
  20.   }  
  21.   try {  
  22.     // 在初始化實例之后,這里就是判斷當前bean是否依賴了其他的bean,如果依賴了,  
  23.     // 就會遞歸的調用getBean()方法嘗試獲取目標bean  
  24.     populateBean(beanName, mbd, instanceWrapper);  
  25.   } catch (Throwable ex) {  
  26.     // 省略...  
  27.   }  
  28.   return exposedObject;  

到這里,Spring整個解決循環依賴問題的實現思路已經比較清楚了。對于整體過程,讀者朋友只要理解兩點:

  •  Spring是通過遞歸的方式獲取目標bean及其所依賴的bean的;
  •  Spring實例化一個bean的時候,是分兩步進行的,首先實例化目標bean,然后為其注入屬性。

結合這兩點,也就是說,Spring在實例化一個bean的時候,是首先遞歸的實例化其所依賴的所有bean,直到某個bean沒有依賴其他bean,此時就會將該實例返回,然后反遞歸的將獲取到的bean設置為各個上層bean的屬性的。

3. 小結

本文首先通過圖文的方式對Spring是如何解決循環依賴的問題進行了講解,然后從源碼的角度詳細講解了Spring是如何實現各個bean的裝配工作的。 

 

責任編輯:龐桂玉 來源: 中國開源
相關推薦

2023-11-28 08:00:00

SpringJava

2020-12-29 08:34:08

spring循環依賴開發

2023-10-07 08:40:57

緩存屬性Spring

2022-08-17 07:52:31

Spring循環依賴單例池

2020-06-22 08:07:48

Spring依賴場景

2020-11-27 06:28:55

Spring循環依賴

2023-05-04 08:06:27

Spring循環依賴

2023-10-11 12:35:29

Maven

2023-08-09 10:43:21

源碼循環依賴getBean

2020-02-10 15:50:18

Spring循環依賴Java

2010-03-11 14:15:24

Python循環

2023-12-12 17:44:13

三級緩存Bean

2012-09-05 11:09:15

SELinux操作系統

2021-01-29 14:14:47

動態代理緩存

2017-10-17 09:21:06

2015-07-14 10:54:50

PHP數據循環內存耗盡

2021-04-01 08:05:01

React無限循環useEffect()

2024-04-12 07:51:05

SpringBean初始化

2010-04-29 17:46:31

Oracle死鎖

2022-01-04 11:15:02

Spring Boot任務阻塞
點贊
收藏

51CTO技術棧公眾號

成人精品视频在线| 国产香蕉精品视频一区二区三区 | 免费不卡欧美自拍视频| 美女又黄又免费的视频| 色图在线观看| 2021久久国产精品不只是精品| 国产成人精品一区二区| 日本精品人妻无码77777| 美国成人xxx| 欧美日韩综合在线免费观看| 九九久久九九久久| 国产视频精品久久| 成人激情小说网站| 国产欧美日韩视频| 久久久久久久久久久久久久av| 欧美军人男男激情gay| 日韩一区二区三区电影| 韩国日本在线视频| 亚洲丝袜一区| 国产三级欧美三级日产三级99 | 伊人成人在线观看| 亚洲精品社区| 美女黄色丝袜一区| 久久久久亚洲av无码a片| 亚洲不卡在线| 欧美日韩成人在线一区| 777久久久精品一区二区三区 | 国产清纯美女被跳蛋高潮一区二区久久w| 91免费在线视频网站| 国产一级18片视频| 国产精品va| 日韩亚洲精品电影| aaaaa级少妇高潮大片免费看| www一区二区三区| 在线国产亚洲欧美| 无码专区aaaaaa免费视频| 欧美成人视屏| 日本一区免费视频| 蜜桃麻豆91| 男人天堂综合网| 韩国三级中文字幕hd久久精品| 欧美综合国产精品久久丁香| 久久午夜无码鲁丝片| 五月天久久久| 菠萝蜜影院一区二区免费| 91视频在线网站| 美女扒开腿让男人桶爽久久动漫| 日韩区在线观看| 香蕉视频xxxx| 九色精品蝌蚪| 欧美一区二区三区视频免费播放 | 日本综合字幕| 日韩欧美aaa| 国产精品自拍片| 9999在线视频| 亚洲不卡一区二区三区| 国产精品视频二| 亚洲wwwww| 亚洲精品一二三| 无码毛片aaa在线| caopo在线| 一区二区久久久久| 日韩xxxx视频| 午夜欧美激情| 欧日韩精品视频| www.色偷偷.com| 国产原创一区| 日韩一区二区在线观看视频| 婷婷激情小说网| 中文字幕亚洲在线观看| 精品卡一卡二卡三卡四在线| 星空大象在线观看免费播放| 欧美深夜视频| 亚洲香蕉在线观看| 黄色精品视频在线观看| 欧美在线免费| 97精品久久久| 波多野结衣绝顶大高潮| 蜜臀91精品一区二区三区 | 91在线云播放| 日韩av电影在线观看| 95在线视频| 亚洲欧美日韩国产综合在线| 国产人妻人伦精品| 国产免费拔擦拔擦8x高清在线人| 欧美性高潮床叫视频| 国产一区二区在线免费播放| 久久久国产精品入口麻豆| 精品国产99国产精品| 国产免费看av| 亚洲色图网站| 欧美亚洲第一区| 中文字幕av久久爽| 国产69精品久久久久毛片 | 成人三级视频| 欧美成人四级hd版| 国产精品视频免费播放| 久久福利资源站| 国产精品99久久久久久久| 欧美视频综合| 亚洲另类一区二区| 不卡影院一区二区| 欧美h版在线观看| 亚洲视频在线免费观看| 国产十六处破外女视频| 蜜乳av另类精品一区二区| 国产日韩欧美另类| 日韩电影免费| 亚洲精品久久久蜜桃| 韩国日本在线视频| 136国产福利精品导航网址应用| 亚洲免费精彩视频| 欧美精品99久久久| 久久精品国内一区二区三区| 国产精品香蕉视屏| 精品视频在线一区二区| 色婷婷精品大视频在线蜜桃视频| 午夜诱惑痒痒网| 国内精品久久久久久99蜜桃| 欧美激情精品久久久久久免费印度| 免费一级a毛片| www..com久久爱| 先锋影音男人资源| 国产一区二区色噜噜| 国产视频久久久| 久久免费视频6| 国产自产2019最新不卡| 欧美尤物一区| 在线观看爽视频| 亚洲电影中文字幕| 午夜69成人做爰视频| 久久福利视频一区二区| 日韩精品欧美专区| 91av亚洲| 日韩电影第一页| 国产大片aaa| 国产精品自在在线| 婷婷视频在线播放| 亚洲国产天堂| 日韩一区二区av| 中文字幕 日韩有码| 国产欧美一区二区在线| 久热免费在线观看| 日韩激情网站| 91精品国产色综合| 欧美在线精品一区二区三区| 一区二区三区免费在线观看| 中文字幕资源在线观看| 四季av一区二区三区免费观看| 日韩女在线观看| 福利在线午夜| 欧美三级电影在线观看| 五月天免费网站| 久草这里只有精品视频| 中文字幕制服丝袜在线| 日日夜夜一区| 欧美成人第一页| www.国产视频| 午夜精品免费在线观看| 无码精品一区二区三区在线播放| 在线看片成人| 久久综合伊人77777麻豆| 最新日韩精品| 中文字幕精品视频| 91亚洲国产成人精品一区| 最新不卡av在线| 青娱乐国产精品视频| 欧美片第1页综合| 国内精品久久久久久久果冻传媒| 99色在线观看| 欧美成人高清电影在线| 五月天综合在线| 国产午夜久久久久| 三级黄色片免费观看| 欧美另类亚洲| 麻豆蜜桃91| 国产成人亚洲一区二区三区| 久久久999成人| 亚洲精品一区二区三区蜜桃| 精品成人av一区| 九九热免费在线| 国产一区二区三区免费看| 日韩精品久久一区二区| 日韩av三区| 国产欧美在线视频| 成人影音在线| 亚洲一品av免费观看| 91影院在线播放| 午夜久久久久久| 国产美女免费网站| 国产一区二区免费在线| 亚洲美免无码中文字幕在线 | 韩国欧美国产1区| 91好吊色国产欧美日韩在线| 欧美一区二区三区激情视频| 亚洲一区二区日本| 97se综合| 欧美日韩福利视频| 黄色av免费在线观看| 欧美一区二区人人喊爽| 国产婷婷色一区二区在线观看| 国产精品乱码人人做人人爱| 逼特逼视频在线观看| 日韩不卡一区二区三区| av动漫在线播放| 精品久久网站| 国产伦理一区二区三区| 国产精品第一| 欧洲日本亚洲国产区| 成人免费网址| 中国人与牲禽动交精品| 欧美一级特黄aaaaaa大片在线观看| 欧美这里有精品| 国产一区二区三区影院| 亚洲欧洲美洲综合色网| 免费在线观看你懂的| 国产成人欧美日韩在线电影| 欧美精品成人网| 亚洲精品麻豆| 天天想你在线观看完整版电影免费| 国产精品密蕾丝视频下载| 成人久久18免费网站漫画| 精品福利在线| 国产成人亚洲精品| 美女扒开腿让男人桶爽久久软| 久久亚洲精品成人| 91精品专区| 亚洲视频axxx| 天堂中文在线资| 精品成a人在线观看| 国产深喉视频一区二区| 欧美色中文字幕| 日韩中文字幕高清| 一本色道a无线码一区v| 免费日韩一级片| 午夜伊人狠狠久久| 国产一级久久久| 亚洲一区二区三区国产| 欧美成人精品欧美一| ㊣最新国产の精品bt伙计久久| 91视频免费在观看| 国产日本欧洲亚洲| 无码人妻丰满熟妇啪啪欧美| 久久五月婷婷丁香社区| 成人网站免费观看| 91丝袜高跟美女视频| 一级特级黄色片| 99久久久久久| 欧美成人三级伦在线观看| 不卡一卡二卡三乱码免费网站| 免费观看一区二区三区| 懂色av一区二区三区免费看| 国产老头和老头xxxx×| 国产.精品.日韩.另类.中文.在线.播放 | 91欧美激情另类亚洲| av在线播放一区二区| 91精品久久久久久综合乱菊| 亚洲成人毛片| 91系列在线观看| 日韩欧美中文字幕在线视频| 91天堂在线观看| 51vv免费精品视频一区二区| 国产厕所精品在线观看| 麻豆精品少妇| 日韩福利二区| 91久久国产| www.射射射| 性8sex亚洲区入口| 亚洲精品高清无码视频| 麻豆精品在线播放| 国产91在线免费观看| 国产98色在线|日韩| 插我舔内射18免费视频| 久久综合色一综合色88| 永久免费av无码网站性色av| 中文字幕在线观看一区二区| 91在线播放观看| 亚洲成av人片在线观看无码| 国产精品21p| 欧美浪妇xxxx高跟鞋交| 亚洲精品久久久久久久久久久久久久| 日韩av中文在线| 在线观看av的网站| 米奇精品一区二区三区在线观看| av在线私库| 国产精品日韩av| 麻豆精品国产| 欧美精品一区二区三区在线四季| 色135综合网| 欧美午夜性视频| 蜜臀国产一区二区三区在线播放| 国产男女无遮挡猛进猛出| 91在线观看污| 精品人妻伦九区久久aaa片| 亚洲大尺度视频在线观看| www.av88| 欧美精品一区二区三| sese一区| 亚洲91精品在线观看| 成人国产在线| 国产精品免费在线| 欧美性感美女一区二区| 强伦女教师2:伦理在线观看| 国产欧美综合一区二区三区| 拔插拔插华人永久免费| heyzo一本久久综合| 成人黄色短视频| 欧美日韩中文字幕| 午夜精品久久久久久久99热黄桃 | 91视频8mav| 教室别恋欧美无删减版| 人人妻人人澡人人爽欧美一区双| 久热精品在线| 熟妇高潮一区二区| 亚洲视频在线一区观看| 最近免费中文字幕大全免费版视频| 欧美一区二区三区啪啪| 精品成人一区二区三区免费视频| 欧美国产日韩一区二区在线观看 | 99久久综合狠狠综合久久止| 国产伦精品一区二区三区千人斩 | 老司机一区二区三区| 国产在线a视频| 中文字幕中文在线不卡住| 免费黄色小视频在线观看| 日韩成人久久久| 国产盗摄一区二区| 91视频免费在线观看| 久久一区二区三区电影| 国产成人av影视| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | 久久久久久久久免费| 激情综合网五月婷婷| 日韩欧美国产一二三区| 成码无人av片在线观看网站| 国产精品永久免费在线| 精品日韩在线| www日韩在线观看| 久久一二三国产| 毛片基地在线观看| 亚洲精品久久久久| 韩日毛片在线观看| 国产亚洲精品久久飘花| 尤物网精品视频| 久久久精品人妻一区二区三区| 1区2区3区精品视频| 91 中文字幕| 久久视频在线播放| vam成人资源在线观看| www.午夜色| 国产乱子轮精品视频| 可以直接看的黄色网址| 日韩一卡二卡三卡| 深夜国产在线播放| 国产精品v欧美精品∨日韩| 狠狠爱成人网| 国产一级黄色录像| 天天影视网天天综合色在线播放 | 亚洲网站视频福利| 日韩毛片在线| 最近看过的日韩成人| 国产精品一二三区| 久久精品国产亚洲av高清色欲| 精品剧情v国产在线观看在线| 国产在线88av| 欧美日韩精品综合| 美女视频黄 久久| 91高清免费观看| 精品va天堂亚洲国产| av资源亚洲| 在线观看亚洲视频啊啊啊啊| 国产专区综合网| 亚洲天堂日韩av| 中文字幕不卡av| 欧美特黄不卡| 国产精品无码av在线播放| 国产亚洲综合性久久久影院| 中文字幕欧美色图| 欧美成人免费大片| 色婷婷狠狠五月综合天色拍 | 日韩极品精品视频免费观看| 日韩性xxx| 咪咪色在线视频| 99热精品国产| 在线观看xxxx| 久久久久中文字幕| 欧美精品久久久久久| 性生交大片免费看l| 日本道免费精品一区二区三区| 午夜在线播放| 国产精品swag| 麻豆国产精品777777在线| 精品一区在线视频| 亚洲色图15p| 香蕉成人app| 久久精品免费网站| 亚洲综合清纯丝袜自拍| 成人18在线| 国产精品一区二区欧美| 蜜臀久久99精品久久久久宅男 |