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

源碼深度解析,Spring 如何解決循環(huán)依賴(lài)?

開(kāi)發(fā) 架構(gòu)
“一級(jí)緩存”的作用,變量命名為 singletonObjects,結(jié)構(gòu)是 Map<String, Object>,它就是一個(gè)單例池,將初始化好的對(duì)象放到里面,給其它線(xiàn)程使用,如果沒(méi)有第一級(jí)緩存,程序不能保證 Spring 的單例屬性。

大家好,我是樓仔!

之前有粉絲問(wèn)我 “樓哥,你的文章怎么沒(méi)有研究源碼方面的呢?我對(duì)這塊還挺感興趣的”。

其實(shí)我不太喜歡研究源碼,熱衷理論和實(shí)操,不過(guò)后來(lái)想了想,我已經(jīng)寫(xiě)了很多系列文章,也可以出一個(gè)源碼系列,滿(mǎn)足不同粉絲的要求,那就拿 Spring 開(kāi)刀吧。

Spring 如何解決循環(huán)依賴(lài),網(wǎng)上的資料很多,但是感覺(jué)寫(xiě)得好的極少,特別是源碼解讀方面,我就自己?jiǎn)为?dú)出一篇,這篇文章絕對(duì)肝!

不 BB,上文章目錄。

圖片

1. 基礎(chǔ)知識(shí)

1.1 什么是循環(huán)依賴(lài) ?

一個(gè)或多個(gè)對(duì)象之間存在直接或間接的依賴(lài)關(guān)系,這種依賴(lài)關(guān)系構(gòu)成一個(gè)環(huán)形調(diào)用,有下面 3 種方式。

圖片

我們看一個(gè)簡(jiǎn)單的 Demo,對(duì)標(biāo)“情況 2”。

@Service
public class Louzai1 {

@Autowired
private Louzai2 louzai2;

public void test1() {
}
}

@Service
public class Louzai2 {
@Autowired
private Louzai1 louzai1;

public void test2() {
}
}

這是一個(gè)經(jīng)典的循環(huán)依賴(lài),它能正常運(yùn)行,后面我們會(huì)通過(guò)源碼的角度,解讀整體的執(zhí)行流程。

1.2 三級(jí)緩存

解讀源碼流程之前,spring 內(nèi)部的三級(jí)緩存邏輯必須了解,要不然后面看代碼會(huì)蒙圈。

  • 第一級(jí)緩存:singletonObjects,用于保存實(shí)例化、注入、初始化完成的 bean 實(shí)例;
  • 第二級(jí)緩存:earlySingletonObjects,用于保存實(shí)例化完成的 bean 實(shí)例;
  • 第三級(jí)緩存:singletonFactories,用于保存 bean 創(chuàng)建工廠(chǎng),以便后面有機(jī)會(huì)創(chuàng)建代理對(duì)象。

這是最核心,我們直接上源碼:

圖片

執(zhí)行邏輯:

  • 先從“第一級(jí)緩存”找對(duì)象,有就返回,沒(méi)有就找“二級(jí)緩存”;
  • 找“二級(jí)緩存”,有就返回,沒(méi)有就找“三級(jí)緩存”;
  • 找“三級(jí)緩存”,找到了,就獲取對(duì)象,放到“二級(jí)緩存”,從“三級(jí)緩存”移除。

1.3 原理執(zhí)行流程

我把“情況 2”執(zhí)行的流程分解為下面 3 步,是不是和“套娃”很像 ?

圖片

