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

spring:我是如何解決循環依賴的?

開發 前端
最近項目組的一個同事遇到了一個問題,問我的意見,一下子引起的我的興趣,因為這個問題我也是第一次遇到。平時自認為對spring循環依賴問題還是比較了解的,直到遇到這個和后面的幾個問題后,重新刷新了我的認識。

[[360769]]

1.由同事拋的一個問題開始

最近項目組的一個同事遇到了一個問題,問我的意見,一下子引起的我的興趣,因為這個問題我也是第一次遇到。平時自認為對spring循環依賴問題還是比較了解的,直到遇到這個和后面的幾個問題后,重新刷新了我的認識。

我們先看看當時出問題的代碼片段:

  1. @Service 
  2. public class TestService1 { 
  3.  
  4.     @Autowired 
  5.     private TestService2 testService2; 
  6.  
  7.     @Async 
  8.     public void test1() { 
  9.     } 

  1. @Service 
  2. public class TestService2 { 
  3.  
  4.     @Autowired 
  5.     private TestService1 testService1; 
  6.  
  7.     public void test2() { 
  8.     } 

這兩段代碼中定義了兩個Service類:TestService1和TestService2,在TestService1中注入了TestService2的實例,同時在TestService2中注入了TestService1的實例,這里構成了循環依賴。

只不過,這不是普通的循環依賴,因為TestService1的test1方法上加了一個@Async注解。

大家猜猜程序啟動后運行結果會怎樣?

  1. org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'testService1': Bean with name 'testService1' has been injected into other beans [testService2] in its raw version as part of a circular reference, but has eventually been wrapped. This means that said other beans do not use the final version of the bean. This is often the result of over-eager type matching - consider using 'getBeanNamesOfType' with the 'allowEagerInit' flag turned offfor example. 

報錯了。。。原因是出現了循環依賴。

「不科學呀,spring不是號稱能解決循環依賴問題嗎,怎么還會出現?」

如果把上面的代碼稍微調整一下:

  1. @Service 
  2. public class TestService1 { 
  3.  
  4.     @Autowired 
  5.     private TestService2 testService2; 
  6.  
  7.     public void test1() { 
  8.     } 

把TestService1的test1方法上的@Async注解去掉,TestService1和TestService2都需要注入對方的實例,同樣構成了循環依賴。

但是重新啟動項目,發現它能夠正常運行。這又是為什么?

帶著這兩個問題,讓我們一起開始spring循環依賴的探秘之旅。

2.什么是循環依賴?

循環依賴:說白是一個或多個對象實例之間存在直接或間接的依賴關系,這種依賴關系構成了構成一個環形調用。

第一種情況:自己依賴自己的直接依賴


第二種情況:兩個對象之間的直接依賴


第三種情況:多個對象之間的間接依賴


前面兩種情況的直接循環依賴比較直觀,非常好識別,但是第三種間接循環依賴的情況有時候因為業務代碼調用層級很深,不容易識別出來。

3.循環依賴的N種場景

spring中出現循環依賴主要有以下場景:


單例的setter注入

這種注入方式應該是spring用的最多的,代碼如下:

  1. @Service 
  2. public class TestService1 { 
  3.  
  4.     @Autowired 
  5.     private TestService2 testService2; 
  6.  
  7.     public void test1() { 
  8.     } 

  1. @Service 
  2. public class TestService2 { 
  3.  
  4.     @Autowired 
  5.     private TestService1 testService1; 
  6.  
  7.     public void test2() { 
  8.     } 

這是一個經典的循環依賴,但是它能正常運行,得益于spring的內部機制,讓我們根本無法感知它有問題,因為spring默默幫我們解決了。

spring內部有三級緩存:

  • singletonObjects 一級緩存,用于保存實例化、注入、初始化完成的bean實例
  • earlySingletonObjects 二級緩存,用于保存實例化完成的bean實例
  • singletonFactories 三級緩存,用于保存bean創建工廠,以便于后面擴展有機會創建代理對象。

下面用一張圖告訴你,spring是如何解決循環依賴的: 


圖1

細心的朋友可能會發現在這種場景中第二級緩存作用不大。

那么問題來了,為什么要用第二級緩存呢?

試想一下,如果出現以下這種情況,我們要如何處理?

  1. @Service 
  2. public class TestService1 { 
  3.  
  4.     @Autowired 
  5.     private TestService2 testService2; 
  6.     @Autowired 
  7.     private TestService3 testService3; 
  8.  
  9.     public void test1() { 
  10.     } 

  1. @Service 
  2. public class TestService2 { 
  3.  
  4.     @Autowired 
  5.     private TestService1 testService1; 
  6.  
  7.     public void test2() { 
  8.     } 

  1. @Service 
  2. public class TestService3 { 
  3.  
  4.     @Autowired 
  5.     private TestService1 testService1; 
  6.  
  7.     public void test3() { 
  8.     } 

TestService1依賴于TestService2和TestService3,而TestService2依賴于TestService1,同時TestService3也依賴于TestService1。

按照上圖的流程可以把TestService1注入到TestService2,并且TestService1的實例是從第三級緩存中獲取的。

假設不用第二級緩存,TestService1注入到TestService3的流程如圖:


圖2

TestService1注入到TestService3又需要從第三級緩存中獲取實例,而第三級緩存里保存的并非真正的實例對象,而是ObjectFactory對象。說白了,兩次從三級緩存中獲取都是ObjectFactory對象,而通過它創建的實例對象每次可能都不一樣的。

這樣不是有問題?

為了解決這個問題,spring引入的第二級緩存。上面圖1其實TestService1對象的實例已經被添加到第二級緩存中了,而在TestService1注入到TestService3時,只用從第二級緩存中獲取該對象即可。


圖3

還有個問題,第三級緩存中為什么要添加ObjectFactory對象,直接保存實例對象不行嗎?

答:不行,因為假如你想對添加到三級緩存中的實例對象進行增強,直接用實例對象是行不通的。

針對這種場景spring是怎么做的呢?

答案就在AbstractAutowireCapableBeanFactory類doCreateBean方法的這段代碼中:

它定義了一個匿名內部類,通過getEarlyBeanReference方法獲取代理對象,其實底層是通過AbstractAutoProxyCreator類的getEarlyBeanReference生成代理對象。

多例的setter注入

這種注入方法偶然會有,特別是在多線程的場景下,具體代碼如下:

  1. @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) 
  2. @Service 
  3. public class TestService1 { 
  4.  
  5.     @Autowired 
  6.     private TestService2 testService2; 
  7.  
  8.     public void test1() { 
  9.     } 

  1. @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) 
  2. @Service 
  3. public class TestService2 { 
  4.  
  5.     @Autowired 
  6.     private TestService1 testService1; 
  7.  
  8.     public void test2() { 
  9.     } 

很多人說這種情況spring容器啟動會報錯,其實是不對的,我非常負責任的告訴你程序能夠正常啟動。

為什么呢?

其實在AbstractApplicationContext類的refresh方法中告訴了我們答案,它會調用finishBeanFactoryInitialization方法,該方法的作用是為了spring容器啟動的時候提前初始化一些bean。該方法的內部又調用了preInstantiateSingletons方法 

標紅的地方明顯能夠看出:非抽象、單例 并且非懶加載的類才能被提前初始bean。

而多例即SCOPE_PROTOTYPE類型的類,非單例,不會被提前初始化bean,所以程序能夠正常啟動。

如何讓他提前初始化bean呢?

只需要再定義一個單例的類,在它里面注入TestService1

  1. @Service 
  2. public class TestService3 { 
  3.  
  4.     @Autowired 
  5.     private TestService1 testService1; 

重新啟動程序,執行結果:

  1. Requested bean is currently in creation: Is there an unresolvable circular reference? 

果然出現了循環依賴。

注意:這種循環依賴問題是無法解決的,因為它沒有用緩存,每次都會生成一個新對象。

構造器注入

這種注入方式現在其實用的已經非常少了,但是我們還是有必要了解一下,看看如下代碼:

  1. @Service 
  2. public class TestService1 { 
  3.  
  4.     public TestService1(TestService2 testService2) { 
  5.     } 

  1. @Service 
  2. public class TestService2 { 
  3.  
  4.     public TestService2(TestService1 testService1) { 
  5.     } 

運行結果:

  1. Requested bean is currently in creation: Is there an unresolvable circular reference? 

出現了循環依賴,為什么呢?


從圖中的流程看出構造器注入只是添加了三級緩存,并沒有使用緩存,所以也無法解決循環依賴問題。

單例的代理對象setter注入

這種注入方式其實也比較常用,比如平時使用:@Async注解的場景,會通過AOP自動生成代理對象。

我那位同事的問題也是這種情況。

  1. @Service 
  2. public class TestService1 { 
  3.  
  4.     @Autowired 
  5.     private TestService2 testService2; 
  6.  
  7.     @Async 
  8.     public void test1() { 
  9.     } 

  1. @Service 
  2. public class TestService2 { 
  3.  
  4.     @Autowired 
  5.     private TestService1 testService1; 
  6.  
  7.     public void test2() { 
  8.     } 

從前面得知程序啟動會報錯,出現了循環依賴:

  1. org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'testService1': Bean with name 'testService1' has been injected into other beans [testService2] in its raw version as part of a circular reference, but has eventually been wrapped. This means that said other beans do not use the final version of the bean. This is often the result of over-eager type matching - consider using 'getBeanNamesOfType' with the 'allowEagerInit' flag turned offfor example. 

為什么會循環依賴呢?

答案就在下面這張圖中:


說白了,bean初始化完成之后,后面還有一步去檢查:第二級緩存 和 原始對象 是否相等。由于它對前面流程來說無關緊要,所以前面的流程圖中省略了,但是在這里是關鍵點,我們重點說說:


那位同事的問題正好是走到這段代碼,發現第二級緩存 和 原始對象不相等,所以拋出了循環依賴的異常。

如果這時候把TestService1改個名字,改成:TestService6,其他的都不變。

  1. @Service 
  2. publicclass TestService6 { 
  3.  
  4.     @Autowired 
  5.     private TestService2 testService2; 
  6.  
  7.     @Async 
  8.     public void test1() { 
  9.     } 

再重新啟動一下程序,神奇般的好了。

what? 這又是為什么?

這就要從spring的bean加載順序說起了,默認情況下,spring是按照文件完整路徑遞歸查找的,按路徑+文件名排序,排在前面的先加載。所以TestService1比TestService2先加載,而改了文件名稱之后,TestService2比TestService6先加載。

為什么TestService2比TestService6先加載就沒問題呢?

答案在下面這張圖中:


這種情況testService6中其實第二級緩存是空的,不需要跟原始對象判斷,所以不會拋出循環依賴。

DependsOn循環依賴

還有一種有些特殊的場景,比如我們需要在實例化Bean A之前,先實例化Bean B,這個時候就可以使用@DependsOn注解。

  1. @DependsOn(value = "testService2"
  2. @Service 
  3. public class TestService1 { 
  4.  
  5.     @Autowired 
  6.     private TestService2 testService2; 
  7.  
  8.     public void test1() { 
  9.     } 

  1. @DependsOn(value = "testService1"
  2. @Service 
  3. public class TestService2 { 
  4.  
  5.     @Autowired 
  6.     private TestService1 testService1; 
  7.  
  8.     public void test2() { 
  9.     } 

程序啟動之后,執行結果:

  1. Circular depends-on relationship between 'testService2' and 'testService1' 

這個例子中本來如果TestService1和TestService2都沒有加@DependsOn注解是沒問題的,反而加了這個注解會出現循環依賴問題。

這又是為什么?

答案在AbstractBeanFactory類的doGetBean方法的這段代碼中:

它會檢查dependsOn的實例有沒有循環依賴,如果有循環依賴則拋異常。

4.出現循環依賴如何解決?

項目中如果出現循環依賴問題,說明是spring默認無法解決的循環依賴,要看項目的打印日志,屬于哪種循環依賴。目前包含下面幾種情況:


生成代理對象產生的循環依賴

這類循環依賴問題解決方法很多,主要有:

  1. 使用@Lazy注解,延遲加載
  2. 使用@DependsOn注解,指定加載先后關系
  3. 修改文件名稱,改變循環依賴類的加載順序

使用@DependsOn產生的循環依賴

這類循環依賴問題要找到@DependsOn注解循環依賴的地方,迫使它不循環依賴就可以解決問題。

多例循環依賴

這類循環依賴問題可以通過把bean改成單例的解決。

構造器循環依賴

這類循環依賴問題可以通過使用@Lazy注解解決。

 

責任編輯:姜華 來源: 蘇三說技術
相關推薦

2019-11-26 14:30:20

Spring循環依賴Java

2023-11-28 08:00:00

SpringJava

2023-10-07 08:40:57

緩存屬性Spring

2022-08-17 07:52:31

Spring循環依賴單例池

2023-08-09 10:43:21

源碼循環依賴getBean

2020-06-22 08:07:48

Spring依賴場景

2020-11-27 06:28:55

Spring循環依賴

2021-01-29 14:14:47

動態代理緩存

2021-09-01 11:45:10

Spring循環依賴面試

2023-10-11 12:35:29

Maven

2020-02-10 15:50:18

Spring循環依賴Java

2010-03-11 14:15:24

Python循環

2023-12-12 17:44:13

三級緩存Bean

2021-04-01 08:05:01

React無限循環useEffect()

2020-03-12 15:00:44

JavaSpring依賴

2024-04-12 07:51:05

SpringBean初始化

2023-05-09 07:51:28

Spring循環依賴

2023-05-04 08:06:27

Spring循環依賴

2021-01-30 19:35:44

HDFS單點Hadoop

2020-08-06 00:14:16

Spring IoC依賴注入開發
點贊
收藏

51CTO技術棧公眾號

欧美特黄视频| 精品中文字幕一区二区三区| 国产亚洲精品中文字幕| 国产精品国产福利国产秒拍| 性欧美videos| 欧美电影在线观看完整版| 一本到不卡精品视频在线观看| 日韩av一区二区三区美女毛片| 一区二区三区亚洲视频| 最新亚洲激情| 精品国产视频在线| 北岛玲一区二区| 伊人久久综合网另类网站| 亚洲福利国产精品| 亚洲永久激情精品| 亚洲第一页视频| 免费高清在线视频一区·| 欧美日韩国产二区| 男女男精品视频网站| 99久久香蕉| 欧美手机在线视频| av在线播放亚洲| 97超碰资源站在线观看| xnxx国产精品| 91超碰在线免费观看| 亚洲 欧美 日韩 在线| 欧美日本一区| 最好看的2019年中文视频| 日本一区二区在线免费观看| 免费看一区二区三区| 91福利国产精品| 男人添女人下部高潮视频在观看| 国产原创精品视频| 中文字幕精品—区二区四季| 精品无人区一区二区三区竹菊 | 91精品电影| 亚洲欧美日韩中文在线制服| 亚洲成人av免费观看| 国产精品99久久久久久董美香| 午夜精品久久久久| 800av在线免费观看| 超碰最新在线| 国产精品久久综合| 亚洲精品人成| av在线中文| 国产亚洲精品资源在线26u| 九九99久久| 蜜桃av噜噜一区二区三区麻豆| 精品中文字幕一区二区| 国产精品麻豆va在线播放| 中文字幕精品三级久久久| 激情自拍一区| 97精品欧美一区二区三区| 日本一级黄色大片| 亚洲高清激情| 国内精品中文字幕| 日本中文字幕免费| 欧美亚洲精品在线| 亚洲男人av在线| 法国伦理少妇愉情| 蜜桃视频欧美| 伊人精品在线观看| 日韩欧美在线视频播放| 91一区二区三区四区| 久久精品电影网站| 人妻少妇精品一区二区三区| 欧美一区二区| 97婷婷大伊香蕉精品视频| 日本五十路女优| 久久成人亚洲| 国产精品亚洲精品| 亚洲av无码国产精品久久不卡 | h视频在线免费| 欧美极品另类videosde| 亚洲一区二区三区精品在线观看| 高清毛片在线看| 国产欧美日韩在线视频| 樱花www成人免费视频| 在线观看操人| 午夜欧美2019年伦理| 国产成人亚洲精品无码h在线| 欧美韩国亚洲| 欧美另类变人与禽xxxxx| 杨幂一区二区国产精品| 精品三级在线观看视频| 亚洲午夜小视频| 91九色丨porny丨极品女神| 激情成人亚洲| 国产精品99一区| 国产免费福利视频| 91浏览器在线视频| 在线成人性视频| 国产探花在线观看| 欧美丝袜第三区| 久久久无码人妻精品无码| 最新亚洲精品| 欧美成在线观看| 久久青青草原亚洲av无码麻豆| 裸体一区二区三区| 狠狠色综合欧美激情| 在线视频婷婷| 精品久久久一区| √天堂资源在线| 免费短视频成人日韩| 成人av在线一区二区| 本田岬高潮一区二区三区| 成人免费视频网| 天天综合在线视频| 综合在线观看色| 欧美国产亚洲一区| 国产视频一区二| 亚洲欧美一区二区精品久久久| 欧美在线视频第一页| 久久福利影视| 国产日韩亚洲精品| 免费大片黄在线观看视频网站| 午夜精品久久久久| av在线网站免费观看| 中国av一区| 高清亚洲成在人网站天堂| 国产精品爽爽久久久久久| 97久久精品人人做人人爽| 手机看片日韩国产| 精品网站在线| 日韩精品在线免费观看| 久久综合成人网| 精品中文字幕一区二区| 婷婷精品国产一区二区三区日韩 | 久久电影在线| 久久夜色撩人精品| 一区二区视频免费| 久久久久久久久岛国免费| 久久视频这里有精品| 国产精品3区| 久久九九精品99国产精品| 波多野结衣家庭主妇| 26uuu国产一区二区三区| 无码粉嫩虎白一线天在线观看 | 国产精品久久久久免费| 日本暖暖在线视频| 欧美在线不卡视频| 国产三级在线观看完整版| 美女久久网站| 欧美激情www| 久久sese| 亚洲视频电影图片偷拍一区| 免费看日批视频| 久久久综合激的五月天| 欧洲av无码放荡人妇网站| 丝袜美腿一区二区三区动态图| 久久人91精品久久久久久不卡| 亚洲AV无码精品色毛片浪潮| 亚洲精品国产无天堂网2021| 日韩不卡的av| 极品av少妇一区二区| 国产欧美一区二区在线播放| 91超碰在线| 精品一区二区电影| 超碰在线观看91| 国产精品人人做人人爽人人添| 欧美亚洲日本在线观看| 欧美一二区在线观看| 国产欧美中文字幕| 18网站在线观看| 亚洲成色777777女色窝| 久久国产黄色片| 久久精品视频一区二区| 九九热在线免费| 午夜片欧美伦| 岛国一区二区三区高清视频| 人人草在线视频| 在线观看欧美www| 国产巨乳在线观看| 亚洲一区在线播放| 国产福利在线观看视频| 日韩中文字幕一区二区三区| 影音先锋欧美资源| 亚洲综合网站| 奇门遁甲1982国语版免费观看高清 | 狠狠色综合日日| 和岳每晚弄的高潮嗷嗷叫视频| 免费看日本一区二区| 成人在线观看视频网站| 丁香花高清在线观看完整版| 亚洲欧美日韩爽爽影院| 国产尤物视频在线观看| 一区二区视频在线| 少妇按摩一区二区三区| 激情综合色播五月| 国产91在线免费| 性xxxx欧美老肥妇牲乱| 国产精品一区二区三区观看| 天天综合网站| 欧美激情奇米色| 国内三级在线观看| 日韩精品在线看片z| 日本视频网站在线观看| 亚洲柠檬福利资源导航| 日韩精品卡通动漫网站| 国产一区二区电影| 成人精品视频一区二区| 欧美日韩国产成人精品| 亚洲国产欧美一区二区三区不卡| 99re热精品视频| 国产美女直播视频一区| 国模私拍一区二区国模曼安| 久久精品国产91精品亚洲| 免费在线黄色网址| 精品伦理精品一区| 91 中文字幕| 欧美在线观看视频一区二区三区| 国产大片中文字幕| 亚洲欧洲精品一区二区三区不卡| 无套内谢大学处破女www小说| 韩国一区二区三区| 无码少妇一区二区三区芒果| 亚洲婷婷在线| av中文字幕av| 天天综合久久| 亚洲午夜精品久久久久久浪潮| 欧美性生活一级片| 97超级碰碰| 不卡的国产精品| 国产精品美女午夜av| 欧美黑人粗大| 9.1国产丝袜在线观看| 日本精品600av| 免费成人高清视频| 国产黄色在线免费观看| 日韩中文在线中文网三级| 国产福利在线看| 亚洲欧美精品在线| 性xxxxbbbb| 亚洲国产小视频| 蜜桃视频污在线观看| 精品国产在天天线2019| 99久久精品无免国产免费 | 九九精品在线观看| 黄网站在线播放| 久久亚洲一区二区三区四区五区高 | 国产精品高清一区二区| 成人春色激情网| 57pao成人永久免费| 成人欧美在线视频| 伊人久久大香| 91久久国产综合久久蜜月精品| 精品999日本久久久影院| 成人h视频在线观看播放| av在线成人| 97人人香蕉| 鲁大师精品99久久久| 久久久久久99| 欧美精选一区二区三区| 亚洲高清在线观看一区| 999成人精品视频线3| 国产精品亚洲天堂| 欧美一区久久| 亚洲国产精品成人天堂| 一区二区精品| 狠狠热免费视频| 精品伊人久久久久7777人| 加勒比av中文字幕| 国产成人高清在线| 亚洲熟女乱综合一区二区三区| 久久夜色精品国产欧美乱极品| 亚洲一级中文字幕| 国产精品久久久久久久蜜臀| av资源在线免费观看| 亚洲专区一二三| 国产成人免费观看视频| 91福利在线看| 999免费视频| 亚洲精品成人久久久| 大片免费播放在线视频| 久久精品视频网站| 先锋影音在线资源站91| 欧美夜福利tv在线| 欧美一级网址| 国产精品免费一区二区| 国内成人自拍| 青青在线免费视频| 性欧美videos另类喷潮| 久热在线视频观看| 99久久国产综合色|国产精品| 亚洲午夜精品久久久久久高潮| 亚洲乱码国产乱码精品精的特点| 男人天堂中文字幕| 欧美性一区二区| 高h放荡受浪受bl| 中文字幕精品视频| 大桥未久在线视频| 成人午夜在线视频一区| 伊人久久亚洲| 亚洲精品国产精品国自产观看| 亚洲视频一区| 欧美午夜aaaaaa免费视频| 国产伦精品一区二区三区视频青涩| 一级特黄a大片免费| 亚洲嫩草精品久久| 91久久国产综合久久91| 日韩精品中文字幕一区| av在线日韩国产精品| 韩剧1988在线观看免费完整版| 日韩午夜视频在线| 欧美性xxxx69| 亚洲全部视频| 手机看片国产精品| 欧美国产一区二区| 日韩免费视频一区二区视频在线观看| 欧美精品一级二级| 激情小说 在线视频| 欧美极品美女电影一区| 欧美成人一二区| 欧美极品一区二区| 影音先锋日韩资源| 在线观看免费看片| 国产精品卡一卡二卡三| 无码日韩精品一区二区| 亚洲成色999久久网站| av免费在线免费观看| 国产男人精品视频| 国产一区二区观看| 日本精品一区在线观看| 成人在线综合网| 最新一区二区三区| 欧美精品粉嫩高潮一区二区| 丁香在线视频| 国产精品爱久久久久久久| 激情亚洲另类图片区小说区| 91网站在线观看免费| 国产精品1区2区3区| 在线免费看av网站| 欧美精品乱码久久久久久| 不卡在线视频| 国产精品热视频| 成人vr资源| 欧美一级裸体视频| 日本一区免费视频| 性高潮视频在线观看| 伊是香蕉大人久久| 伊人久久高清| 亚洲电影免费| 老司机免费视频一区二区| 东京热无码av男人的天堂| 欧美午夜片在线看| 色视频在线看| 国产aaa精品| 青草国产精品| 亚洲精品综合在线观看| 日韩美女视频一区二区| 国产v片在线观看| 久久91亚洲精品中文字幕| av不卡一区| 人妻av中文系列| 久久中文娱乐网| 欧美人一级淫片a免费播放| 中文字幕亚洲在线| 国产美女视频一区二区| 伊人再见免费在线观看高清版| 国产日产精品一区二区三区四区的观看方式| 天天操天天综合网| 91精品国产乱码久久久| 久久成人精品视频| 成人台湾亚洲精品一区二区| 麻豆tv在线播放| 久久九九全国免费| 中国一级大黄大黄大色毛片| 国产欧美91| 天天舔天天操天天干| 91精品一区二区三区久久久久久 | 国产精品巨作av| 成人一对一视频| 欧美国产精品一区二区| 国产日韩欧美一区二区东京热| 欧美精品videossex性护士| 麻豆一区一区三区四区| 激情内射人妻1区2区3区 | 亚洲精品中文字幕女同| 韩日精品一区| 日韩极品视频在线观看| 91麻豆精东视频| 91tv国产成人福利| 午夜精品在线观看| 欧美亚洲高清| 亚洲av成人片无码| 91久久线看在观草草青青| 激情影院在线观看| 久久久久久国产精品一区| 韩国精品一区二区| 二区视频在线观看| 久久亚洲综合国产精品99麻豆精品福利 | 狠狠久久五月精品中文字幕| 69久久精品| 精品国产_亚洲人成在线| 久久精品国产亚洲高清剧情介绍 | 第一页在线观看| 国产精品午夜国产小视频| 亚洲精品韩国| 69夜色精品国产69乱| 亚洲美女在线观看|