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

詳解 Spring Boot 自動配置原理和應用

開發 前端
我們詳細闡述了 Spring Boot 自動配置機制的實現原理,從源碼角度分析了為什么 Spring Boot 能夠做到自動配置,并結合 MyBatis 框架分析了它在開源框架中的具體應用。

我們知道,基于 Spring Boot,開發人員只需要在類路徑中引入一組第三方框架的 starter 組件,就能在 Spring 容器中使用這些框架所提供的各項功能。這在當下的開發過程中已是常態,但在 Spring Boot 還沒有誕生之前卻是不可想象的。如果我們使用傳統的 Spring 框架,那就需要添加各種繁雜的配置信息才能啟動容器。那么,Spring Boot 是通過什么樣的機制來做到這一點的呢?這就是今天我們要討論的內容——Spring Boot 的自動配置機制。

可以說,Spring Boot 的自動配置機制應用非常廣泛。在目前主流的開源框架中,都提供了各自的 starter 組件。例如,MyBatis 的 starter 組件為 mybatis-spring-boot-starter。而從擴展性上講,這也是 Spring Boot 為開發人員提供的一整套擴展機制,我們可以基于這套擴展機制實現自定義的 starter 組件。

Spring Boot 自動配置機制原理

Spring Boot 的自動配置功能非常強大,但也有一定的復雜度,讓我們先來深入理解其背后的實現原理。

@EnableAutoConfiguration 注解

我們通過查看@SpringBootApplication 注解的定義,發現該注解實際上是一個復合注解,由@SpringBootConfiguration、@ComponentScan 和@EnableAutoConfiguration 這三個獨立注解所組成。

圖 1 @SpringBootApplication 注解的組成結構圖 1 @SpringBootApplication 注解的組成結構

我們知道@ComponentScan 是傳統 Spring 框架中對內置的注解,而@SpringBootConfiguration 注解也很簡單,實際上只是對 Spring 框架中另一個常用注解@Configuration 的一種包裝,本身沒有定義任何內容。所以,我們接下來重點剖析@EnableAutoConfiguration 注解。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
       String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
       Class<?>[] exclude() default {};
       String[] excludeName() default {};
}

可以看到,這里出現了一個新的注解,即@AutoConfigurationPackage。從命名上講, @AutoConfigurationPackage 注解的作用就是自動對某一個代碼包進行配置。

另一方面,我們還看到這里通過@Import 注解引入了一個 AutoConfigurationImportSelector 類。從命名上,我們也不難理解該類的作用是完成對導入的配置信息的自動選擇。AutoConfigurationImportSelector 類的核心方法 getCandidateConfigurations 實現了這一目標。

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
       List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader());
       …
       return configurations;
}

這里引出了在 Spring Boot 中真正負責加載配置信息的 SpringFactoriesLoader 類。這些類之間的交互關系如圖 2 所示:

圖 2 AutoConfigurationImportSelector 類層結構圖圖 2 AutoConfigurationImportSelector 類層結構圖

顯然,想要完成配置信息的自動選擇,我們首先需要執行配置文件的加載操作,這部分功能是由 SpringFactoriesLoader 來完成的。SpringFactoriesLoader 也是 Spring Boot 自動配置得以實現的關鍵組件,我們來一起看一下。

SpringFactoriesLoader

SpringFactoriesLoader 類似 JDK 實現 SPI 機制時所使用的 ServiceLoader 類,區別只是配置文件的存放位置和配置項對應的鍵值定義不同。在 SpringFactoriesLoader 中,我們需要通過 META-INF/spring.factories 文件目錄,來獲取服務定義文件,并通過 EnableAutoConfiguration 這個配置鍵來獲取具體的配置信息。圖 3 展示了 SpringFactoriesLoader 和 ServiceLoader 之間的區別。

圖 3 SpringFactoriesLoader 和 ServiceLoader 區別示意圖圖 3 SpringFactoriesLoader 和 ServiceLoader 區別示意圖

圖 3 SpringFactoriesLoader 和 ServiceLoader 區別示意圖

SpringFactoriesLoader 基于圖 3 指定的配置文件名和配置鍵獲取對應的配置信息,然后基于這些配置信息來實例化配置類,這里 Spring Boot 用到的是反射機制。SpringFactoriesLoader 類中的 loadSpringFactories 方法展示了這一過程。