整個(gè)執(zhí)行邏輯如下:

  • 在第一層中,先去獲取 A 的 Bean,發(fā)現(xiàn)沒(méi)有就準(zhǔn)備去創(chuàng)建一個(gè),然后將 A 的代理工廠(chǎng)放入“三級(jí)緩存”(這個(gè) A 其實(shí)是一個(gè)半成品,還沒(méi)有對(duì)里面的屬性進(jìn)行注入),但是 A 依賴(lài) B 的創(chuàng)建,就必須先去創(chuàng)建 B;
  • 在第二層中,準(zhǔn)備創(chuàng)建 B,發(fā)現(xiàn) B 又依賴(lài) A,需要先去創(chuàng)建 A;
  • 在第三層中,去創(chuàng)建 A,因?yàn)榈谝粚右呀?jīng)創(chuàng)建了 A 的代理工廠(chǎng),直接從“三級(jí)緩存”中拿到 A 的代理工廠(chǎng),獲取 A 的代理對(duì)象,放入“二級(jí)緩存”,并清除“三級(jí)緩存”;
  • 回到第二層,現(xiàn)在有了 A 的代理對(duì)象,對(duì) A 的依賴(lài)完美解決(這里的 A 仍然是個(gè)半成品),B 初始化成功;
  • 回到第一層,現(xiàn)在 B 初始化成功,完成 A 對(duì)象的屬性注入,然后再填充 A 的其它屬性,以及 A 的其它步驟(包括 AOP),完成對(duì) A 完整的初始化功能(這里的 A 才是完整的 Bean)。
  • 將 A 放入“一級(jí)緩存”。

為什么要用 3 級(jí)緩存 ?我們先看源碼執(zhí)行流程,后面我會(huì)給出答案。

2. 源碼解讀

注意:Spring 的版本是 5.2.15.RELEASE,否則和我的代碼不一樣!!!

上面的知識(shí),網(wǎng)上其實(shí)都有,下面才是我們的重頭戲,讓你跟著樓仔,走一遍代碼流程。

2.1 代碼入口

圖片

圖片

這里需要多跑幾次,把前面的 beanName 跳過(guò)去,只看 louzai1。

圖片

圖片

2.2 第一層

圖片

進(jìn)入 doGetBean(),從 getSingleton() 沒(méi)有找到對(duì)象,進(jìn)入創(chuàng)建 Bean 的邏輯。

圖片

圖片

進(jìn)入 doCreateBean() 后,調(diào)用 addSingletonFactory()。

圖片

往三級(jí)緩存 singletonFactories 塞入 louzai1 的工廠(chǎng)對(duì)象。

圖片

圖片

進(jìn)入到 populateBean(),執(zhí)行 postProcessProperties(),這里是一個(gè)策略模式,找到下圖的策略對(duì)象。

圖片

正式進(jìn)入該策略對(duì)應(yīng)的方法。

圖片

下面都是為了獲取 louzai1 的成員對(duì)象,然后進(jìn)行注入。

圖片

圖片

圖片

圖片

進(jìn)入 doResolveDependency(),找到 louzai1 依賴(lài)的對(duì)象名 louzai2

圖片

需要獲取 louzai2 的 bean,是 AbstractBeanFactory 的方法。

圖片

正式獲取 louzai2 的 bean。

圖片

到這里,第一層套娃基本結(jié)束,因?yàn)?louzai1 依賴(lài) louzai2,下面我們進(jìn)入第二層套娃。

2.3 第二層

圖片

獲取 louzai2 的 bean,從 doGetBean(),到 doResolveDependency(),和第一層的邏輯完全一樣,找到 louzai2 依賴(lài)的對(duì)象名 louzai1。

前面的流程全部省略,直接到 doResolveDependency()。

圖片

正式獲取 louzai1 的 bean。

圖片

到這里,第二層套娃結(jié)束,因?yàn)?louzai2 依賴(lài) louzai1,所以我們進(jìn)入第三層套娃。

2.4 第三層

圖片

獲取 louzai1 的 bean,在第一層和第二層中,我們每次都會(huì)從 getSingleton() 獲取對(duì)象,但是由于之前沒(méi)有初始化 louzai1 和 louzai2 的三級(jí)緩存,所以獲取對(duì)象為空。

圖片

圖片

敲重點(diǎn)!敲重點(diǎn)!!敲重點(diǎn)!!!

