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

20張圖剖析Spring啟動時核心的12個步驟

開發 前端
本文主要是講一些啟動的步驟,具體的很多技術實現細節、技術點這里就不過多贅述,如果有疑問的,可以查看三萬字盤點Spring 9大核心基礎功能這篇文章或者公眾號菜單欄中關于Spring的文章,基本上都能找到答案。

今天來扒一扒Spring在啟動過程中核心的12個步驟

之所以來寫這篇文章,主要是來填坑的

之前在三萬字盤點Spring 9大核心基礎功能這篇文章的末尾中給自己挖了一個坑,提了一嘴有機會要寫這么一篇文章

但是由于Spring啟動過程并不復雜,所以后面就沒寫了

不過,好巧不巧,剛剛好有兄弟來催更了,那么此時這個機會就來了,這篇文章也就有了

前言

Spring啟動時候整個入口是這么一個方法

AbstractApplicationContext#refresh

總共有12個方法,也就是啟動時的核心步驟

AbstractApplicationContext有眾多實現,這里我選擇SpringBoot Web應用默認的實現來講

AnnotationConfigServletWebServerApplicationContext

AnnotationConfigServletWebServerApplicationContext類圖

對應的SpringBoot版本為 2.2.5.RELEASE

高版本refresh方法會多一些日志相關的代碼,這里為了方便講解,就使用這個版本

所以后面本文提到的所有子類的方法實現、重寫都是指AnnotationConfigServletWebServerApplicationContext及其父類

本文主要是講一些啟動的步驟,具體的很多技術實現細節、技術點這里就不過多贅述

如果有疑問的,可以查看三萬字盤點Spring 9大核心基礎功能這篇文章或者公眾號菜單欄中關于Spring的文章,基本上都能找到答案

prepareRefresh

prepareRefresh整個刷新的一個步驟,這個步驟是做啟動的一個準備操作

ApplicationContext剛創建出來,什么也沒有,所以需要做一些準備

首先是做一些狀態位的變更,表明開始啟動了或者刷新了

后面一行

initPropertySources

initPropertySources是一個模板方法,本身是一個空實現,是給子類用的

我們的這個子類就重寫了initPropertySources方法

圖片圖片

會將Servlet相關的配置加入到Environment中,這樣我們就能從Environment中獲取到Servlet相關的配置了

再后面一行

getEnvironment().validateRequiredProperties()

這行代碼就是校驗一些必要的配置屬性,我們可以通過ConfigurableEnvironment來設置哪些屬性是必要的,默認是沒有必要的

所以prepareRefresh就是做了一些前置操作,準備好一些屬性配置相關的東西,后面的其它環節,比如說生成Bean時可能需要用到這些配置

obtainFreshBeanFactory

這一步驟是刷新BeanFactory并且獲取BeanFactory

refreshBeanFactory() 和 getBeanFactory() 都是抽象方法,由子類來實現的

而子類的實現其實很簡單,就是給beanFactory設置一個id和返回beanFactory

beanFactory就是下面這個玩意

并且創建對象的ApplicationContext對象的時候就創建了,類型為

DefaultListableBeanFactory

所以從這就可以看出來,雖然說BeanFactory是一個接口,有非常多的實現

但是實際情況下,真正使用的就是DefaultListableBeanFactory

并且DefaultListableBeanFactory其實算是BeanFactory唯一真正的實現

除此之外,還可以得出一個結論,ApplicationContext中有一個BeanFactory(DefaultListableBeanFactory)

圖片圖片

prepareBeanFactory

上一步驟獲取到了BeanFactory,但是這個BeanFactory僅僅就是剛剛new出來的,什么也沒有

所以當前步驟就是對BeanFactory做一些配置工作

前三行代碼

先給BeanFactory設置了一個ClassLoader,因為BeanFactory是用來創建Bean,需要加載Bean class對象

然后設置了一個BeanExpressionResolver,這個是用來解析SpEL表達式的

然后添加了一個PropertyEditorRegistrar,也就是

ResourceEditorRegistrar

這個的作用就是為BeanFactory添加一堆跟資源相關的PropertyEditor

ResourceEditorRegistrar核心實現方法

PropertyEditor之前說過,就是進行類型轉換的,將一個字符串轉成對應的類型

接下來這幾行

這里主要是添加了一個BeanPostProcessor,也就是