private static Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader) {
       //從緩存中獲取配置內容,如果存在則直接返回
       try {
              //基于 ClassLoader 從 META-INF/spring.factories 獲取配置文件資源地址 URL
              while (urls.hasMoreElements()) {
                     //獲取配置文件資源,加載配置項
                     for (Map.Entry<?, ?> entry : properties.entrySet()) {
                     //組裝配置項 Key-Value
                     }
              }
              //把配置信息放入緩存
              //返回結果
       }
}

同時,我們在 spring-boot-autoconfigure 工程的 spring.factories 配置文件中找到了如下所示配置項。

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoCnotallow=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.MessageSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration,\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\
org.springframework.boot.autoconfigure.cloud.CloudAutoConfiguration,\
org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,\
…

可以看到,EnableAutoConfiguration 配置項中,定義了各種以-AutoConfiguration 結尾的配置類。通過 SpringFactoriesLoader,Spring Boot 就能做到在服務啟動的時候把它們加載到容器中并實現自動化配置。

MyBatis Spring Boot Starter

介紹完 Spring Boot 中應用程序的自動配置機制之后,我們來做一些實踐,通過剖析 MyBatis Spring Boot Starter 的啟動過程來加深對內容的理解。

在 mybatis-spring-boot-starter 中存在幾個代碼工程,我們重點關注 mybatis-spring-boot-autoconfigure 工程。而在這個代碼工程中,最重要的顯然就是 MybatisAutoConfiguration 類。對于 Spring Boot 中的 AutoConfiguration 類,我們首先需要重點關注的是類定義上的注解。

@org.springframework.context.annotation.Configuration
@ConditionalOnClass({ SqlSessionFactory.class, SqlSessionFactoryBean.class })
@ConditionalOnSingleCandidate(DataSource.class)
@EnableConfigurationProperties(MybatisProperties.class)
@AutoConfigureAfter(DataSourceAutoConfiguration.class)
public class MybatisAutoConfiguration implements InitializingBean {

我們看到這里用到了@ConditionalOnClass 和@ConditionalOnSingleCandidate 這兩個注解,它們就是 Spring Boot 中的條件注解。在介紹 MybatisAutoConfiguration 之前,有必要對這些注解做一定展開。

@ConditionalOn 系列條件注解

我們在前面的內容中已經了解到以-AutoConfiguration 結尾的自動配置類數量會很多,在一個應用程序的開發過程中,我們通常不會全部用到它們。這時候就需要引入一種機制來對這些自動配置類進行過濾。為此,Spring Boot 提供了一組@ConditionalOn 系列條件注解。通過這些注解,我們就可以基于特定的條件有選擇性地加載某些配置類。在 Spring Boot 中常見的條件注解可以參考圖 4。

圖 4 常見@ConditionalOn 系列注解及其作用圖 4 常見@ConditionalOn 系列注解及其作用

在前面介紹的 MybatisAutoConfiguration 類的時候,出現了@ConditionalOnClass 和@ConditionalOnSingleCandidate 這兩個條件注解?;谶@兩個條件注解,我們可以明確 MybatisAutoConfiguration 能夠實例化的前提有兩個:一是類路徑中存在 SqlSessionFactory 和 SqlSessionFactoryBean;另一個則是容器中只存在一個 DataSource 實例。兩者缺一不可,這是一種常用的自動配置控制技巧。

然后,我們在 MybatisAutoConfiguration 類上看到了一個@EnableConfigurationProperties 注解。通過這個注解,所有添加了@ConfigurationProperties 注解的配置類就會自動生效。這里的@EnableConfigurationProperties 注解中指定的是 MybatisProperties 類,該類定義了 MyBatis 運行時所需要的各種配置信息,而我們在 MybatisProperties 類上確實也發現了@ConfigurationProperties 注解,并設置了 prefix 為“mybatis”。

@ConfigurationProperties(
     prefix = "mybatis"
)
public class MybatisProperties {
       ...
}

最后,在 MybatisAutoConfiguration 類上還存在一個@AutoConfigureAfter 注解,這個注解可以根據字面意思進行理解,即在完成某一個類的自動配置之后再執行當前類的自動配置。這個需要提前裝配的類指的就是 DataSourceAutoConfiguration。

MybatisAutoConfiguration

理解了@ConditionalOnXXX、@EnableConfigurationProperties 和@AutoConfigureAfter 等一系列注解之后,我們回過頭來再看 MybatisAutoConfiguration 類的代碼結構就顯得比較簡單了。MybatisAutoConfiguration 類中的一個核心方法就是如下所示的 sqlSessionFactory 方法。

@Bean
@ConditionalOnMissingBean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
    SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
    factory.setDataSource(dataSource);
    factory.setVfs(SpringBootVFS.class);
    if (StringUtils.hasText(this.properties.getConfigLocation())) {
      factory.setConfigLocation(this.resourceLoader.getResource(this.properties.getConfigLocation()));
    }
    applyConfiguration(factory);
    //省略一系列配置項設置方法
    return factory.getObject();
}