到了第三層,由于第三級(jí)緩存有 louzai1 數(shù)據(jù),這里使用三級(jí)緩存中的工廠(chǎng),為 louzai1 創(chuàng)建一個(gè)代理對(duì)象,塞入二級(jí)緩存。

圖片

這里就拿到了 louzai1 的代理對(duì)象,解決了 louzai2 的依賴(lài)關(guān)系,返回到第二層。

2.5 返回第二層

返回第二層后,louzai2 初始化結(jié)束,這里就結(jié)束了么?二級(jí)緩存的數(shù)據(jù),啥時(shí)候會(huì)給到一級(jí)呢?

甭著急,看這里,還記得在 doGetBean() 中,我們會(huì)通過(guò) createBean() 創(chuàng)建一個(gè) louzai2 的 bean,當(dāng) louzai2 的 bean 創(chuàng)建成功后,我們會(huì)執(zhí)行 getSingleton(),它會(huì)對(duì) louzai2 的結(jié)果進(jìn)行處理。

圖片

我們進(jìn)入 getSingleton(),會(huì)看到下面這個(gè)方法。

圖片

這里就是處理 louzai2 的 一、二級(jí)緩存的邏輯,將二級(jí)緩存清除,放入一級(jí)緩存。

圖片

2.6 返回第一層

同 2.5,louzai1 初始化完畢后,會(huì)把 louzai1 的二級(jí)緩存清除,將對(duì)象放入一級(jí)緩存。

圖片

到這里,所有的流程結(jié)束,我們返回 louzai1 對(duì)象。

3. 原理深度解讀

3.1 什么要有 3 級(jí)緩存 ?

這是一道非常經(jīng)典的面試題,前面已經(jīng)告訴大家詳細(xì)的執(zhí)行流程,包括源碼解讀,但是沒(méi)有告訴大家為什么要用 3 級(jí)緩存?

這里是重點(diǎn)!敲黑板!!!

我們先說(shuō)“一級(jí)緩存”的作用,變量命名為 singletonObjects,結(jié)構(gòu)是 Map<String, Object>,它就是一個(gè)單例池,將初始化好的對(duì)象放到里面,給其它線(xiàn)程使用,如果沒(méi)有第一級(jí)緩存,程序不能保證 Spring 的單例屬性。

“二級(jí)緩存”先放放,我們直接看“三級(jí)緩存”的作用,變量命名為 singletonFactories,結(jié)構(gòu)是 Map<String, ObjectFactory<?>>,Map 的 Value 是一個(gè)對(duì)象的代理工廠(chǎng),所以“三級(jí)緩存”的作用,其實(shí)就是用來(lái)存放對(duì)象的代理工廠(chǎng)。

那這個(gè)對(duì)象的代理工廠(chǎng)有什么作用呢,我先給出答案,它的主要作用是存放半成品的單例 Bean,目的是為了“打破循環(huán)”,可能大家還是不太懂,這里我再稍微解釋一下。

我們回到文章開(kāi)頭的例子,創(chuàng)建 A 對(duì)象時(shí),會(huì)把實(shí)例化的 A 對(duì)象存入“三級(jí)緩存”,這個(gè) A 其實(shí)是個(gè)半成品,因?yàn)闆](méi)有完成 A 的依賴(lài)屬性 B 的注入,所以后面當(dāng)初始化 B 時(shí),B 又要去找 A,這時(shí)就需要從“三級(jí)緩存”中拿到這個(gè)半成品的 A(這里描述,其實(shí)也不完全準(zhǔn)確,因?yàn)椴皇侵苯幽茫瑸榱俗尨蠹液美斫猓揖拖冗@樣描述),打破循環(huán)。

那我再問(wèn)一個(gè)問(wèn)題,為什么“三級(jí)緩存”不直接存半成品的 A,而是要存一個(gè)代理工廠(chǎng)呢 ?答案是因?yàn)?AOP。

