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

欧美另类综合| 精品成人18| 国产日产欧产精品推荐色| 国产美女主播一区| 国产va在线播放| 噜噜噜狠狠夜夜躁精品仙踪林| 欧美日韩一区二区精品| 亚洲激情图片| 黄片毛片在线看| 视频一区二区不卡| 欧美片一区二区三区| 西西444www无码大胆| 欧美9999| 欧美中文字幕亚洲一区二区va在线| 在线观看精品视频| 天堂网av2014| 国产剧情av麻豆香蕉精品| 欧美在线性爱视频 | 69视频在线播放| 日韩一卡二卡在线观看| 人人精品亚洲| 欧美mv日韩mv亚洲| 三上悠亚在线一区| 波多野结衣久久精品| 亚洲综合丁香婷婷六月香| 日韩在线第一区| 免费观看毛片网站| 国产精品羞羞答答xxdd| 国产精品欧美日韩久久| 亚洲黄色一区二区| 国产精品大片免费观看| 精品国内自产拍在线观看| 蜜桃无码一区二区三区| 国产成人福利av| 日韩一区二区三区四区| 亚洲欧美在线精品| 偷拍中文亚洲欧美动漫| 午夜欧美2019年伦理| 国产91porn| av免费在线免费| 国产亚洲精品超碰| 蜜桃日韩视频| 你懂得在线网址| 99久久精品国产精品久久| 国产高清不卡av| 国产av无码专区亚洲a∨毛片| 日本女优在线视频一区二区| 日韩免费观看高清| 国产精品21p| 久久电影一区| 日本亚洲欧洲色| 亚洲欧美综合另类| 午夜亚洲性色视频| 欧美一区二区三区免费视| 亚洲另类欧美日韩| 久久福利精品| 国产成人精品免高潮在线观看| 国产精品va无码一区二区三区| 99精品99| 国产成人精品久久亚洲高清不卡 | 欧美亚洲高清一区二区三区不卡| 青青艹视频在线| 麻豆免费在线| 日本乱人伦aⅴ精品| 欧美日韩在线免费播放| 日韩中文在线播放| 欧美日本国产视频| 亚洲AV无码久久精品国产一区| 欧美专区视频| 亚洲激情视频网| 亚洲成人日韩在线| 精品不卡一区| 久久久成人精品视频| 国产极品国产极品| 99精品久久| 国产精品日韩精品| 国产视频在线观看免费| 丁香一区二区三区| 欧美精品一区二区三区在线看午夜 | wwww亚洲| 在线免费不卡视频| 肉色超薄丝袜脚交| 啪啪国产精品| 中文字幕欧美专区| h色网站在线观看| 在线日韩欧美| 国产精品美女呻吟| www.激情五月| 国产清纯在线一区二区www| 一区二区不卡在线观看| 久草在线视频网站| 欧美自拍偷拍午夜视频| 黄页网站在线看| 自拍自偷一区二区三区| 久久久精品一区二区三区| 男人的天堂一区| 美女网站色91| 精品一区久久| 动漫一区在线| 色综合视频一区二区三区高清| 手机免费看av网站| 久久精品亚洲成在人线av网址| 亚洲日韩第一页| 免费人成在线观看| 免费成人av在线播放| 91精品国产99久久久久久红楼| 欧洲天堂在线观看| 一区二区三区四区在线免费观看 | 成人av免费在线观看| 天天综合狠狠精品| 春色校园综合激情亚洲| 欧美男男青年gay1069videost | 黄色片在线免费| 在线观看视频一区二区三区| 一本色道久久88综合亚洲精品ⅰ | 在线日本高清免费不卡| 91牛牛免费视频| 久青青在线观看视频国产| 一区二区日韩av| 亚洲精品久久久久久宅男| 色狠狠久久av综合| 久久久久久久久久久网站| 97成人在线观看| 久久久久久久国产精品影院| 91网站在线观看免费| 日韩精品第二页| 亚洲日韩欧美视频| 日韩不卡在线播放| 99久久精品国产导航| 国产 欧美 日本| 亚洲成人黄色| 不用播放器成人网| 国产精品色综合| 国产精品视频你懂的| 欧美性资源免费| 6—12呦国产精品| 国产亚洲精品7777| 国产精品欧美激情在线观看| 精品欠久久久中文字幕加勒比| 欧美成人精品一区二区| ,亚洲人成毛片在线播放| 中文一区一区三区高中清不卡| 少妇人妻互换不带套| 丝袜久久网站| 国产xxx69麻豆国语对白| 天堂av网在线| 大桥未久av一区二区三区| 日本少妇xxxx| 国产亚洲网站| 蜜桃视频日韩| 欧美男女交配| 在线电影av不卡网址| 最新中文字幕第一页| 中文字幕av一区二区三区免费看 | 久久综合综合久久综合| 日韩美女一区| 久久天堂影院| 久久视频在线播放| wwwav在线播放| 亚洲一区二区三区四区在线| 欧美日韩人妻精品一区在线| 日韩午夜激情| 日本一区二区三区免费看 | 成人av电影免费| www.九色在线| 亚洲九九九在线观看| 97人妻一区二区精品视频| 亚洲国产精品传媒在线观看| 午夜激情av在线| 一区二区三区在线| 国产综合色一区二区三区| 五月天国产在线| 一级做a爰片久久毛片美女图片| 一级片在线免费观看视频| 自拍偷拍亚洲欧美日韩| 中文字幕99页| 丝袜亚洲另类欧美| 在线观看污视频| 麻豆一区二区| 国产精品久久久久久久久男| 超碰在线最新| 亚洲精品在线91| 91在线精品入口| 亚洲va欧美va人人爽午夜| 日本少妇xxxxx| 国产精品综合二区| jizzjizzxxxx| 希岛爱理一区二区三区| 国产精品污www一区二区三区| 另类专区亚洲| 久久91精品国产91久久久| 色综合888| 91精品福利在线一区二区三区 | 亚洲激情啪啪| 欧美a级网站| 国产日韩av在线播放| 欧美黄色视屏| 中文字幕精品在线视频| 男人天堂网在线视频| 欧美在线免费观看亚洲| 国产精品成人aaaa在线| 亚洲国产精品av| 国产精品成人99一区无码| 久久精品免费观看| 日韩欧美在线播放视频| 最新国产精品| 亚洲一二区在线| 日韩精品导航| 成人动漫在线视频| 色诱色偷偷久久综合| 69国产精品成人在线播放| 羞羞视频在线免费国产| 在线播放日韩精品| 欧美孕妇孕交xxⅹ孕妇交| 日韩欧美一区二区在线视频| 中文字幕在线观看欧美| 欧美色道久久88综合亚洲精品| 欧美又粗又大又长| 国产精品视频yy9299一区| 中文字幕国产专区| 成人av资源网站| 美女日批在线观看| 国产综合久久久久影院| 中国黄色片免费看| 麻豆91精品| 女人和拘做爰正片视频| 在线国产日韩| 中文字幕人妻熟女人妻洋洋| 2023国产精品久久久精品双| 亚洲 国产 日韩 综合一区| 免费视频一区三区| 久久影视中文粉嫩av| 国产极品模特精品一二| av资源一区二区| 日韩一区二区三区高清在线观看| 国产欧美一区二区三区四区| 97欧美成人| 国产精品久久久久久久一区探花| 欧美性suv| 日韩av色综合| 日韩成人亚洲| 国产精品成av人在线视午夜片| 特黄毛片在线观看| 青青草成人在线| 中文字幕在线直播| 国产97免费视| 成人午夜在线| 国产日韩欧美在线观看| 先锋影音网一区二区| 91久热免费在线视频| 成人51免费| 97人人做人人人难人人做| 亚洲精品a区| 激情欧美一区二区三区中文字幕| 福利片在线一区二区| 国产在线欧美日韩| 九九在线精品| 亚洲欧美日韩另类精品一区二区三区 | 福利小视频在线| 97久久精品人搡人人玩| 涩涩av在线| 国产精品久久久久久亚洲调教| 欧美日韩五码| 91日本视频在线| 国产成人高清精品免费5388| 鲁片一区二区三区| 四虎8848精品成人免费网站| 无码人妻aⅴ一区二区三区日本| 午夜国产欧美理论在线播放| 欧美午夜小视频| 久久最新视频| 伊人成人免费视频| av电影在线观看不卡| 免费看黄色av| 一区二区三区欧美激情| 日本道在线观看| 欧美色电影在线| 超碰在线播放97| 亚洲人高潮女人毛茸茸| 免费a级毛片在线播放| 久久久久久com| 四虎4545www精品视频| 91青青草免费在线看| 日韩三级毛片| 在线观看免费黄色片| 亚洲乱码视频| wwwwwxxxx日本| 99久久精品免费看国产| 亚洲图片第一页| 亚洲国产精品嫩草影院| 中文字幕日日夜夜| 亚洲成人免费在线视频| 91在线免费看| 性欧美激情精品| 超碰国产精品一区二页| 久久青青草综合| 欧美激情精品久久久六区热门| 久草资源站在线观看| 国产一区亚洲一区| 熟女俱乐部一区二区| 亚洲毛片av在线| 国产美女www爽爽爽| 欧美精品一区男女天堂| 日韩在线免费电影| 欧美中文字幕在线播放| 日本免费精品| 一区二区视频在线免费| 亚洲影音一区| 亚洲无人区码一码二码三码| 国产精品久久久久一区 | caoporn-草棚在线视频最| 国产日韩欧美中文在线播放| 久久av导航| 尤物av无码色av无码| 国产不卡在线视频| 来吧亚洲综合网| 欧美专区日韩专区| 欧美孕妇孕交xxⅹ孕妇交| 97国产精品久久| 澳门久久精品| 97碰在线视频| 国产一区高清在线| 欧美色图17p| 欧美在线免费播放| 日本大臀精品| 2019亚洲日韩新视频| 国产精品香蕉| 99热久久这里只有精品| 国产精品羞羞答答xxdd| 91麻豆免费视频网站| 欧美日韩成人高清| 午夜精品一区| 国产九九精品视频| 日韩黄色大片网站| 色婷婷成人在线| 欧美国产精品v| 中文字幕码精品视频网站| 亚洲欧美日韩国产中文| 伊人久久视频| 欧洲av一区| 日本午夜精品视频在线观看 | 午夜一区二区三区在线观看| 精品国产九九九| 欧美日韩高清区| 2020国产精品极品色在线观看| www.国产亚洲| 成人三级伦理片| 久久不卡免费视频| 日韩精品免费看| 欧美日韩电影免费看| 日韩一区二区电影在线观看| 麻豆精品一区二区三区| 亚洲欧美另类日本| 欧美一区日本一区韩国一区| 三级资源在线| 国产欧美日韩综合精品二区| 99综合在线| 久久精品国产亚洲av久| 欧美在线free| sm国产在线调教视频| 国产 高清 精品 在线 a| 在线欧美三区| 国产小视频自拍| 欧美日韩国产三级| 午夜av在线免费观看| 狠狠色伊人亚洲综合网站色| 翔田千里一区二区| 亚洲av熟女国产一区二区性色| 欧美日韩国产首页| av日韩中文| 日韩精品一区二区三区外面| 狠狠色综合日日| 亚洲国产成人精品激情在线| 亚洲视频免费一区| 蜜桃在线一区| 欧美成人xxxxx| 国产精品国产三级国产aⅴ原创 | 国产三级欧美三级| 国产男男gay网站| 97视频免费在线看| 日韩精品欧美| 韩国三级hd两男一女| 在线观看日韩国产| 国产在线拍揄自揄拍视频| 欧美主播一区二区三区美女 久久精品人 | 第四色成人网| 欧洲熟妇的性久久久久久| 在线观看日韩电影| 欧美日韩在线视频免费观看| 麻豆av一区二区| 国产精品77777| 91视频久久久| 欧美激情亚洲自拍| 欧美自拍偷拍| 亚洲一区二区乱码| 制服丝袜日韩国产| 高清成人在线| 日日摸日日碰夜夜爽无码| 中文字幕一区二区在线播放| 亚洲三级中文字幕|