ApplicationContextAwareProcessor

BeanPostProcessor我們都知道會在Bean的生命周期階段進行回調,是Bean的生命周期一個核心的環節

ApplicationContextAwareProcessor這個是用來處理Bean生命周期中的Aware回調有關

當你的Bean實現這些接口的時候,在創建的時候Spring會回調這些接口,傳入對應的對象

而后面的這行代碼

beanFactory.ignoreDependencyInterface(EnvironmentAware.class);

意思是說,如果你的Bean想注入一個EnvironmentAware對象

@Resource
private EnvironmentAware environmentAware;

這是不允許的

因為很簡單,注入一個EnvironmentAware對象,沒有實際的意義

后面的其它幾行代碼也都是這個意思

再接下來這幾行

圖片圖片

這跟上面的ignoreDependencyInterface作用相反

他是來設置依賴注入時Bean的類型所對應的對象

比如說這行代碼

beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);

這行代碼的意思就是當你需要注入一個Bean類型為BeanFactory.class類型的時候

@Resource
private BeanFactory beanFactory;

那么實際注入的就是方法第二個參數beanFactory,也就是上面獲取的DefaultListableBeanFactory對象

同理,注入ResourceLoader、ApplicationEventPublisher、ApplicationContext時,其實注入的對象都是this,也就是當前的ApplicationContext對象

再再接下來這幾行

最開始又添加了一個BeanPostProcessor

ApplicationListenerDetector

這個BeanPostProcessor是跟ApplicationListener有關

他是將單例的ApplicationListener給添加到ApplicationContext中

再后面就是往BeanFactory里面添加一些跟配置屬性相關的單例對象,如果有哪里用到,就可以從BeanFactory中獲取到了

prepareBeanFactory就完了

正如方法名字的含義一樣,就是對BeanFactory做一些配置相關的東西

比如添加一些BeanPostProcessor,注冊一些PropertyEditor

為Bean的生成做準備操作

最后畫張圖來總結一下這個方法的作用

圖片圖片

此時BeanFactory狀態就是這樣的

圖片圖片

postProcessBeanFactory

這個方法是一個模板方法

圖片圖片

本身是空實現,是交給子類來擴展,子類可以根據不同的特性再對BeanFactory進行一些準備工作

比如我們用的這個Web實現就重寫了這個方法,對BeanFactory設置一些Web相關的配置

圖片圖片

AnnotationConfigServletWebServerApplicationContext#postProcessBeanFactory

首先調用父類ServletWebServerApplicationContext的postProcessBeanFactory

圖片圖片

ServletWebServerApplicationContext#postProcessBeanFactory

前兩行代碼跟之前說的一樣,也是添加Aware接口的回調對應的BeanPostProcessor,只不過這個Aware是跟Servlet相關的東西

接下來調用registerWebApplicationScopes方法,最終會調到下面這個方法

WebApplicationContextUtils#registerWebApplicationScopes

圖片圖片

這個方法干了兩件事

第一件事就是注冊一下Bean在Web環境下的作用域request、session,八股文中的東西

第二個就是注冊一些依賴注入時Bean類型和對應的對象,這在日常開發中還是有用的

比如可以直接注入一個ServletRequest

@Resource
private ServletRequest servletRequest;

所以,父類的實現主要還是對BeanFactory進行一些配置,只不過配置的主要是跟Web環境相關的東西

現在來看看AnnotationConfigServletWebServerApplicationContext自身的實現

圖片圖片

核心代碼就是這兩行

this.scanner.scan(this.basePackages);

this.reader.register(ClassUtils.toClassArray(this.annotatedClasses));

scanner和reader就是下面這兩個玩意

圖片圖片

也就是說,如果這些配置都不是空的話,那么此時就會掃描對應的包的下Bean,生成對應的BeanDenifition,再注冊到DefaultListableBeanFactory

至于為什么會存到DefaultListableBeanFactory中,可以看看之前的文章

此時BeanFactory大概是這么一個狀態

圖片圖片

除此之外,還有一個賊重要的事

AnnotationConfigServletWebServerApplicationContext這個ApplicationContext創建時會去創建AnnotatedBeanDefinitionReader

而AnnotatedBeanDefinitionReader的構造方法最終會調用這么一行代碼

AnnotationConfigUtils#registerAnnotationConfigProcessors(BeanDefinitionRegistry registry)

