精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

欧美日韩伦理| 91最新在线免费观看| 精品国产免费人成电影在线观...| 人妻丰满熟妇av无码久久洗澡| 啪啪小视频网站| 视频一区日韩| 国产精品久久久久影院色老大| 91精品国产色综合| 91超薄肉色丝袜交足高跟凉鞋| 色影院视频在线| 免费电影一区二区三区| 艳妇臀荡乳欲伦亚洲一区| 国产精品久久久久久久久久小说| 精品人妻一区二区三区日产| 影院在线观看全集免费观看| 久久99久久99精品免视看婷婷| 亚洲男人天堂网| 日本wwww视频| 亚洲区小说区图片区| 亚洲视频狠狠| 亚洲国产精品yw在线观看| 日韩中文在线字幕| 国产免费av观看| 亚洲h色精品| 欧美顶级少妇做爰| 中文字幕日韩一区二区三区| 中文字幕在线播放日韩| 色欧美自拍视频| 欧美日韩免费视频| 一区二区三区四区久久| 国产美女无遮挡永久免费| 亚洲免费影视| 原创国产精品91| 五月婷婷丁香综合网| 亚洲xxxxxx| 久久久久综合网| 日本精品在线视频| 国产1区2区在线观看| 78精品国产综合久久香蕉| 国产精品久久国产精麻豆99网站| 国产精品亚洲网站| 欧美日韩综合一区二区| 成人av影音| 色欲综合视频天天天| 亚洲欧美日韩不卡一区二区三区| 亚洲影视一区二区| 国产精品v欧美精品v日本精品动漫| 一夜七次郎国产精品亚洲| 欧美亚一区二区三区| 日韩久久一区二区三区| 亚洲色图清纯唯美| 国产精品露出视频| 欧美一区三区四区| 国产欧美日韩综合精品| 免费中文字幕日韩| 人妻与黑人一区二区三区| 亚洲天堂免费| 亚洲精品美女久久 | 欧美日韩伦理| 亚洲色图偷窥自拍| 久久久久久久久久久久久久久国产| 国产日产一区二区三区| 成人一区在线观看| 国产成人综合av| 高h视频免费观看| 亚洲精品在线观看91| 久久久精品影院| 久久无码人妻精品一区二区三区 | 亚洲成人999| 亚洲av成人无码一二三在线观看| 日韩视频网站在线观看| 在线观看91视频| www.-级毛片线天内射视视| 少妇高潮久久久| 美国三级日本三级久久99| 欧美伦理91i| 超碰人人干人人| 加勒比久久高清| 91精品国产日韩91久久久久久| 中文字幕一区二区在线观看视频| 中文字幕在线视频久| 亚洲视频中文字幕| 日韩精品一区二区三区四| 不卡在线视频| 久久婷婷成人综合色| 91蜜桃网站免费观看| 中文字幕观看视频| 国产一区二区久久| 国产精品久久久久福利| 亚洲视频免费播放| 亚洲欧美一区在线| 色偷偷av一区二区三区| xxxxx在线观看| 一本色道久久综合狠狠躁的番外| 精品久久一区二区| 色姑娘综合天天| 日韩免费在线电影| 色先锋资源久久综合| 看看黄色一级片| 精品亚洲精品| 久久精品视频播放| aaa人片在线| 亚洲激情网站| 久久免费视频在线观看| 免费一级a毛片夜夜看| 亚洲午夜精品一区 二区 三区| 久久国产精品首页| 在线看的片片片免费| 亚洲欧洲日本mm| 成人写真视频福利网| 中文字幕在线播放av| 丁香婷婷综合激情五月色| 日本一区二区三区免费看| 色播色播色播色播色播在线 | 欧美日韩人妻精品一区在线| 亚洲精品第一| 日韩精品极品在线观看| 天天色天天综合| 亚洲成人一区| 国产成人综合av| av女名字大全列表| 伊人一区二区三区| 福利在线一区二区| 国内欧美日韩| 91精品国产综合久久久久| 中文字幕在线免费看线人| 自拍视频亚洲| 国产欧美精品在线| 国产精品久久久久一区二区国产 | 免看一级a毛片一片成人不卡| 日本欧美一区二区三区乱码| 国产精品成人免费电影| 人妻无码中文字幕免费视频蜜桃| 亚洲欧美另类图片小说| 亚洲一区二区三区乱码| 国产黄a三级三级三级av在线看 | 亚洲免费伊人电影在线观看av| 精品欧美一区二区久久久久| 精品一区二区三区香蕉蜜桃 | 国产理论电影在线| 午夜精品在线视频一区| 精品久久一二三| 成人影院av| 欧美老女人第四色| 九九九视频在线观看| 香蕉久久夜色精品| 久久久久天天天天| 国产九九在线| 91福利国产成人精品照片| 日韩av卡一卡二| 日韩中文字幕视频网| 久久天天躁狠狠躁夜夜躁2014| 加勒比av在线播放| 国产成人亚洲精品青草天美 | 91久久久精品国产| 欧美日韩成人在线视频| 精品国产伦一区二区三| 久久在线观看免费| 欧美日韩在线中文| 精品高清在线| 国产日韩在线一区| 国产福利在线播放麻豆| 日韩精品在线网站| x88av在线| 男女男精品网站| 国产精品v欧美精品v日韩精品| www.亚洲资源| 欧美日本韩国一区二区三区视频| 小早川怜子一区二区的演员表| 精品一区二区在线看| 国产精品av免费观看| 最新日韩三级| 精品福利二区三区| 艳妇荡乳欲伦69影片| 国产一区二区成人久久免费影院| 99热这里只有精品免费| 日韩欧美天堂| 欧美激情啊啊啊| 国产精品无码粉嫩小泬| 国产精品久久久久久久第一福利| 伊人五月天婷婷| 亚洲国产91| 91精品久久久久| 中文字幕伦理免费在线视频 | 日韩欧美综合视频| 视频在线在亚洲| 黑人巨大精品欧美一区二区小视频 | 91原创在线视频| 亚洲色图都市激情| 精品自拍偷拍| 国产精品久久视频| 青草视频在线免费直播 | blacked蜜桃精品一区| 91免费人成网站在线观看18| 九色在线观看视频| 午夜精品一区二区三区免费视频 | 欧亚精品中文字幕| 亚洲国产精品视频在线| 国产精品福利av| 挪威xxxx性hd极品| 精品亚洲成a人在线观看| 视频一区亚洲| 国产综合色区在线观看| 美女精品久久久| 毛片网站在线| 日本福利一区二区| 欧美成人三级在线观看| 久久久久久久av麻豆果冻| 无人码人妻一区二区三区免费| 性娇小13――14欧美| 在线观看17c| 欧美日韩中文一区二区| 国产欧美综合精品一区二区| gogo久久| 亚洲奶大毛多的老太婆| 亚洲av无码乱码在线观看性色| 日本韩国欧美国产| 99热国产在线观看| 亚洲精品免费电影| 欧美成人久久久免费播放| 老司机一区二区| 日韩网址在线观看| 欧美男同视频网| 国产精品国模大尺度私拍| www999久久| 欧美高跟鞋交xxxxxhd| 男人资源在线播放| 日韩视频永久免费| 日韩精品一卡二卡| 久久久国产精品午夜一区ai换脸| 国产在线a视频| 亚洲每日更新| 91.com在线| 亚洲影视一区| 日本成人性视频| 999国产精品视频| 不卡视频一区二区| 一区二区三区四区日本视频| 欧美极品少妇与黑人| 你懂的在线播放| 日韩高清人体午夜| 色婷婷av一区二区三区之e本道| 日韩亚洲国产中文字幕欧美| av中文字幕观看| 精品日本美女福利在线观看| 久久午夜精品视频| 久久久亚洲综合| 免费看黄色的视频| 国产欧美久久久精品影院| 超碰91在线播放| 精品一区二区在线视频| 涩涩网站在线看| 国产一区二区伦理| 秋霞午夜鲁丝一区二区| 国产成人综合在线播放| 色偷偷中文字幕| 国产成人一区在线| 国产精品久久无码| 91丨porny丨在线| av在线网址导航| 亚洲欧洲一级| 日本精品免费在线观看| 久久尤物视频| 中文字幕av不卡在线| 国产美女视频一区| 久草免费资源站| 9l国产精品久久久久麻豆| 色一情一区二区| 国产精品亚洲一区二区三区妖精| 成人亚洲视频在线观看| 韩国欧美一区| 日韩av综合在线观看| 欧美国产先锋| 每日在线观看av| 天天综合精品| 国产传媒久久久| 黄色网址在线免费看| 欧美日本一区二区视频在线观看| 视频一区视频二区视频三区高| 欧美激情电影| 日本阿v视频在线观看| 久久久久国产| 成年人网站国产| 三级一区在线视频先锋| 欧美国产在线一区| 久久久久国产精品麻豆| 婷婷激情四射网| 五月激情综合色| 国产一二三四在线| 亚洲欧美一区二区三区极速播放 | 成人网中文字幕| 欧美电影完整版在线观看| 亚洲xxxx3d| 日韩高清三区| 国产一区一区三区| 亚洲欧美视频| 五月六月丁香婷婷| 国产日韩欧美不卡在线| 中文幕无线码中文字蜜桃| jiyouzz国产精品久久| 奇米网一区二区| 精品久久久国产精品999| 国产又粗又黄又爽的视频| 欧美日韩国产天堂| 婷婷五月综合久久中文字幕| www.亚洲免费视频| 日本中文字幕在线观看| 97视频在线观看网址| 波多野结衣在线播放| 国产精品久久久久免费a∨大胸| 电影一区二区在线观看| 91国产丝袜在线放| 欧美系列电影免费观看| 亚洲一区3d动漫同人无遮挡 | 亚洲综合久久av| 国产一区二区女内射| 亚洲香蕉av在线一区二区三区| 免费观看成年在线视频网站| 九九热这里只有精品6| 成人国产精品| 欧美色欧美亚洲另类七区| av在线不卡顿| 欧美日韩二三区| jlzzjlzz国产精品久久| 久久久久久久中文字幕| 91精品国产综合久久福利| 国产大学生校花援交在线播放 | 99精品1区2区| www.av视频在线观看| 精品国产乱码久久久久久虫虫漫画 | 青青草原国产在线| 亚洲一区二区免费| 天天揉久久久久亚洲精品| 国产免费又粗又猛又爽| 国产色综合久久| 久久久精品毛片| 69久久夜色精品国产69蝌蚪网| www.日韩高清| 欧美成人一区在线| 久久久91麻豆精品国产一区| 国产精品日韩欧美一区二区三区 | 欧美影院天天5g天天爽| 精品无码国产一区二区三区av| 国产电影一区二区三区| 久久久久久久福利| 精品国产一区二区三区久久久蜜月 | 午夜剧场在线免费观看| 国产精品婷婷午夜在线观看| 国产又黄又爽又无遮挡| 日韩欧美的一区| 第一av在线| 精品欧美一区二区三区久久久| 99精品国产在热久久婷婷| 国模私拍视频在线观看| 国产精品伦理一区二区| 一本色道久久综合熟妇| 久久人人爽亚洲精品天堂| 精品一区二区三区四区五区 | 模特精品在线| 肉色超薄丝袜脚交| 亚洲精选视频免费看| 丰满人妻熟女aⅴ一区| 国产一区二区三区四区福利| 成人mm视频在线观看| 国产精品美女诱惑| 一本色道久久精品| av黄色免费网站| 欧美日韩国产综合久久| 91麻豆免费在线视频| 国产一区二区三区色淫影院 | 一区二区三区 在线观看视频| 亚洲精品国产av| 136fldh精品导航福利| 国产一区二区三区四区五区传媒 | 日本黄区免费视频观看| 91精品国产日韩91久久久久久| f2c人成在线观看免费视频| 欧美日韩一区二区视频在线| 久久成人久久鬼色| 久久精品免费在线| 国产一区二区黑人欧美xxxx| 999精品视频在线观看| 日本a视频在线观看| 中文字幕欧美激情一区| hs视频在线观看| 日本成熟性欧美| 天天影视天天精品| 欧美做受喷浆在线观看| 欧美一区二视频| 松下纱荣子在线观看| 成年人黄色在线观看| 99久久99久久精品免费观看| 一本一道精品欧美中文字幕| 久久久久久久999| 成人免费在线观看av| 秘密基地免费观看完整版中文| 色综合久久六月婷婷中文字幕| 黄色动漫在线观看| 欧美乱偷一区二区三区在线| 国产剧情一区在线|