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

Spring Boot 啟動注解分析

開發 項目管理
個人感覺應該是比較少的,Spring Boot 本質上還是曾經 SSM 那一套,只是通過各種 starter 簡化了配置而已,其他都是一模一樣的,所以 Spring Boot 中很多面試題還是得回歸到 Spring 中去解答!當然這并不是說 Spring Boot 中沒什么可問的,Spring Boot 中其實也有一個非常經典的面試題,那就是 Spring Boot 中的自動化配置是怎么實現的?

雖然我們在日常開發中,Spring Boot 使用非常多,算是目前 Java 開發領域一個標配了,但是小伙伴們仔細想想自己的面試經歷,和 Spring Boot 相關的面試題都有哪些?個人感覺應該是比較少的,Spring Boot 本質上還是曾經 SSM 那一套,只是通過各種 starter 簡化了配置而已,其他都是一模一樣的,所以 Spring Boot 中很多面試題還是得回歸到 Spring 中去解答!當然這并不是說 Spring Boot 中沒什么可問的,Spring Boot 中其實也有一個非常經典的面試題,那就是 Spring Boot 中的自動化配置是怎么實現的?今天松哥就來和各位小伙伴聊一下這個問題。

其實松哥之前和小伙伴們聊過相關的問題,不過都是零散的,沒有系統梳理過,之前也帶領小伙伴們自定義過一個 starter,相信各位小伙伴對于 starter 的原理也有一定了解,所以今天這篇文章一些過于細節的內容我就不贅述了,大家可以翻看之前的文章。

1.  @SpringBootApplication

要說 Spring Boot 的自動化配置,那必須從項目的啟動類 @SpringBootApplication 說起,這是整個 Spring Boot 宇宙的起點,我們先來看下這個注解:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {

}

可以看到,@SpringBootApplication 注解組合了多個常見注解的功能,其中:

  • 前四個是元注解,這里我們不做討論。
  • 第五個 @SpringBootConfiguration 是一個支持配置類的注解,這里我們也不做討論。
  • 第六個 @EnableAutoConfiguration 這個注解就表示開啟自動化配置,這是我們今天要聊得重點。
  • 第七個 @ComponentScan 是一個包掃描注解,為什么 Spring Boot 項目中的 Bean 只要放對位置就會被自動掃描到,和這個注解有關。

別看這里注解多,其實真正由 Spring Boot 提供的注解一共就兩個,分別是 @SpringBootConfiguration 和 @EnableAutoConfiguration 兩個,其他注解在 Spring Boot 出現之前就已經存在多年了。

2. @EnableAutoConfiguration

接下來我們來看看 @EnableAutoConfiguration 是如何實現自動化配置的。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {

}

這個注解起關鍵作用的就是兩個東西:

  • @AutoConfigurationPackage:這個表示自動掃描各種第三方的注解,在之前的文章中松哥已經和大家聊過這個注解的作用了,傳送門:@AutoConfigurationPackage 和 @ComponentScan 有何區別?
  • @Import 則是在導入 AutoConfigurationImportSelector 配置類,這個配置類里邊就是去加載各種自動化配置類的。

3. AutoConfigurationImportSelector

AutoConfigurationImportSelector 類中的方法比較多,入口的地方則是 process 方法,所以我們這里就從 process 方法開始看起:

@Override
public void process(AnnotationMetadata annotationMetadata, DeferredImportSelector deferredImportSelector) {
 Assert.state(deferredImportSelector instanceof AutoConfigurationImportSelector,
   () -> String.format("Only %s implementations are supported, got %s",
     AutoConfigurationImportSelector.class.getSimpleName(),
     deferredImportSelector.getClass().getName()));
 AutoConfigurationEntry autoConfigurationEntry = ((AutoConfigurationImportSelector) deferredImportSelector)
  .getAutoConfigurationEntry(annotationMetadata);
 this.autoConfigurationEntries.add(autoConfigurationEntry);
 for (String importClassName : autoConfigurationEntry.getConfigurations()) {
  this.entries.putIfAbsent(importClassName, annotationMetadata);
 }
}