圖片圖片

這個方法非常重要,他會去注冊一些BeanDefinition到BeanFactory中,這里我稱為Spring內部的Bean

這里我說幾個常見和重要的

  • ConfigurationClassPostProcessor:這個是用來處理配置類的,非常重要,記住這個類,后面有大用
  • AutowiredAnnotationBeanPostProcessor:處理@Autowired、@Value注解
  • CommonAnnotationBeanPostProcessor:處理@Resource、@PostConstruct等注解

所以除了掃描出來的一些Bean對應的BeanDefinition,還有一些Spring內部的Bean會注冊到BeanFactory中

此時BeanFactory的狀態就如下圖所示

不過,在SpringBoot默認情況下,不會指定包和配置類,也就不會掃描文件,生成BeanDefinition

但是內部創建的BeanDefinition依然存在,并且在ApplicationContext創建的時候就注冊到BeanFactory中了

所以總結來說,postProcessBeanFactory這個方法是交給子類對BeanFactory做一些準備操作,并且可能會掃描Bean

invokeBeanFactoryPostProcessors

從這個方法的名字可以看出,是調用BeanFactoryPostProcessor,這個步驟非常重要,而且過程有點繞

前置知識:BeanFactoryPostProcessor及其子接口

BeanFactoryPostProcessor是一個接口,有一個方法,方法參數就是BeanFactory

通過這個方法就可以拿到BeanFactory,然后對BeanFactory做一些自己的調整

比如說,你想關閉循環依賴,你就可以實現這個接口,然后進行調整

他還有一個子接口BeanDefinitionRegistryPostProcessor

這個接口是對BeanDefinitionRegistry進行調整,BeanDefinitionRegistry就是存BeanDefinition的地方,真實的實現就是DefaultListableBeanFactory

所以BeanDefinitionRegistryPostProcessor的作用就是往BeanDefinitionRegistry(DefaultListableBeanFactory)中添加BeanDefinition的

再看invokeBeanFactoryPostProcessors

有了這兩個前置知識之后,我們來看看invokeBeanFactoryPostProcessors方法的實現

這個方法最終會調用下面方法來真正的處理

PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors;

這個方法比較長,大致分為兩件事

  • 調用所有的BeanDefinitionRegistryPostProcessor,解析配置類,注冊BeanDefinition到DefaultListableBeanFactory中
  • 從BeanFactory中獲取所有的BeanFactoryPostProcessor進行調用,完成對BeanFactory一些其它的擴展

調用BeanDefinitionRegistryPostProcessor

首先第一步,先從BeanFactory中獲取到所有的BeanDefinitionRegistryPostProcessor對象,調用它的postProcessBeanDefinitionRegistry方法

還記得上一節在說注冊Spring內部的Bean時特地強調的一個類ConfigurationClassPostProcessor不?

他就實現了BeanDefinitionRegistryPostProcessor接口

所以此時獲取到的就是ConfigurationClassPostProcessor

獲取ConfigurationClassPostProcessor的時候會走Bean的生命周期,也就是會回調前面添加的BeansPostProcessor,但是也沒幾個

之后會調用他的postProcessBeanDefinitionRegistry方法,來處理此時BeanFactory中的配置類

配置類從哪來,前面一直沒提到過

但是看一下ApplicationContext是如何使用的就知道了

比如說,下面這個demo

在創建一個ApplicationContext之后,在注冊一個Bean之后再refresh

此時這個注冊的Bean就是配置類。

如果你不注冊,那是真沒有配置類,此時也就沒什么意義了。

所以,ApplicationContext一定會有一個配置類,不然沒有意義。

在SpringBoot條件下,SpringBoot在啟動時就會將啟動引導類當做配置類給扔到BeanFactory中。

所以ConfigurationClassPostProcessor最開始處理的時候,就是處理啟動引導類

我們可以在ConfigurationClassPostProcessor方法實現上打個斷點驗證一下

在處理之前可以看見,除了幾個spring內部的BeanDefinition之外,還有一個myApplication,就是我的啟動引導類

處理的時候它會解析啟動引導類的注解,進行自動裝配,掃描你寫的代碼的操作,之后生成BeanDefinition

當處理完成之后我們再看看,DefaultListableBeanFactory有了非常多的BeanDefinition了