在解釋這個(gè)問(wèn)題前,我們看一下這個(gè)代理工廠(chǎng)的源碼,讓大家有一個(gè)更清晰的認(rèn)識(shí)。

直接找到創(chuàng)建 A 對(duì)象時(shí),把實(shí)例化的 A 對(duì)象存入“三級(jí)緩存”的代碼,直接用前面的兩幅截圖。

圖片

圖片

下面我們主要看這個(gè)對(duì)象工廠(chǎng)是如何得到的,進(jìn)入 getEarlyBeanReference() 方法。

圖片

圖片

圖片

圖片

最后一幅圖太重要了,我們知道這個(gè)對(duì)象工廠(chǎng)的作用:

  • 如果 A 有 AOP,就創(chuàng)建一個(gè)代理對(duì)象;
  • 如果 A 沒(méi)有 AOP,就返回原對(duì)象。

那“二級(jí)緩存”的作用就清楚了,就是用來(lái)存放對(duì)象工廠(chǎng)生成的對(duì)象,這個(gè)對(duì)象可能是原對(duì)象,也可能是個(gè)代理對(duì)象。

我再問(wèn)一個(gè)問(wèn)題,為什么要這樣設(shè)計(jì)呢?把二級(jí)緩存干掉不行么 ?我們繼續(xù)往下看。

3.2 能干掉第 2 級(jí)緩存么 ?

@Service
public class A {

@Autowired
private B b;

@Autowired
private C c;

public void test1() {
}
}

@Service
public class B {
@Autowired
private A a;

public void test2() {
}
}

@Service
public class C {

@Autowired
private A a;

public void test3() {
}
}

根據(jù)上面的套娃邏輯,A 需要找 B 和 C,但是 B 需要找 A,C 也需要找 A。

假如 A 需要進(jìn)行 AOP,因?yàn)榇韺?duì)象每次都是生成不同的對(duì)象,如果干掉第二級(jí)緩存,只有第一、三級(jí)緩存:

  • B 找到 A 時(shí),直接通過(guò)三級(jí)緩存的工廠(chǎng)的代理對(duì)象,生成對(duì)象 A1。
  • C 找到 A 時(shí),直接通過(guò)三級(jí)緩存的工廠(chǎng)的代理對(duì)象,生成對(duì)象 A2。

看到問(wèn)題沒(méi)?你通過(guò) A 的工廠(chǎng)的代理對(duì)象,生成了兩個(gè)不同的對(duì)象 A1 和 A2,所以為了避免這種問(wèn)題的出現(xiàn),我們搞個(gè)二級(jí)緩存,把 A1 存下來(lái),下次再獲取時(shí),直接從二級(jí)緩存獲取,無(wú)需再生成新的代理對(duì)象。

所以“二級(jí)緩存”的目的是為了避免因?yàn)?AOP 創(chuàng)建多個(gè)對(duì)象,其中存儲(chǔ)的是半成品的 AOP 的單例 bean。

如果沒(méi)有 AOP 的話(huà),我們其實(shí)只要 1、3 級(jí)緩存,就可以滿(mǎn)足要求。

4. 寫(xiě)在最后

我們?cè)倩仡櫼幌?3 級(jí)緩存的作用:

  • 一級(jí)緩存:為“Spring 的單例屬性”而生,就是個(gè)單例池,用來(lái)存放已經(jīng)初始化完成的單例 Bean;
  • 二級(jí)緩存:為“解決 AOP”而生,存放的是半成品的 AOP 的單例 Bean;
  • 三級(jí)緩存:為“打破循環(huán)”而生,存放的是生成半成品單例 Bean 的工廠(chǎng)方法。

如果你能理解上面我說(shuō)的三條,恭喜你,你對(duì) Spring 的循環(huán)依賴(lài)?yán)斫獾梅浅M笍兀?/p>