從類名就可以看出來,跟自動化配置相關的對象是由 AutoConfigurationEntry autoConfigurationEntry = ((AutoConfigurationImportSelector) deferredImportSelector).getAutoConfigurationEntry(annotationMetadata); 進行加載的。

當然這里的 getAutoConfigurationEntry 方法實際上就是當前類提供的方法,我們來看下該方法:

protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
 if (!isEnabled(annotationMetadata)) {
  return EMPTY_ENTRY;
 }
 AnnotationAttributes attributes = getAttributes(annotationMetadata);
 List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
 configurations = removeDuplicates(configurations);
 Set<String> exclusions = getExclusions(annotationMetadata, attributes);
 checkExcludedClasses(configurations, exclusions);
 configurations.removeAll(exclusions);
 configurations = getConfigurationClassFilter().filter(configurations);
 fireAutoConfigurationImportEvents(configurations, exclusions);
 return new AutoConfigurationEntry(configurations, exclusions);
}

這里源碼的方法命名都做的不錯,基本上都能做到見名知意,小伙伴們日常開發中,應該向這樣的命名思路看齊。接下來我們就來挨個看一下這里的關鍵方法。

3.1 isEnabled

首先調用 isEnabled 方法去判斷自動化配置到底有沒有開啟,這個主要是因為我們及時在項目中引入了 spring-boot-starter-xxx 之后,我們也可以通過在 application.properties 中配置 spring.boot.enableautoconfiguration=false 來關閉所有的自動化配置。

相關源碼如下:

protected boolean isEnabled(AnnotationMetadata metadata) {
 if (getClass() == AutoConfigurationImportSelector.class) {
  return getEnvironment().getProperty(EnableAutoConfiguration.ENABLED_OVERRIDE_PROPERTY, Boolean.class, true);
 }
 return true;
}

3.2 getCandidateConfigurations

接下來調用 getCandidateConfigurations 方法去獲取所有候選的自動化配置類,這些候選的自動化配置類主要來自兩個地方:

  • 在之前的自定義 starter 中松哥和大家聊過,我們需要在 claspath\:META-INF/spring.factories 中定義出來所有的自動化配置類,這是來源一。
  • Spring Boot 自帶的自動化配置類,這個在之前的 vhr 視頻中也和小伙伴們多次講過,Spring Boot 自帶的自動化配置類位于 spring-boot-autoconfigure-3.0.6.jar!\META-INF\spring\org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件中。

相關源碼如下:

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
 List<String> configurations = new ArrayList<>(
   SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader()));
 ImportCandidates.load(AutoConfiguration.class, getBeanClassLoader()).forEach(configurations::add);
 Assert.notEmpty(configurations,
   "No auto configuration classes found in META-INF/spring.factories nor in META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports. If you "
     + "are using a custom packaging, make sure that file is correct.");
 return configurations;
}

這里加載到的自動化配置類的全路徑被存入到 configurations 對象中,該對象有兩個獲取的地方:

  • 調用 SpringFactoriesLoader.loadFactoryNames 方法獲取,這個方法細節我就不帶大家看了,比較簡單,本質上就是去加載 META-INF/spring.factories 文件,這個文件中定義了大量的自動化配置類的全路徑。
  • 調用 ImportCandidates.load 方法去加載,這個就是加載 spring-boot-autoconfigure-3.0.6.jar!\META-INF\spring\org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件中的自動化配置類。

如果這兩個地方都沒有加載到任何自動化配置類,那么就會拋出一個異常。

3.3 removeDuplicates

removeDuplicates 方法表示移除候選自動化配置類中重復的類,移除的思路也很有意思,就用一個 LinkedHashSet 中轉一下就行了,源碼如下:

protected final <T> List<T> removeDuplicates(List<T> list) {
 return new ArrayList<>(new LinkedHashSet<>(list));
}

可以看到這些源碼里有時候一些解決思路也很有意思。

3.4 getExclusions

getExclusions 方法表示需要獲取到所有被排除的自動化配置類,這些被排除的自動化配置類可以從三個地方獲取:

  • 當前注解的 exclude 屬性。
  • 當前注解的 excludeName 屬性。
  • application.properties 配置文件中的 spring.autoconfigure.exclude 屬性。