顯然,這里基于前面介紹的 SqlSessionFactoryBean 構建了 SqlSessionFactory 實例。注意到在該方法上同樣添加了一個@ConditionalOnMissingBean 注解,標明只有在當前上下文中不存在 SqlSessionFactoryBean 對象時才會執行上述方法。

同樣,添加了@ConditionalOnMissingBean 注解的,還有如下所示的 sqlSessionTemplate 方法。

@Bean
@ConditionalOnMissingBean
public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
    ExecutorType executorType = this.properties.getExecutorType();
    if (executorType != null) {
      return new SqlSessionTemplate(sqlSessionFactory, executorType);
    } else {
      return new SqlSessionTemplate(sqlSessionFactory);
    }
}

該方法用于構建一個 SqlSessionTemplate 對象實例。在 MyBatis 中,SqlSessionTemplate 實現了 SqlSession 接口,相當于是全局唯一的 SqlSession 實例。

接下來,我們需要在 META-INF/spring.factories 文件中明確所指定的自動配置類。根據 Spring Boot 自動配置機制的原理,對于 mybatis-spring-boot-autoconfigure 工程而言,這個配置項內容應該如下所示。

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoCnotallow=\
org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration

至此,整個 MyBatis Spring Boot Starter 的介紹就告一段落。作為總結,我們可以把創建一個 Spring Boot Starter 的過程抽象成三個步驟。

圖 5 創建 Spring Boot Starter 的三個步驟圖 5 創建 Spring Boot Starter 的三個步驟

在日常開發過程中,我們就可以基于這三大步驟來實現一個自定義的 Spring Boot Starter。

總結

今天,我們詳細闡述了 Spring Boot 自動配置機制的實現原理,從源碼角度分析了為什么 Spring Boot 能夠做到自動配置,并結合 MyBatis 框架分析了它在開源框架中的具體應用。同時,我們在本講結尾部分還總結了開發一個 Spring Boot Starter 的三大步驟。實現一個自定義 Spring Boot Starter 也是日常開發的常見需求,我們在開發過程中可以基于本講的內容加深對其實現原理的理解。

最后,我想給你留一道思考題:你能簡要描述實現一個自定義 Spring Boot Starter 需要哪些開發步驟嗎?

責任編輯:武曉燕 來源: 程序猿技術充電站
相關推薦

2023-10-18 08:12:34

Spring自動配置

2024-12-25 16:01:01

2021-08-06 08:04:14

Spring Boot自動配置

2017-03-23 09:29:06

2021-02-11 08:08:09

Spring Boot配置架構

2025-07-08 07:15:00

Spring配置多種方式

2025-03-25 10:00:00

Spring開發Java

2024-01-04 08:16:34

Spring國際化標準

2017-04-26 11:00:34

Spring BootHelloWorld詳解

2023-12-27 18:05:13

2024-04-23 14:13:38

開發配置文件

2024-12-16 08:10:00

Spring開發

2019-09-03 15:36:58

ApacheTomcat配置

2020-07-08 13:46:27

ApacheTomcat配置

2025-02-28 08:14:53

2017-09-20 09:46:38

Spring BootSpring Clou內存

2025-05-29 05:59:56

2020-11-02 07:00:29

Spring Boo注解自動化

2024-10-14 17:18:27

2024-11-21 14:42:31

點贊
收藏

51CTO技術棧公眾號