關(guān)于循環(huán)依賴(lài)的知識(shí),其實(shí)還有,因?yàn)槠颍揖筒辉賹?xiě)了,這篇文章的重點(diǎn),一方面是告訴大家循環(huán)依賴(lài)的核心原理,另一方面是讓大家自己去 debug 代碼,跑跑流程,挺有意思的。

可能有同學(xué)會(huì)問(wèn) “樓哥,你之前是不是經(jīng)常看源碼,然后這個(gè)流程,你是不是 debug 了很久?”

我之前其實(shí)沒(méi)怎么看過(guò)開(kāi)源代碼,這個(gè)流程,前期理論知識(shí)看了 2.5 個(gè)小時(shí),然后 debug 4.5 小時(shí),就基本全部走通了,最難的地方,就是三層套娃,稍微有些繞。

這里也簡(jiǎn)單說(shuō)一下我看源碼的心得:

  • 需要掌握基本的設(shè)計(jì)模式;
  • 看源碼前,最好能找一些理論知識(shí)先看看;
  • 學(xué)會(huì)讀英文注釋?zhuān)粫?huì)的話(huà)就百度翻譯;
  • debug 時(shí),要克制自己,不要陷入無(wú)用的細(xì)節(jié),這個(gè)最重要。

其中最難的是第 4 步,因?yàn)楹芏嗤瑢W(xué)看 Spring 源碼,每看一個(gè)方法,就想多研究研究,這樣很容易被繞進(jìn)去了,這個(gè)要學(xué)會(huì)克制,有大局觀(guān),并能分辨哪里是核心邏輯,至于如何分辨,可以在網(wǎng)上先找些資料,如果沒(méi)有的話(huà),就只能多看代碼了。

責(zé)任編輯:武曉燕 來(lái)源: 樓仔
相關(guān)推薦

2019-11-26 14:30:20

Spring循環(huán)依賴(lài)Java

2023-10-07 08:40:57

緩存屬性Spring

2020-12-29 08:34:08

spring循環(huán)依賴(lài)開(kāi)發(fā)

2023-11-28 08:00:00

SpringJava

2020-06-22 08:07:48

Spring依賴(lài)場(chǎng)景

2023-08-09 10:43:21

源碼循環(huán)依賴(lài)getBean

2020-11-27 06:28:55

Spring循環(huán)依賴(lài)

2023-10-11 12:35:29

Maven

2010-03-11 14:15:24

Python循環(huán)

2023-12-12 17:44:13

三級(jí)緩存Bean

2022-12-07 08:02:43

Spring流程IOC

2019-09-09 06:30:06

Springboot程序員開(kāi)發(fā)

2020-02-10 15:50:18

Spring循環(huán)依賴(lài)Java

2021-01-29 14:14:47

動(dòng)態(tài)代理緩存

2024-12-05 09:06:58

2023-05-04 08:06:27

Spring循環(huán)依賴(lài)

2021-04-01 08:05:01

React無(wú)限循環(huán)useEffect()

2023-05-25 08:00:36

阿?云DNS重試機(jī)制

2024-04-12 07:51:05

SpringBean初始化

2017-09-23 22:07:24

深度學(xué)習(xí)N 體問(wèn)題GAN
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