來看一下相關源碼:

protected Set<String> getExclusions(AnnotationMetadata metadata, AnnotationAttributes attributes) {
 Set<String> excluded = new LinkedHashSet<>();
 excluded.addAll(asList(attributes, "exclude"));
 excluded.addAll(asList(attributes, "excludeName"));
 excluded.addAll(getExcludeAutoConfigurationsProperty());
 return excluded;
}

跟上面講解的三點剛好對應。

3.5 checkExcludedClasses

這個方法是檢查所有被排除的自動化配置類,由于 Spring Boot 中的自動化配置類可以自定義,并不需要統一實現某一個接口或者統一繼承某一個類,所以在寫排除類的時候,如果寫錯了編譯是校驗不出來的,像下面這種:

@SpringBootApplication(exclude = HelloController.class)
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
}

由于 HelloController 并不是一個自動化配置類,所以這樣寫項目啟動的時候就會報錯,如下:

圖片

這個異常從哪來的呢?其實就是來自 checkExcludedClasses 方法,我們來看下該方法:

private void checkExcludedClasses(List<String> configurations, Set<String> exclusions) {
 List<String> invalidExcludes = new ArrayList<>(exclusions.size());
 for (String exclusion : exclusions) {
  if (ClassUtils.isPresent(exclusion, getClass().getClassLoader()) && !configurations.contains(exclusion)) {
   invalidExcludes.add(exclusion);
  }
 }
 if (!invalidExcludes.isEmpty()) {
  handleInvalidExcludes(invalidExcludes);
 }
}
protected void handleInvalidExcludes(List<String> invalidExcludes) {
 StringBuilder message = new StringBuilder();
 for (String exclude : invalidExcludes) {
  message.append("\t- ").append(exclude).append(String.format("%n"));
 }
 throw new IllegalStateException(String.format(
   "The following classes could not be excluded because they are not auto-configuration classes:%n%s",
   message));
}

可以看到,在 checkExcludedClasses 方法中,會首先找到所有位于當前類路徑下但是卻不包含在 configurations 中的所有被排除的自動化配置類,由于 configurations 中的就是所有的自動化配置類了,所以這些不存在于 configurations 中的類都是有問題的,都不是自動化配置類,將這些有問題的類收集起來,存入到 invalidExcludes 變量中,然后再進行額外的處理。

所謂額外的處理就是在 handleInvalidExcludes 方法中拋出異常,前面截圖中的異常就是來自這里。

3.6 removeAll

這個方法就一個任務,就是從 configurations 中移除掉那些被排除的自動化配置類。configurations 本身就是 List 集合,exclusions 則是一個 Set 集合,所以這里直接移除即可。

3.7 filter

現在我們已經加載了所有的自動化配置類了,但是這些配置類并不是都會生效,具體是否生效,還要看你的項目是否使用了具體的依賴。

例如,現在加載的自動化配置里里邊就包含了 RedisAutoConfiguration,這個是自動配置 Redis 的,但是由于我的項目中并沒有使用 Redis,所以這個自動化配置類并不會生效。這個過程就是由 getConfigurationClassFilter().filter(configurations); 來完成的。

先說一個預備知識:

由于我們項目中的自動化配置類特別多,每一個自動化配置類都會依賴別的類,當別的類存在時,這個自動化配置類才會生效,這一堆互相之間的依賴關系,存在于 spring-boot-autoconfigure-3.0.6.jar!/META-INF/spring-autoconfigure-metadata.properties 文件之中,我隨便舉一個該文件中的配置:

  • org.springframework.boot.autoconfigure.amqp.RabbitAnnotationDrivenConfiguration.Cnotallow=org.springframework.amqp.rabbit.annotation.EnableRabbit 表示 RabbitAnnotationDrivenConfiguration 類要生效有一個必備條件就是當前項目類路徑下要存在 org.springframework.amqp.rabbit.annotation.EnableRabbit。

我們來看看 RabbitAnnotationDrivenConfiguration 類的注解:

@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(EnableRabbit.class)
class RabbitAnnotationDrivenConfiguration {
}

這個類和配置文件中的內容一致。

這個預備知識搞懂了,接下來的內容就好理解了。