538精品在线观看| 中文字幕中文在线| 久久精品国产亚洲a∨麻豆| 久久男女视频| 久久精品这里热有精品| wwwxxx色| 日韩欧美精品电影| 亚洲一区二区三区美女| 日韩伦理一区二区三区av在线| 国产精品女人久久久| 99av国产精品欲麻豆| 中文字幕日本精品| 中国一级特黄录像播放| 六九午夜精品视频| 亚洲va欧美va天堂v国产综合| 天堂√在线观看一区二区| 国产日韩欧美一区二区东京热| 中文在线一区| 久久91超碰青草是什么| 免费看日本黄色片| 免费日韩一区二区三区| 91精品婷婷国产综合久久性色| 日日碰狠狠添天天爽超碰97| a级影片在线| 欧美韩国日本综合| 久久久久久久久一区二区| 国产探花精品一区二区| 日韩av中文在线观看| 69精品小视频| 免费网站看av| 国产精品久久久久久久免费观看| 亚洲精品中文字| 色悠悠在线视频| 二区三区精品| 欧美日韩国产一级| 日韩视频免费在线播放| 欧亚av在线| 亚洲不卡在线观看| 成人在线视频一区二区三区| av网站免费在线观看| 国产精品国产三级国产普通话99| 欧美亚洲免费在线| 五月天婷婷在线播放| 国产一本一道久久香蕉| 91精品国产综合久久久久久久久| 波多野结衣日韩| 久久亚洲电影| 国产成人精品在线播放| 毛片在线免费视频| 国产精品久久久久久久久久妞妞| 国语自产精品视频在线看一大j8| 青娱乐国产在线视频| 亚洲成人免费| 欧美成人中文字幕在线| 国产精品白嫩白嫩大学美女| 天天做天天爱天天综合网| 日韩在线视频一区| 5566中文字幕| 亚洲成人精品| 欧美刺激性大交免费视频| 全程偷拍露脸中年夫妇| 欧美激情视频一区二区三区在线播放| 日韩一区二区三区国产| 91视频免费在观看| 婷婷综合社区| 久久99视频精品| 日韩网红少妇无码视频香港| 99在线观看免费视频精品观看| 97色在线观看| 秋霞精品一区二区三区| 日韩国产一区二| 国产精品羞羞答答| 国产精品一区二区免费视频| 国产精品一区三区| 国产欧美一区二区三区另类精品| 天堂在线观看av| 国产欧美一区二区三区在线老狼| 亚洲三区四区| 欧美xxxx性xxxxx高清| 精品欧美aⅴ在线网站| 日韩在线xxx| 一区在线不卡| 亚洲大胆美女视频| 受虐m奴xxx在线观看| 97色伦图片97综合影院| 欧美激情aaaa| 一级黄色在线观看| 国产精品18久久久久久久久| 国产在线欧美日韩| 香蕉视频在线看| 一区二区理论电影在线观看| 成人在线观看a| 久久综合给合| 亚洲欧洲日产国产网站| 久久精品一区二区三区四区五区 | 成人片免费看| 欧美色视频在线观看| 日本少妇xxxx软件| 国产一区二区三区四区五区传媒| 久久国产精品久久久久久久久久| www成人在线| 黄色精品一二区| 欧美日韩免费观看一区| 亚洲男同gay网站| 91国产免费看| 日韩无码精品一区二区| 天天做天天爱天天爽综合网| 欧美在线视频播放| 精品国产999久久久免费| 国产性色一区二区| 欧洲精品一区二区三区久久| 精品无人乱码一区二区三区| 亚洲第一福利视频| 91人妻一区二区三区蜜臀| 久久一区国产| 精品视频一区二区三区四区| av免费在线观看网址| 欧美亚洲国产怡红院影院| 国模私拍在线观看| 午夜国产精品视频免费体验区| 欧洲成人免费aa| 后进极品白嫩翘臀在线视频| 亚洲精品视频在线观看免费| 精品亚洲一区二区三区四区| 在线日韩一区| 美女视频免费一区| 欧美一区二区精品在线| 夫妇交换中文字幕| 欧美视频久久| 亚洲一区二区中文| 欧美三级黄网| 欧美性感一类影片在线播放| 亚洲熟女乱综合一区二区三区| 女同性一区二区三区人了人一| 国产精品香蕉国产| 成年人在线观看| 在线视频一区二区免费| 亚洲人成人无码网www国产| 9色精品在线| 国产伦精品一区二区三毛| 四虎影院观看视频在线观看| 在线不卡中文字幕播放| 黑人狂躁日本娇小| 久久9热精品视频| 亚洲一区高清| 日本欧美在线| 久久精品91久久香蕉加勒比 | 亚洲欧美日韩国产一区二区| 国产精品日韩高清| 高清电影在线免费观看| 亚洲成人网在线| 国产精品.www| 99久久国产综合色|国产精品| 国产欧美日韩小视频| 国偷自产av一区二区三区| 欧美精品成人在线| 天天操天天干天天舔| 精品国产精品自拍| 日本少妇高潮喷水xxxxxxx| 日韩中文字幕亚洲一区二区va在线| 欧美精品人人做人人爱视频| 91精品韩国| 久久精品精品电影网| 99久久精品无免国产免费| 一区二区三区中文免费| 成熟妇人a片免费看网站| 日韩视频一区| 先锋影音日韩| 91麻豆精品国产综合久久久| 九九热在线精品视频| 蜜臀久久久久久999| 色综合久久久久综合| 日本少妇xxxxx| 国内成人自拍视频| 欧美一级欧美一级| 加勒比久久综合| 成人免费观看网址| 24小时免费看片在线观看| 亚洲精品天天看| 91丨九色丨海角社区| 亚洲欧美日韩一区二区三区在线观看| 精品无码av一区二区三区| 国产欧美激情| 伊人狠狠色丁香综合尤物| 天堂av一区| 国产91在线高潮白浆在线观看| 五月婷婷在线观看| 亚洲电影在线看| 最新在线中文字幕| 一区二区三区在线不卡| 色呦呦一区二区| 精品一区二区三区在线播放视频 | 天堂av中文在线观看| 在线观看国产精品日韩av| 精品欧美一区二区精品少妇| 日韩欧美999| 成人免费视频国产免费观看| 高清久久久久久| 精品少妇无遮挡毛片| 国产精品videosex极品| 日本一区二区久久精品| 在线综合色站| 国产免费亚洲高清| 日韩伦理精品| 欧美日韩成人黄色| 成人影院免费观看| 日韩激情视频在线| 99久久国产热无码精品免费| 福利精品视频在线| 久久免费视频播放| 国产精品久久久久9999吃药| 国产精品亚洲无码| 国产69精品久久久久毛片 | 国产成人亚洲精品青草天美| 亚洲精品中文字幕无码蜜桃| 亚洲高清二区| 激情五月五月婷婷| 久久一本综合| 色一情一乱一伦一区二区三区丨| 美国成人xxx| 成人免费视频网站入口| 在线观看欧美| 国产精品女人久久久久久| 波多野结依一区| 欧美老女人性生活| 日本欧美在线视频免费观看| 亚洲香蕉成视频在线观看| 黄色成人一级片| 欧美成人乱码一区二区三区| 国产精品天天操| 欧美美女喷水视频| 中文字幕+乱码+中文乱码www | 777米奇影视第四色| 伊人久久婷婷| 欧美一区二区激情| 欧美精品aa| bt天堂新版中文在线地址| 中文字幕一区二区av| 99re99热| 亚洲一区二区日韩| 在线视频不卡国产| 久久精品亚洲人成影院| 一区精品在线| 综合激情婷婷| 天堂8在线天堂资源bt| 欧美啪啪一区| 久久国产精品网| 亚洲精品国产日韩| 免费成人午夜视频| 母乳一区在线观看| 国产成人无码一二三区视频| 裸体素人女欧美日韩| 日本黄网站免费| 捆绑调教一区二区三区| 黄色小视频免费网站| 国精产品一区一区三区mba桃花| 国产5g成人5g天天爽| 国产乱码精品1区2区3区| 人妻体体内射精一区二区| 国产高清成人在线| 精品国产av色一区二区深夜久久 | 国产精品一区二区亚洲| 国产精品视频一二三| 日韩在线不卡av| 亚洲最新视频在线观看| 91精品国产高潮对白| 黄色成人av在线| 国产一卡二卡三卡| 69精品人人人人| 亚洲av永久无码国产精品久久 | 成人资源www网在线最新版| 国产亚洲精品久久久久久牛牛| 91社区在线| 久久综合久久八八| av剧情在线观看| 国产精品igao视频| 精品国产鲁一鲁****| 精品日本一区二区| 成人综合一区| 日韩专区第三页| 亚洲欧美日韩精品一区二区| 久久撸在线视频| 国产a久久麻豆| 国产黄片一区二区三区| 亚洲少妇屁股交4| 欧美在线观看不卡| 欧美一二三四在线| 欧美老女人性开放| 久久综合久中文字幕青草| 亚洲女色av| 114国产精品久久免费观看| 欧美日韩另类图片| 黄频视频在线观看| 噜噜噜久久亚洲精品国产品小说| 日本中文字幕观看| 91麻豆123| 麻豆精品一区二区三区视频| 一本色道综合亚洲| 亚洲国产精品久久久久久久| 亚洲天堂影视av| 国产污视频在线播放| 91精品国产综合久久香蕉的用户体验| 欧美日韩看看2015永久免费 | fc2ppv国产精品久久| 欧美亚洲另类制服自拍| 精品国产伦一区二区三区观看说明| 欧美色图亚洲自拍| 国产精品多人| 亚洲美女性囗交| 国产午夜精品久久久久久久| 日产精品久久久久| 日韩一区二区在线观看视频| 国产三级电影在线| 97超级碰在线看视频免费在线看 | а√天堂8资源中文在线| 成人精品一区二区三区电影黑人| 天天躁日日躁狠狠躁欧美| 成人在线视频一区二区三区| 精品一区二区综合| 你懂得视频在线观看| 日韩欧美国产中文字幕| 欧美视频一二区| 色综合男人天堂| 国产午夜亚洲精品一级在线| 手机在线观看国产精品| 久久精品人人做人人爽电影蜜月| 日本一区二区在线免费观看| 亚洲男人的天堂在线aⅴ视频| 伊人成人在线观看| 永久免费看mv网站入口亚洲| 欧美三级网址| 蜜桃av噜噜一区二区三| 99伊人成综合| 自拍视频一区二区| 午夜精品成人在线视频| 刘亦菲久久免费一区二区| 九色精品免费永久在线| 欧美黄色一级| 成人在线视频一区二区三区| 国产精品影音先锋| 九九热精品免费视频| 日韩亚洲欧美高清| 青青青国内视频在线观看软件| 亚洲一区二区三区777| 一区二区蜜桃| 一级片免费在线观看视频| 亚洲精品va在线观看| av在线资源观看| 欧美极度另类性三渗透| caoporn成人| 欧美日韩黄色一级片| 久久免费电影网| 狠狠躁夜夜躁人人爽视频| 一区二区三区四区视频| 成人黄色视屏网站| 91香蕉视频网址| 国产精品亚洲第一区在线暖暖韩国| 欧美精品成人久久| 亚洲国产另类 国产精品国产免费| brazzers在线观看| 日本高清久久一区二区三区| 日韩不卡一二三区| 成年人午夜剧场| 亚洲精品一区二区精华| 午夜欧美激情| 亚洲欧美在线网| 国产精品一区三区| 成年人免费看毛片| 亚洲天堂av在线免费观看| 成人国产精品| 蜜臀av性久久久久蜜臀av| fc2成人免费人成在线观看播放 | 欧美xxxbbb| 久久99久久99精品蜜柚传媒| 久久精品午夜| frxxee中国xxx麻豆hd| 欧美精品一区二区蜜臀亚洲| 欧美裸体视频| 亚洲第一页在线视频| 不卡的看片网站| 久久久久久久久久一级| 欧美大奶子在线| 亚洲va久久久噜噜噜久久| 久久国产激情视频| 亚洲成人你懂的| avtt在线播放| 国产精品一区二| 美女一区二区视频| 久久久久无码国产精品| 国产亚洲精品高潮| 91精品尤物| 黄色在线视频网| 午夜久久久久久| 麻豆传媒在线免费看| 久久精品国产99精品国产亚洲性色| 久久精品久久99精品久久| 在线观看亚洲欧美| 欧美伦理91i| 成人在线免费观看网站| 亚洲 欧美 日韩在线|