亚洲精品18| 先锋影音在线资源站91| 天堂一区二区在线| 亚洲图片在区色| 国产视频1区2区3区| 91最新在线视频| 99久久精品免费| 国产精品国产福利国产秒拍 | 男人操女人逼免费视频| 国产视频第一页在线观看| 激情国产一区二区| 91av福利视频| 少妇高潮惨叫久久久久| 国产亚洲精品美女久久| 在线观看成人免费视频| av一区二区三区免费观看| 你懂的在线看| 国产成人精品免费视频网站| 国产成人精品a视频一区www| 久草国产在线视频| 成人精品中文字幕| 亚洲国产日韩精品在线| 日韩欧美亚洲另类| 国产精品专区免费| 亚洲亚洲精品在线观看| 亚洲欧美日韩不卡一区二区三区| 亚洲黄色片视频| 另类小说一区二区三区| 日本成人在线视频网址| 久久无码精品丰满人妻| 91精品国产91久久久久久密臀| 日韩精品视频在线播放| 亚洲少妇一区二区三区| 色综合视频一区二区三区日韩| 精品女同一区二区三区在线播放| 青青草综合视频| 三级外国片在线观看视频| 成人深夜视频在线观看| 444亚洲人体| 国产永久免费视频| 美女高潮久久久| 国产精品久久久久aaaa九色| 日韩 欧美 综合| 66视频精品| 久久久国产精品x99av| 91视频免费在观看| 国产欧美日韩精品一区二区三区| 亚洲国内精品在线| 在线免费看黄色片| 超碰精品在线观看| 精品不卡在线视频| 怡红院一区二区| 成人资源在线播放| 精品久久久久久久久久久久包黑料 | 精品夜夜澡人妻无码av| 嗯用力啊快一点好舒服小柔久久| 日韩欧美卡一卡二| 久久久久99人妻一区二区三区| 四虎国产精品免费久久5151| 欧美日韩视频在线观看一区二区三区 | 91网站免费视频| 日本午夜精品| 亚洲国产成人精品一区二区| 亚洲少妇18p| 日韩美女精品| 亚洲色图在线观看| 人妻无码一区二区三区免费| 欧洲三级视频| 日韩在线观看精品| 欧美日韩在线观看成人| 红桃视频亚洲| 欧美在线www| 欧美一区二区三区网站| 三级一区在线视频先锋| 国产精品第8页| 在线观看黄色网| 黑人巨大精品欧美一区| 99国产视频在线| 男人天堂手机在线观看| 91色综合久久久久婷婷| 日韩欧美手机在线| 幼a在线观看| 亚洲乱码国产乱码精品精可以看 | 人妻熟女aⅴ一区二区三区汇编| 婷婷精品在线| 深夜成人在线观看| 久久久久黄色片| 噜噜爱69成人精品| 国产有码一区二区| 成 人 免费 黄 色| 久久色.com| 中文字幕一区二区三区四区五区六区| 性网站在线观看| 欧美日韩国产精品一区二区三区四区| 18禁男女爽爽爽午夜网站免费| 韩日精品一区| 精品久久久久久最新网址| 国产中年熟女高潮大集合| 欧美超碰在线| 国产69久久精品成人| 一本色道久久综合熟妇| 成人av网址在线| 亚洲二区自拍| 麻豆视频在线看| 欧美人伦禁忌dvd放荡欲情| 国产精品无码在线| 亚洲久久久久| 日韩美女av在线免费观看| av老司机久久| 国产免费久久精品| 日韩视频免费播放| 成人在线视频国产| 亚洲日韩欧美视频| 日本污视频在线观看| 久久精品二区亚洲w码| 久久亚洲综合网| 3d玉蒲团在线观看| 欧美日韩国产综合久久| 在线精品一区二区三区| 一本到12不卡视频在线dvd| 国产va免费精品高清在线| 超碰在线观看99| 亚洲国产成人在线| 国产美女网站在线观看| 精品伊人久久| www.亚洲成人| 午夜精品免费观看| av网站免费线看精品| 欧美大片免费播放| 先锋影音一区二区| 在线播放日韩av| 欧美一区免费看| 99久久免费国产| 国产精品久久国产| 日本一区二区乱| 久久精品国产欧美激情| 老熟妇一区二区三区啪啪| 久久免费美女视频| 欧美变态另类刺激| 欧美在线导航| 97在线免费视频| 人妻无码中文字幕免费视频蜜桃| 一区二区三区四区视频精品免费 | 女同性恋一区二区| 日本中文字幕视频一区| 中文字幕精品网| 中文在线字幕av| 国产三区在线成人av| 日韩av黄色网址| 日本一区福利在线| 4438全国成人免费| 午夜福利视频一区二区| 五月激情六月综合| 国产高清自拍视频| 鲁大师影院一区二区三区| 裸模一区二区三区免费| 免费观看欧美大片| 亚洲一区二区福利| 亚洲一卡二卡在线| 亚洲欧洲色图综合| 中文字幕在线观看视频www| 欧美成人一品| 国产日韩一区二区三区| 日本不良网站在线观看| 亚洲品质视频自拍网| 中文天堂在线播放| 亚洲男人的天堂av| 这里只有精品在线观看视频 | 一区二区三区 欧美| 欧美熟乱15p| 91免费精品国偷自产在线| 青青在线视频| 日韩国产精品一区| 糖心vlog精品一区二区| 亚洲图片激情小说| 95视频在线观看| 久久精品日产第一区二区 | av影片在线看| 欧美一区二区三区免费在线看| 国产一级在线免费观看| 2019国产精品| 手机在线成人免费视频| 亚洲综合专区| 欧美国产二区| 日韩午夜视频在线| 国模叶桐国产精品一区| 国产在线视频网址| 日韩视频一区在线观看| 日韩不卡在线播放| 综合欧美亚洲日本| 欧美成人三级伦在线观看| 麻豆精品视频在线| 91免费黄视频| 成人激情开心网| 国产精品国产亚洲精品看不卡15| 日韩高清在线| 欧美日韩国产成人| 香蕉视频在线免费看| 精品区一区二区| 少妇又紧又色又爽又刺激视频| 亚洲一区在线观看免费| 快灬快灬一下爽蜜桃在线观看| 风流少妇一区二区| 亚洲 激情 在线| 亚洲精品孕妇| 亚洲免费视频播放| 亚洲欧美校园春色| 动漫一区二区在线| 色综合久久久| 国产成+人+综合+亚洲欧洲| 怡红院红怡院欧美aⅴ怡春院| 亚洲性线免费观看视频成熟| 你懂的网站在线| 8x8x8国产精品| 最新中文字幕在线观看视频| 香蕉乱码成人久久天堂爱免费| 爱爱视频免费在线观看| 国产亚洲精品久| av网页在线观看| 国产精品一级片| the porn av| 亚洲综合精品四区| 亚洲 自拍 另类小说综合图区| 亚洲久久久久| 欧美日韩视频免费在线观看| av永久不卡| 欧美精品一区在线| 日韩av资源网| 国产精品区一区二区三含羞草| 动漫一区二区三区| 国产一区二区在线免费视频| 婷婷六月国产精品久久不卡| 孩xxxx性bbbb欧美| √8天堂资源地址中文在线| 久久成人av网站| 蜜桃视频网站在线| 综合国产在线视频| av电影在线网| 一区二区三区四区精品| 二区三区在线播放| 亚洲欧洲一区二区三区在线观看| 婷婷五月综合久久中文字幕| 亚洲成**性毛茸茸| 污视频网站免费观看| 亚洲成人动漫在线播放| 风流老熟女一区二区三区| 91精品国产日韩91久久久久久| 中文在线免费观看| 欧美日韩一区三区四区| 中文字幕视频免费观看| 欧美日韩中文字幕一区二区| 中文字幕a级片| 欧美三级一区二区| 一区二区精品视频在线观看| 欧美福利视频导航| 国产女人高潮时对白| 欧美一卡2卡三卡4卡5免费| www.精品久久| 亚洲成人黄色网址| 日本福利片高清在线观看| 精品视频—区二区三区免费| 蝌蚪视频在线播放| 最新69国产成人精品视频免费| 日本三级视频在线播放| 久久九九国产精品怡红院| 高清全集视频免费在线| 欧美高清激情视频| 高清精品在线| 国产99视频精品免视看7| 91成人抖音| 国产免费一区二区三区在线观看 | 精品国产免费一区二区三区 | 国产麻豆精品theporn| 色综合久久久无码中文字幕波多| 成人精品国产免费网站| 国产全是老熟女太爽了| 国产精品成人网| 国产污视频在线看| 色中色一区二区| 国产精品久久久久久久免费| 精品国产乱码久久久久久图片| 天堂在线免费av| 中文一区二区视频| 激情影院在线| 国产精品99久久久久久人 | 久久香蕉综合色| 日韩成人精品一区| 久久99久久久久久| 玖玖在线精品| 国产a√精品区二区三区四区| 久久久影院官网| 国产高清视频免费在线观看| 亚洲第一av色| 一区二区久久精品66国产精品| 亚洲国产黄色片| 激情视频在线观看| 欧美性做爰毛片| 国产在线一区不卡| 麻豆av一区| 亚洲欧美亚洲| 日本在线观看免费视频| 成人国产精品免费| 久久久精品少妇| 色婷婷综合在线| 蜜桃视频污在线观看| 少妇激情综合网| 香蕉成人av| 国产另类自拍| 亚洲乱码免费伦视频| 国产一区二区在线免费播放| 99视频精品全部免费在线| 日本高清不卡免费| 欧美综合在线视频| 深夜福利视频一区| 欧美日韩爱爱视频| 99综合久久| 亚洲成人第一| 久久久水蜜桃av免费网站| av不卡中文字幕| 中文字幕佐山爱一区二区免费| 97人妻一区二区精品视频| 日韩av在线高清| 成人三级小说| 91久久国产综合久久91精品网站| 九九久久成人| 日本精品一区在线观看| 成人免费视频一区二区| 精品99在线观看| 91精品国产麻豆| 欧美jizzhd69巨大| 国产玖玖精品视频| 国产日韩欧美一区二区三区| 欧美色图另类小说| 99re在线视频这里只有精品| 日本三级2019| 日韩av在线免费播放| 黄色在线免费观看网站| 国产精品有限公司| 亚洲精品国产日韩| 久久久老熟女一区二区三区91| 亚洲一二三四久久| 人妻少妇精品无码专区久久| 久久久视频免费观看| 白嫩白嫩国产精品| 日韩精品一区在线视频| 国产成都精品91一区二区三| 久草视频免费在线播放| 欧美不卡视频一区| aa级大片免费在线观看| 国产女主播一区二区| 亚洲欧洲一区二区天堂久久| 呦呦视频在线观看| 欧美日韩人人澡狠狠躁视频| 日本天堂在线| 国产精品美女久久| **女人18毛片一区二区| 伊人免费视频二| 亚洲一区二区四区蜜桃| 成人毛片视频免费看| 97人人爽人人喊人人模波多| 亚洲第一福利专区| www.99av.com| 日韩久久一区二区| 日韩一区二区三区不卡| 91精品国产高清久久久久久91 | 日韩精品免费综合视频在线播放 | 91中文在线视频| 黄色亚洲大片免费在线观看| 漂亮人妻被黑人久久精品| 欧美午夜宅男影院在线观看| av在线之家电影网站| 亚洲一区二区三区777| 亚洲日本激情| av电影网站在线观看| 91麻豆精品国产自产在线| 超碰97国产精品人人cao| 欧美日韩电影一区二区| 看片网站欧美日韩| 久久久www成人免费毛片| 精品一区二区三区三区| 欧美日韩视频免费看| 日本免费a视频| 国产色产综合色产在线视频| 国产按摩一区二区三区| 欧美孕妇性xx| 欧美1区2区3区| 六月婷婷七月丁香| 日韩欧美国产三级电影视频| 自由日本语热亚洲人| 影音先锋男人的网站| 91免费视频大全| 99热这里只有精品66| 欧洲亚洲妇女av| 亚洲国产精品久久久天堂| 亚洲av片不卡无码久久| 91精品国产入口在线| 亚洲人体视频| 欧美久久久久久久久久久久久久| 成人午夜影视| 日韩欧美一级精品久久|