先來看 getConfigurationClassFilter 方法,這個就是獲取所有的過濾器,如下:

private ConfigurationClassFilter getConfigurationClassFilter() {
 if (this.configurationClassFilter == null) {
  List<AutoConfigurationImportFilter> filters = getAutoConfigurationImportFilters();
  for (AutoConfigurationImportFilter filter : filters) {
   invokeAwareMethods(filter);
  }
  this.configurationClassFilter = new ConfigurationClassFilter(this.beanClassLoader, filters);
 }
 return this.configurationClassFilter;
}

可以看到,這里獲取到的過濾器都是 AutoConfigurationImportFilter 類型的,這個類型的過濾器只有三個實例,如下圖:

圖片

從這三個實例的名字中,基本上就能看出來各自的作用:

  • OnClassCondition:這個就是條件注解 @ConditionalOnClass 的判定條件,看名字就知道用來判斷當前 classpath 下是否存在某個類。
  • OnWebApplicationCondition:這個是條件注解 ConditionalOnWebApplication 的判定條件,用來判斷當前系統環境是否是一個 Web 環境。
  • OnBeanCondition:這個是條件注解 @ConditionalOnBean 的判定條件,就是判斷當前系統下是否存在某個 Bean。

這里獲取到的三個 AutoConfigurationImportFilter 過濾器其實就是上面這三個。接下來執行 filter 方法,如下:

List<String> filter(List<String> configurations) {
 long startTime = System.nanoTime();
 String[] candidates = StringUtils.toStringArray(configurations);
 boolean skipped = false;
 for (AutoConfigurationImportFilter filter : this.filters) {
  boolean[] match = filter.match(candidates, this.autoConfigurationMetadata);
  for (int i = 0; i < match.length; i++) {
   if (!match[i]) {
    candidates[i] = null;
    skipped = true;
   }
  }
 }
 if (!skipped) {
  return configurations;
 }
 List<String> result = new ArrayList<>(candidates.length);
 for (String candidate : candidates) {
  if (candidate != null) {
   result.add(candidate);
  }
 }
 return result;
}

這里就是遍歷這三個過濾器,然后分別調用各自的 match 方法和 144 個自動化配置類進行匹配,如果這些自動化配置類所需要的條件得到滿足,則 match 數組對應的位置就為 true,否則就為 false。

然后遍歷 match 數組,將不滿足條件的自動化配置類置為 null,最后再把這些 null 移除掉。

這樣就獲取到了我們需要進行自動化配置的類了。

最后一句 fireAutoConfigurationImportEvents 則是觸發自動化配置類導入事件,這個沒啥好說的~

當這些自動化配置類加載進來之后,接下來就是各種條件注解來決定這些配置類是否生效了,這些都比較簡單了,之前在 vhr 種也和小伙伴們講過多次了,這里就不再啰嗦了~

責任編輯:武曉燕 來源: 江南一點雨
相關推薦

2023-09-27 08:14:56

2017-08-02 14:44:06

Spring Boot開發注解

2025-06-19 09:53:30

Spring性能優化服務器

2024-12-16 08:10:00

Spring開發

2021-04-13 20:24:57

Spring Boot注解spring

2024-10-14 17:18:27

2017-03-06 15:43:33

Springboot啟動

2023-04-17 23:49:09

開發代碼Java

2020-03-31 15:03:56

Spring Boot代碼Java

2020-11-02 07:00:29

Spring Boo注解自動化

2023-01-10 07:52:15

2025-07-24 06:34:46

SpringBoot代碼開發

2017-05-12 15:47:15

Spring BootMybatis Ann Web

2025-04-08 02:22:22

SpringJackson注解

2025-01-14 17:00:00

SpringBoot開發代碼

2025-04-10 00:22:22

Spring@JsonView字段

2023-03-20 13:41:00

IoC容器Spring

2025-10-21 08:00:13

2025-07-14 02:00:00

2020-07-03 08:00:11

Spring BootSpring Clou流程
點贊
收藏

51CTO技術棧公眾號