所以到第一步就完成了,此時BeanFactory就加載了很多Bean

圖片圖片

接下來,由于又新注冊了很多BeanDefinition,而這些里面就有可能有BeanDefinitionRegistryPostProcessor接口的實現

所以之后會重復從BeanFactory中獲取BeanDefinitionRegistryPostProcessor,調用postProcessBeanDefinitionRegistry

一直會循環下去,直到所有的BeanDefinitionRegistryPostProcessor都被調用為止

圖片圖片

由于BeanDefinitionRegistryPostProcessor繼承BeanFactoryPostProcessor

所以之后也會調用BeanDefinitionRegistryPostProcessor的postProcessBeanFactory方法

調用BeanFactoryPostProcessor

當調完所有的BeanDefinitionRegistryPostProcessor實現方法

之后就會從BeanFactory獲取所有的BeanFactoryPostProcessor(除了BeanDefinitionRegistryPostProcessor實現之外),調用postProcessBeanFactory方法

此時就可以通過BeanFactoryPostProcessor再次對BeanFactory進制擴展

總的來說,這一步驟的核心作用就是完成對BeanFactory自定義擴展,但是由于BeanFactoryPostProcessor都是Bean,所以要第一步先加載Bean,之后才能通過BeanFactoryPostProcessor來擴展

一張圖來總結上面主要干的事

這里簡化了一些前面提到東西

registerBeanPostProcessors

上面一個步驟已經完成了Bean的掃描和對BeanFactory的擴展

這一節通過方法名就可以看出,是跟BeanPostProcessor相關

不過在這個方法執行之前,我們先來看看此時BeanFactory中已經有了哪些BeanPostProcessor

此時只有4個,前3個前面都提到過,但是像我們熟知的處理@Autowired、@Resource注解的BeanPostProcessor都不在里面

所以這里就有一個非常重要的小細節

在當前這個步驟執行之前如果從BeanFactory中獲取Bean的話,雖然會走Bean生命周期的整個過程,但是@Autowired、@Resource注解都不會生效,因為此時BeanFactory中還沒有處理這些注解的BeanPostProcessor(CommonAnnotationBeanPostProcessor等)

什么意思呢,舉個例子

比如上面一節,在當前步驟執行之前會從BeanFactory中獲取BeanFactoryPostProcessor

假設現在你實現了BeanFactoryPostProcessor,想注入一個ApplicationContext對象

圖片圖片

此時是注入不成功的,@Resource注解不會生效,就是這個意思。

這時只能通過ApplicationContextAware方式獲取,因為有對應的BeanPostProcessor(ApplicationContextAwareProcessor)

接下來我們再來看看registerBeanPostProcessors實現

最終也是調用下面的方法

PostProcessorRegistrationDelegate#registerBeanPostProcessors

這個過程就沒上面那個步驟復雜了

其實就是從BeanFactory中獲取到所有的BeanPostProcessor,然后添加到BeanFactory中

不過值得注意的是,BeanPostProcessor創建會有優先級,優先級高的會先被創建和添加到BeanFactory中

到這一步其實BeanFactory就算是準備完成了,基本上跟創建Bean相關的前置操作幾乎都完成了

最后再來張圖總結一下這個方法干的事

initMessageSource

這個方法是處理國際化相關的操作

這個操作比較簡單,就是從BeanFactory中看看有沒有Bean名稱為messageSource的Bean

有的話就使用這個MessageSource,沒有的話就用默認的

不過SpringBoot項目下會自動裝配一個MessageSource,所以此時容器中是有的

initApplicationEventMulticaster

這個方法跟上面的差不多,也是從BeanFactory找有沒有ApplicationEventMulticaster

有就用容器中的,沒有就自己創建一個

ApplicationEventMulticaster是真正用來發布事件的,ApplicationEventPublisher最終也是調用他來發布事件

ApplicationEventMulticaster內部會緩存所有的監聽器

當通過ApplicationEventMulticaster發布事件的時候,會去找到所有的監聽器,然后調用

onRefresh

onRefresh也是一個模板方法,本身也是空實現

子類重寫這個方法,會去創建一個Web服務器

registerListeners

這個方法其實也比較簡單,就是將監聽器給添加到ApplicationEventMulticaster中

finishBeanFactoryInitialization

這個方法首先又是老套路,就是判斷容器中有沒有ConversionService