麻豆av在线播放| 精品国产av一区二区三区| 最新亚洲精品| 欧美视频中文字幕| 亚洲区成人777777精品| 人妻无码中文字幕| 美女视频网站久久| 欧美精品国产精品日韩精品| 自拍偷拍视频亚洲| 97久久综合精品久久久综合| 一本色道**综合亚洲精品蜜桃冫 | 日韩精品午夜| 欧美精品一区二区三区蜜桃| 另类小说第一页| 操喷在线视频| 中文字幕在线不卡国产视频| 精品一卡二卡三卡四卡日本乱码 | 精品国产一区二区三区久久久蜜月 | 久草在线免费福利资源| 国产精品一区久久久久| 国产第一区电影| 日本一级淫片色费放| 天天综合精品| 伊人伊成久久人综合网小说| av av在线| 精品一级视频| 欧美日韩国产综合视频在线观看| 欧美日韩亚洲一| 婷婷丁香在线| 亚洲色图制服丝袜| 视频一区视频二区视频| 青青草超碰在线| 成人在线视频首页| 亚洲精品欧美日韩| 亚洲天堂免费av| 另类av一区二区| 97精品伊人久久久大香线蕉| 国产精品夜夜夜爽阿娇| 国产一区二区欧美| 日韩精品免费在线| 三级视频网站在线观看| 免费观看性欧美大片无片| 欧美日韩一级二级| 免费看污污网站| 欧美激情喷水| 一本到三区不卡视频| 成人毛片一区二区| 蜜桃在线视频| 欧美午夜宅男影院在线观看| 日韩日韩日韩日韩日韩| 91桃色在线观看| 亚洲一区二区三区美女| 国产a级黄色大片| 少妇视频在线| 一区二区国产视频| 成人免费视频91| 国内小视频在线看| 午夜欧美大尺度福利影院在线看| www.avtt| 黄色激情在线播放| 日韩欧美精品网址| 亚洲爆乳无码专区| 在线国产成人影院| 欧美久久免费观看| 亚洲综合激情视频| 精品99re| 欧美精品一区在线观看| 亚洲男人在线天堂| 国产精品中文字幕亚洲欧美| 中文字幕一区日韩电影| 乱h高h女3p含苞待放| 欧美视频网站| 欧美一区二区.| 正在播放亚洲精品| 激情丁香综合五月| 99热在线播放| 瑟瑟在线观看| 欧美国产欧美综合| 三级网在线观看| 韩国日本一区| 在线日韩av片| 久久久福利影院| 久久精品66| 亚洲午夜色婷婷在线| www欧美com| 一本色道精品久久一区二区三区 | 高清久久精品| 亚洲精品大尺度| 国产91丝袜美女在线播放| 久久久久电影| 91精品国产一区| 中文字幕免费在线看| 国产一区999| 欧美精品一区二区三区在线四季| jizz亚洲| 婷婷亚洲久悠悠色悠在线播放| 亚洲爆乳无码专区| 99亚洲乱人伦aⅴ精品| 亚洲欧洲一区二区三区在线观看 | 欧美日韩亚洲高清| 欧美特黄aaa| 日韩av中文字幕一区| 在线精品高清中文字幕| 久久免费视频播放| 美女精品自拍一二三四| 精品一区二区不卡| 99自拍视频在线观看| 色噜噜狠狠色综合欧洲selulu| 亚欧精品在线视频| 成人羞羞网站| 欧美中文在线免费| 国产av无码专区亚洲av| 久久久国产午夜精品| 国产精品三级一区二区| 国产成人免费| 亚洲欧美日韩图片| 国产精品日日夜夜| 国产毛片精品国产一区二区三区| 日韩精品在在线一区二区中文| 丝袜美女在线观看| 777欧美精品| 中文字幕免费在线看线人动作大片| 欧美天天在线| 国产一区二区在线免费视频| 可以直接在线观看的av| 亚洲第一福利视频在线| 亚洲成人手机在线观看| 久久香蕉国产| 国产精品久久久久久av福利| 日本大臀精品| 精品国产鲁一鲁一区二区张丽 | 日韩啪啪网站| 欧美激情区在线播放| av官网在线观看| 日韩毛片视频在线看| 亚洲男人天堂色| 亚洲美女久久| 欧美在线性视频| 色wwwwww| 午夜国产精品一区| 丝袜熟女一区二区三区 | 久久久久久久一| 国产夫妻自拍av| 一区二区三区日韩精品视频| 午夜福利123| 欧美福利电影在线观看| 91丝袜美腿美女视频网站| 黄色小网站在线观看| 欧美猛男超大videosgay| 一级在线观看视频| 美女mm1313爽爽久久久蜜臀| 黄瓜视频免费观看在线观看www| 欧美大陆国产| 久久久精品视频在线观看| 国产精品久久久久久久一区二区 | 91美女片黄在线| 亚洲自偷自拍熟女另类| 国产剧情一区| 国产精品看片资源| 午夜视频在线观看网站| 911精品国产一区二区在线| 久久人妻无码aⅴ毛片a片app| 久久99久久99小草精品免视看| 中文字幕色一区二区 | 另类欧美小说| 免费福利视频一区二区三区| 一道本无吗dⅴd在线播放一区| 国产三级理论片| 中文字幕在线一区| 极品人妻一区二区| 国产亚洲一区在线| 欧美一区二区综合| 99精品女人在线观看免费视频 | 亚洲免费在线观看av| 久久精品男人的天堂| 久久精品视频在线观看免费| 黄色国产精品| 日韩av影视| 精品亚洲二区| 欧美在线亚洲一区| 国产黄a三级三级三级av在线看| 欧美videossexotv100| 五月天婷婷久久| 综合欧美亚洲日本| 中国xxxx性xxxx产国| 奇米影视7777精品一区二区| 青青草综合在线| 欧美日一区二区| 99视频免费观看蜜桃视频| 伊人成综合网站| 久久视频国产精品免费视频在线| 秋霞av鲁丝片一区二区| 欧美色倩网站大全免费| 久草视频精品在线| 国产精品超碰97尤物18| a天堂视频在线观看| 久久精品国产99久久6| 97视频久久久| 91精品国产福利在线观看麻豆| 久久99精品国产99久久| 91精品国产一区二区在线观看| 97在线观看免费| 黄色网页网址在线免费| 亚洲精品一区二区久| 国产999久久久| 欧美性生活影院| 日本一级一片免费视频| 亚洲视频免费看| 阿v天堂2014| 91亚洲精品一区二区乱码| 午夜影院免费观看视频| 捆绑紧缚一区二区三区视频| 爱福利视频一区二区| 亚洲天堂男人| 在线视频一二三区| 欧美电影《睫毛膏》| 欧美一区二区福利| 久久亚州av| 96久久精品| 国产午夜久久av| 国产欧美日韩中文字幕在线| 日韩大尺度黄色| 91国在线精品国内播放| heyzo一区| 九九久久精品一区| 成人黄视频在线观看| 中文字幕亚洲二区| yw193.com尤物在线| 亚洲免费av电影| 欧美女优在线观看| 国产偷国产偷亚洲清高网站| 黄色片一区二区三区| 日韩一区二区三区四区五区六区| 国产乱淫片视频| 在线电影一区二区三区| 亚洲中文一区二区三区| 欧美无砖专区一中文字| 五月激情丁香网| 欧美在线视频你懂得| 中文字幕69页| 在线视频观看一区| 中文字幕黄色av| 欧美日韩精品是欧美日韩精品| 免费一级a毛片| 在线观看一区日韩| 亚洲天堂免费av| 欧美精品1区2区| 国产熟女精品视频| 日韩欧美国产午夜精品| 亚洲第一色网站| 亚洲成色777777在线观看影院| 日本激情视频网站| 亚洲精品美女久久| 免费理论片在线观看播放老| 国产一区二区三区免费视频| 91社区在线高清| 久久深夜福利免费观看| 日韩特级毛片| 欧美最猛性xxxxx免费| 欧洲亚洲两性| 国产精品一二三在线| 国产成人免费视频网站视频社区 | 日韩aaa久久蜜桃av| 日本一区二区三区四区高清视频| 清纯唯美日韩| 免费在线精品视频| 日韩午夜激情| 中文字幕网av| 国产精品99久久久久久久vr| 一区二区免费在线观看视频| 久久这里只精品最新地址| 黑人と日本人の交わりビデオ| 亚洲视频一二区| 国产精品xxxx喷水欧美| 欧美三级日韩三级国产三级| 国产免费一区二区三区最新不卡 | 免费观看a级片| 最近中文字幕一区二区三区| 日本一级黄色大片| 欧美日韩在线播放三区四区| 超碰在线人人干| 亚洲美女又黄又爽在线观看| 国产在线高潮| 亚洲3p在线观看| 99久久er| 国产区一区二区三区| 激情婷婷综合| 无码 制服 丝袜 国产 另类| 蜜臀久久99精品久久久久宅男| 精品国产一二区| 中文字幕乱码一区二区免费| 在线免费观看毛片| 欧美日本精品一区二区三区| 亚洲三级黄色片| 欧美成人性生活| 成人精品电影在线| 国产aⅴ精品一区二区三区黄| 成人高清电影网站| 国产免费内射又粗又爽密桃视频| 久久狠狠婷婷| 国产伦精品一区二区免费| 国产精品国产自产拍高清av | 中文字幕中文字幕在线十八区| 日韩**中文字幕毛片| 在线精品视频一区| 在线观看成人av电影| 国产日韩欧美三级| 亚洲精品一区二区18漫画 | 久久黄色小视频| 欧美三级韩国三级日本一级| 香蕉久久一区二区三区| 欧美激情精品久久久久久蜜臀 | 日本三级亚洲精品| 国产乱了高清露脸对白| 亚洲综合丁香婷婷六月香| 亚洲天堂久久久久| 亚洲人高潮女人毛茸茸| 成人一级福利| 成人一区二区在线| 亚洲欧美日韩高清在线| 538任你躁在线精品免费| 久久久一区二区三区捆绑**| 国产亚洲欧美精品久久久久久 | 午夜在线成人av| 精品人妻少妇嫩草av无码专区| 最好看的2019的中文字幕视频| 欧美大片免费| 久久精品国产综合精品| 亚洲激情国产| 日本在线不卡一区二区| 一区2区3区在线看| 亚洲国产精品一| 欧美精品在线网站| 一区二区三区视频免费视频观看网站| 在线免费观看成人网| 蜜臀久久99精品久久久久久9| 亚洲黄色免费视频| 欧美亚洲禁片免费| 国产二区在线播放| 国产成人精品网站| 欧美日韩一二三四| gai在线观看免费高清| 亚洲色图丝袜美腿| 国产黄色一区二区| 久久99精品久久久久久噜噜 | 日韩av电影免费播放| 视频一区视频二区中文| 精品一区二区三区蜜桃在线| 欧美专区亚洲专区| 生活片a∨在线观看| 91免费在线视频网站| 正在播放日韩欧美一页| 俄罗斯女人裸体性做爰| 午夜久久久久久久久久一区二区| 香蕉视频免费看| 国产经典一区二区| 日韩视频在线观看| 国产xxxxhd| 午夜国产不卡在线观看视频| 三级在线播放| 国产精品久久久久久久久久三级| 国产精品99久久久久久动医院| 18深夜在线观看免费视频| 亚洲成a天堂v人片| 久久精品色图| 91色p视频在线| 99精品免费| 久操视频在线观看免费| 91麻豆精品91久久久久同性| av在线小说| 日韩视频在线播放| 国产盗摄女厕一区二区三区| 99精品视频99| 日韩在线中文视频| av成人资源网| 激情内射人妻1区2区3区| 中文字幕一区免费在线观看| 亚洲精品一区二区三区四区| 全球成人中文在线| 婷婷综合伊人| 捆绑凌虐一区二区三区| 欧美色电影在线| 黄网站在线观| 亚洲看片网站| 不卡视频免费播放| 亚洲一卡二卡在线观看| 国内精品小视频| 欧美mv日韩| 538国产视频| 日韩欧美中文一区二区| 欧美黑人巨大xxxxx| 精品视频在线观看一区二区| 国产片一区二区三区| www.久久综合| 国产精品久久久av久久久| 精品不卡视频| 亚洲女人毛茸茸高潮| 日韩av网址在线| 欧美特黄不卡| 男女视频在线看|