ConversionService也是用來做類型轉換的,跟前面提到的PropertyEditor作用差不多

如果有,就把ConversionService設置到BeanFactory中

到這一步,BeanFactory才算真的準備完成。。。

之后其實干的事就不太重要了

但是最后一行比較重要

beanFactory.preInstantiateSingletons();

從方法的命名就可以看出,實例化所有的單例對象

因為對于BeanFactory的一些配置在前面都完成了,所以這里就可以來實例化所有的單例對象了

這個方法會做兩件事

第一件事就是實例化所有的非懶加載的單例Bean

實際上就是通過getBean方法來的,因為獲取Bean,不存在的時候就會創,會走Bean的生命周期

第二件事就是一旦單例Bean實現了SmartInitializingSingleton接口,就會調用SmartInitializingSingleton的afterSingletonsInstantiated方法

這個其實也算是Bean生命周期的一部分。

finishRefresh

這個方法是整個Spring容器刷新的最后一個方法

這個方法就是收尾的操作

清理一下緩存操作

之后就是初始化LifecycleProcessor

都是一樣的套路,優先用BeanFactory中的

后面就會調用LifecycleProcessor#onRefresh方法

這個方法的作用就是,如果你的Bean實現了SmartLifecycle的接口,會調start的方法

隨后就發布一個ContextRefreshedEvent事件,表明容器已經刷新完成了

在Web環境底下,這個finishRefresh方法被重寫了

主要是多干了一件事,那就是啟動Web服務器

并且會發布了一個ServletWebServerInitializedEvent事件

這個事件在SpringBoot中用的不多

但是在SpringCloud中卻非常重要

在SpringCloud環境底下會有一個類監聽這個事件

一旦監聽到這個事件,SpringCloud就會將當前的服務的信息自動注冊到注冊中心上

這就是服務自動注冊的原理

總結

這里再來簡單回顧一下Spring啟動大致的幾個過程

最開始的準備操作,這部分就是準備一些配置屬性相關的

之后連續好幾個方法都是準備BeanFactory的,我把上面那張圖拿過來

整個準備BeanFactory過程大致如下:

  • 先配置BeanFactory
  • 通過ConfigurationClassPostProcessor加載Bean到BeanFactory中
  • 從上一步加載的Bean中獲取BeanFactoryPostProcessor,完成對BeanFactory做自定義處理
  • 從上一步加載的Bean中獲取BeanPostProcessor,添加到BeanFactory中

當這些步驟完成之后,BeanFactory跟Bean創建相關的配置幾乎算是配置完成了

之后其實就是一些ApplicationContext內部的一些組價的初始化,比如MessageSource、ApplicationEventMulticaster等等

優先從BeanFactory中獲取,沒有再用默認的

到這ApplicationContext也算配置完成了,之后就可以實例化單例非懶加載的Bean了

再后面就是一些掃尾的操作,發布一個ContextRefreshedEvent事件,表明容器已經刷新完成了

這時Spring就就算是真正啟動完成了。

最后,如果本篇文章對你所有幫助,歡迎轉發、點贊、收藏、在看,非常感謝。

最后的最后,再來留個坑,有機會再來扒一扒SpringBoot在啟動時都做了哪些事

至于啥時候填,那就等一個有緣人吧。。

責任編輯:武曉燕 來源: 三友的java日記
相關推薦

2022-10-31 07:57:18

Spring事務源碼

2023-09-28 21:37:41

HashMap多線程

2020-12-04 06:37:19

HTTPS原理安全

2024-01-02 22:47:47

Nacos注冊中心節點

2010-05-25 18:57:42

啟動postfix

2019-04-22 12:25:40

UbuntuLinux IP地址

2009-02-18 16:34:32

優化Windows啟動時間

2021-01-20 08:34:37

HBaseNoSQL數據庫

2022-02-28 11:10:42

ZGCG1收集器

2021-01-11 09:02:22

SpringJavaWeb

2017-12-25 13:51:32

LinuxUbuntu LinuLXD容器

2021-08-26 13:55:45

systemdLinux目標

2021-08-26 11:09:51

systemdLinux

2024-02-27 22:31:00

Feign動態代理核心

2022-11-02 13:47:20

Redis進程內存

2015-04-08 10:44:27

微軟win10

2022-03-18 21:29:37

人工智能AI

2010-05-06 18:42:15

Unix系統

2021-11-04 12:42:55

RocketMQ啟動消費

2022-02-17 08:20:17

Spring執行代碼SpringBoot
點贊
收藏

51CTO技術棧公眾號

7m精品国产导航在线| 18深夜在线观看免费视频| 天堂在线观看视频| 亚洲三级视频| 亚洲人成网站色ww在线| 日韩av一二三四| 欧美成人hd| 天堂va蜜桃一区二区三区漫画版| 亚洲精品视频免费在线观看| 簧片在线免费看| 成年人网站在线| 国产乱码字幕精品高清av| 久久久久久久久久久久久久久久久久av| 久久久久久久人妻无码中文字幕爆| 碰碰在线视频| 亚洲欧洲国产日韩| 91精品黄色| 久久久美女视频| 免费看av成人| 日韩免费性生活视频播放| 亚洲美免无码中文字幕在线| 99riav在线| 99精品在线免费| 国产精品99久久久久久人 | 日韩精品一区二区在线| 无码人妻h动漫| 狂野欧美激情性xxxx欧美| 国产日韩精品一区二区浪潮av| 91麻豆国产精品| 日日夜夜狠狠操| 国内一区二区三区| 中文字幕精品www乱入免费视频| 一级黄色电影片| 精品美女一区| 福利一区视频在线观看| 色乱码一区二区三区熟女| 青青操在线视频| 国产成人av电影在线| 国产精品一区久久| 国产伦精品一区二区三区视频我| 欧美oldwomenvideos| 亚洲人成人99网站| 中文字幕人妻一区二区三区| 国产原创一区| 欧美性xxxxxx少妇| 国产成人亚洲精品无码h在线 | 亚洲人成在线观看一区二区| 亚洲va久久久噜噜噜| 最近国语视频在线观看免费播放| 亚洲国内精品| 欧美久久久精品| 久久精品一区二区三区四区五区| 久久影视精品| 欧美伊人久久久久久午夜久久久久| 无码人妻丰满熟妇区96| 波多野结衣精品| 亚洲午夜视频在线观看| 潘金莲一级淫片aaaaaa播放1| 在线观看亚洲欧美| 奇米色欧美一区二区三区| 亚洲高清视频在线| www.18av.com| 在线中文字幕第一页| 亚洲女同一区二区| 大桥未久一区二区| 亚洲伦理一区二区三区| 偷偷操不一样的久久| 欧美日韩99| www亚洲欧美| 三上悠亚av一区二区三区| 欧美电影免费观看网站| 天天色天天操综合| 黄色一级片播放| 欧美xnxx| 亚洲欧美一区二区不卡| 99精品视频网站| 黄色网址在线免费| 亚洲欧美另类在线| 亚洲精品一区二区三区蜜桃久| 在线看av的网址| 亚洲精品老司机| www.亚洲视频.com| 中文字幕高清在线播放| 污视频在线看网站| 国产美女在线精品| 国产视频999| a在线观看免费| 大白屁股一区二区视频| 91在线观看免费网站| 亚洲爱情岛论坛永久| 国产毛片精品国产一区二区三区| 91免费在线视频| 国产又大又长又粗| 国内精品视频一区二区三区八戒 | av中文字幕在线观看| 国产精品毛片高清在线完整版| 日韩中文字幕av在线| 黄色美女一级片| 久久久久久久久久美女| 日韩视频在线观看国产| 黄网站视频在线观看| 一区二区在线免费| 欧美日韩精品在线一区二区| 成人国产精品| 精品国产伦一区二区三区观看体验| 欧美 日本 国产| 香蕉成人在线| 色综合久久久网| 国产精品自在自线| 超碰人人干人人| 欧美亚洲人成在线| 在线视频亚洲一区| 精品国产aⅴ一区二区三区东京热 久久久久99人妻一区二区三区 | 国内精品久久久久久久久| 久久久久免费看| 99热在线精品观看| 中文字幕在线观看亚洲| 日韩av在线看免费观看| 96sao精品免费视频观看| 亚洲激情自拍图| 免费成人深夜夜行网站| 天堂va蜜桃一区二区三区| 国产日韩欧美在线| 欧美视频免费一区二区三区| youjizz久久| 91免费视频黄| 少妇人妻精品一区二区三区| 中文字幕色av一区二区三区| 无码精品国产一区二区三区免费| 头脑特工队2在线播放| 国产日韩高清在线| 欧美 日韩 国产 高清| 国产精品国产三级在线观看| 夜夜躁日日躁狠狠久久88av| 日本特黄一级片| 国产在线日韩欧美| 视频二区一区| 校园春色亚洲色图| 韩国成人动漫| 色婷婷国产精品久久包臀| 成人综合久久网| 在线看欧美视频| 日韩高清免费观看| 欧美熟妇精品一区二区蜜桃视频| 91亚洲国产| 97超碰色婷婷| 亚洲福利在线观看视频| 首页国产欧美日韩丝袜| 狠狠色综合欧美激情| 久久99精品久久| 欧美日韩国产精品自在自线| www.中文字幕av| 国产国产精品| 国产精选久久久久久| 黄色电影免费在线看| 欧美日韩精品在线视频| 97精品人人妻人人| 中文字幕亚洲精品乱码| 成人性生交大片免费观看嘿嘿视频| 成人在线观看免费| 欧美伊人精品成人久久综合97 | 日韩一区和二区| 免费毛片在线播放免费| 成人免费高清视频在线观看| www.av毛片| 台湾色综合娱乐中文网| 国产精品久久久久久久第一福利| 国模叶桐国产精品一区| 97国产精品久久久| 中文字幕va一区二区三区| 91视频免费版污| 欧美日韩亚洲在线观看| 欧美在线www| 黄色大片网站在线观看| 91在线观看高清| 久久本道综合色狠狠五月| 制服丝袜专区在线| 亚洲伦理中文字幕| 91免费在线看片| 国产精品中文字幕一区二区三区| 日韩成人在线资源| 欧美一区二区三区婷婷| 最近2019中文免费高清视频观看www99 | 探花视频在线观看| av在线不卡观看免费观看| 国产精品三级一区二区| 福利欧美精品在线| 欧美一级片一区| 高清毛片在线看| 91成人免费电影| 天天操天天干天天操天天干| 日韩有码一区二区三区| 成人短视频在线看| 久久精品国产亚洲5555| 国产精品久久国产精品99gif| 大地资源网3页在线观看| 久久久久久婷| 国产精品观看在线亚洲人成网| h视频在线免费| 欧美日韩裸体免费视频| www.日本高清视频| 国产成人精品aa毛片| 久久99久久久久久| 国产亚洲一区| 97se亚洲综合| 多野结衣av一区| 欧美色爱综合网| 日韩精品成人一区| 久久五月婷婷丁香社区| 欧美 国产 小说 另类| 999久久久亚洲| 国产日韩欧美91| 中文在线8资源库| 中文字幕亚洲欧美日韩高清 | 狠狠色狠狠色综合| av在线播放亚洲| 成人在线免费观看91| 欧美在线激情视频| 久久久久久国产精品免费无遮挡| 免费看国产曰批40分钟| 日韩毛片免费观看| 欧美大片大片在线播放| 国产日本在线观看| 精品av综合导航| 69视频免费看| 精品国产成人在线| 先锋影音一区二区三区| 在线观看亚洲天堂| 国产精品丝袜黑色高跟| 亚洲精品无码久久久久久久| 日本午夜精品视频在线观看| 天天做天天爱天天高潮| 国产亚洲电影| 亚洲精品免费网站| 免费成人美女女| 蜜臀久久99精品久久久无需会员| 国产福利小视频在线| 亚洲高清一区二| 国产 日韩 欧美 综合| 91精品国产黑色紧身裤美女| 欧产日产国产69| 一区二区三区波多野结衣在线观看| 在线观看国产中文字幕| 亚洲第一精品影视| 经典三级在线视频| 国产黄大片在线观看画质优化| 337p日本欧洲亚洲大胆色噜噜| 亚洲专区在线播放| 亚洲一区中文在线| 久久久久久久久久久久久女过产乱| 久久久久久久久99精品| 国产精品无码久久久久一区二区| 99久久婷婷国产精品综合| 波多野结衣国产精品| 国产一区在线观看视频| 亚洲精品国产一区二区三区| 久久福利视频一区二区| 奇米视频888| 六月婷婷色综合| 国产一级片自拍| 深夜视频一区二区| 无码av免费一区二区三区试看 | 2023国产精华国产精品| 成人免费自拍视频| 偷拍精品精品一区二区三区| 91wwwcom在线观看| 五月天婷婷在线视频| 色琪琪综合男人的天堂aⅴ视频| 性欧美18一19性猛交| 欧美一区二区三区啪啪| 日本熟女毛茸茸| 亚洲aaa精品| www.伊人久久| 五月综合激情网| 精品人妻一区二区色欲产成人| 日本韩国欧美在线| 国产亚洲第一页| 久久色.com| 国产免费人做人爱午夜视频| 美美哒免费高清在线观看视频一区二区 | 久久综合九色99| 欧美日韩精品一区二区视频| 这里只有精品66| 伊人久久大香线蕉av超碰演员| 日韩av一二三四区| 蜜臀久久久99精品久久久久久| 韩国一区二区在线播放| 成人v精品蜜桃久久一区| 日韩av在线看免费观看| 亚洲免费高清视频在线| 日韩欧美激情视频| 欧美伊人久久大香线蕉综合69| 99视频在线观看免费| 欧美电影精品一区二区| 你懂的视频在线| 久久国产天堂福利天堂| 一区二区三区短视频| 91免费国产网站| 精品中文一区| 国产一区二区三区播放| 免费一级欧美片在线播放| 99九九99九九九99九他书对| 97久久人人超碰| 男女性高潮免费网站| 欧美性xxxx极品hd欧美风情| 国产女人爽到高潮a毛片| 日韩精品在线免费观看视频| a级网站在线播放| 国产成人一区二区三区小说| 亚洲图色一区二区三区| 手机看片福利永久国产日韩| 亚洲成人中文| 免费看的av网站| 欧美国产激情二区三区| 五月天综合在线| 在线播放亚洲一区| 欧美女同网站| 久久久久久久久中文字幕| 欧美美女被草| 日本10禁啪啪无遮挡免费一区二区 | 国产精品30p| 91精品国产入口| 91在线视频免费看| 日韩av第一页| 欧美电影在线观看免费| 国产日本欧美在线| 日本va欧美va精品发布| 国产精品jizz| 性感美女久久精品| 性中国古装videossex| 精品国产依人香蕉在线精品| 中文另类视频| 日韩精品福利视频| 亚洲欧美视频| 亚洲第九十七页| 亚洲电影一区二区| 黄色av免费观看| 欧美激情欧美狂野欧美精品| 国产电影一区二区| 永久免费精品视频网站| 日韩精品91亚洲二区在线观看 | 亚洲天堂av老司机| 中文字幕在线2019| 亚洲视频一区二区| 大胆人体一区二区| 欧美18视频| 性欧美精品高清| 91成年人网站| 在线视频观看一区| 成人亚洲综合天堂| 国产a级全部精品| 狠狠做六月爱婷婷综合aⅴ | 亚洲一区二区三区色| 蜜臀av性久久久久蜜臀aⅴ四虎| 免费看污片的网站| 欧美性猛交xxxx黑人交 | 免费av一区二区| 99re8这里有精品热视频8在线 | 亚洲一区图片| 精品国产av无码| 欧美羞羞免费网站| 色久视频在线播放| 国产成人涩涩涩视频在线观看| 少妇精品久久久一区二区| jizzjizz国产精品喷水| 久久久久久麻豆| 在线观看一二三区| 久久综合伊人77777蜜臀| 欧美黄色一级| 国产无限制自拍| 久久九九99视频| 一级视频在线播放| 草民午夜欧美限制a级福利片| 亚洲综合影院| 无码人妻丰满熟妇区96| 中文字幕免费观看一区| 国产婷婷一区二区三区久久| 久久久久北条麻妃免费看| 天堂久久av| 欧美 日韩精品| 亚洲婷婷综合色高清在线| 黄频网站在线观看| 国产成人一区二区| 午夜欧美视频| 国产黄片一区二区三区| 这里只有精品免费| аⅴ资源天堂资源库在线| 欧洲精品亚洲精品| 国产一区二区福利视频| 欧美一二三区视频| 日韩一区av在线| 国产91精品入| 免费在线观看毛片网站| 亚洲人成人一区二区在线观看| 天堂av手机版| 国产自摸综合网| 伊人久久大香线蕉综合热线 | 在线免费看污网站| 五月婷婷色综合| 蜜桃视频网站在线|