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

SpringBoot啟動原理詳解(圖文全面總結)

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

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

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

一、@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 出現之前就已經存在多年了。

二、@EnableAutoConfiguration

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

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

}

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

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

三、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 方法去獲取所有候選的自動化配置類,這些候選的自動化配置類主要來自兩個地方:

  1. 在之前的自定義 starter 中松哥和大家聊過,我們需要在 claspath\:META-INF/spring.factories 中定義出來所有的自動化配置類,這是來源一。
  2. 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 對象中,該對象有兩個獲取的地方:

  1. 調用 SpringFactoriesLoader.loadFactoryNames 方法獲取,這個方法細節我就不帶大家看了,比較簡單,本質上就是去加載 META-INF/spring.factories 文件,這個文件中定義了大量的自動化配置類的全路徑。
  2. 調用 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 種也和小伙伴們講過多次了,這里就不再啰嗦了~

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

2025-05-07 03:33:00

2025-01-15 08:34:00

分布式事務服務

2024-11-06 12:29:02

2024-09-04 09:43:36

2024-07-26 10:35:00

2024-11-15 12:04:33

K8S容器化應用

2024-08-29 10:23:42

2024-05-31 13:34:57

2024-08-07 14:56:00

Nginx反向代理配置

2024-07-12 08:42:58

Redis高性能架構

2024-08-08 13:01:53

2024-08-12 16:09:31

2025-01-26 11:54:39

分布式存儲系統

2024-09-14 11:36:02

2024-08-30 10:29:21

2024-12-31 00:00:01

驅動設計應用場景業務邏輯

2025-08-27 06:25:00

MSTP網絡端口

2016-01-15 09:38:49

2023-06-30 07:51:44

springboot初始化邏輯

2024-08-13 15:07:20

點贊
收藏

51CTO技術棧公眾號

可以在线看的av网站| 日韩免费在线播放| 日本少妇xxx| 国产在线精彩视频| 国产欧美日韩麻豆91| 国产精品专区一| 久久精品国产亚洲av香蕉| 国产成人调教视频在线观看 | 国产精品自拍网站| 97在线精品视频| 后入内射无码人妻一区| 97久久亚洲| 无码国产伦一区二区三区视频| 国产欧美日韩精品一区二区免费| 7777精品伊人久久久大香线蕉完整版| 日韩av中文字幕第一页| 99免在线观看免费视频高清| 高清不卡在线观看av| 国产精品91视频| 国产污视频在线观看| 成人嫩草影院| 亚洲国产97在线精品一区| wwwwwxxxx日本| 一级毛片久久久| 一区二区三区四区中文字幕| 午夜视频久久久| 韩国av永久免费| 韩日欧美一区二区三区| 日韩免费av片在线观看| 国产对白videos麻豆高潮| 99久久99久久精品国产片果冰| 精品网站999www| 国产黑丝在线视频| 欧美激情啪啪| 岛国精品视频在线播放| 男人天堂手机在线视频| 大片免费在线看视频| 中文字幕av免费专区久久| 国产一区二区在线网站| 亚洲成人av综合| 国产乱码精品一区二区三区忘忧草| 国产精品视频最多的网站| 午夜婷婷在线观看| 一道本一区二区| 韩日精品中文字幕| 麻豆视频在线观看| 妖精视频一区二区| 成人全视频免费观看在线看| 精品久久香蕉国产线看观看亚洲| 欧美人与动牲交xxxxbbbb| 久久五月精品| 中文字幕一区二区三区四区不卡| 日韩欧美亚洲日产国产| 国产高清自拍视频在线观看| 97se狠狠狠综合亚洲狠狠| 国产尤物99| 婷婷丁香一区二区三区| 成人免费va视频| 国产三区精品| 天堂av中文在线资源库| 久久久蜜桃精品| 欧美一区亚洲二区| freemovies性欧美| 国产精品青草综合久久久久99| 台湾成人av| 91大神xh98hx在线播放| 自拍偷拍欧美激情| 欧美另类videosbestsex日本| 国产淫片在线观看| 夜夜嗨av一区二区三区四季av| 大胆欧美熟妇xx| 国产激情视频在线看| 欧美色图在线视频| 成人免费在线观看视频网站| 国外成人福利视频| 日韩一区二区三区观看| 成人免费看片载| 日韩动漫一区| 国产一区二区三区四区福利| 亚洲欧美精品aaaaaa片| 青草青在线视频| 一区二区三区影院| 鲁一鲁一鲁一鲁一澡| 人人视频精品| 91麻豆精品国产91久久久久久久久| 一起草最新网址| 精品五月天堂| 在线日韩欧美视频| 欧美精品乱码视频一二专区| 中文欧美日韩| 成人精品视频在线| 午夜影院免费视频| 国产精品久久午夜| 56国语精品自产拍在线观看| 中文字幕乱码一区二区三区| 中文字幕有码在线观看| 亚洲成国产人片在线观看| 国产视频一区二区视频| 久久影院一区二区三区| 亚洲国产日韩欧美在线图片| 中文字幕免费在线看线人动作大片 | 亚洲午夜羞羞片| 国产精品99久久免费黑人人妻| 欧美高清xxx| 日韩成人高清在线| a一级免费视频| 99精品热6080yy久久| 成人激情视频在线| 欧美挠脚心网站| 一区二区三区在线视频观看58| 成熟老妇女视频| 亚洲图色一区二区三区| 一本一本久久a久久精品牛牛影视 一本色道久久综合亚洲精品小说 一本色道久久综合狠狠躁篇怎么玩 | 女同久久另类99精品国产| 久久久精品2019中文字幕神马| 国产成人精品片| 国产成人在线视频网址| 亚洲精品第一区二区三区| 乱人伦视频在线| 日韩久久精品一区| 国内毛片毛片毛片毛片毛片| 亚洲一区二区三区高清| 97免费高清电视剧观看| av在线播放av| 日韩欧美第一页| 蜜桃成人在线| 不卡一区二区在线观看| 亚洲成人日韩| 国产欧美精品日韩| 国产福利在线看| 欧美日韩中文字幕在线| 国产伦精品一区二区三区妓女下载| 精品福利久久久| 欧美亚洲另类制服自拍| 丰满人妻一区二区三区免费视频| 国产精品电影一区二区三区| 97公开免费视频| 免费成人高清在线视频theav| 欧美日韩国产成人高清视频| 97超碰中文字幕| 国产精品久久久久永久免费观看 | 精品无码在线观看| 美女爽到呻吟久久久久| 久久久久久九九| 极品美鲍一区| 亚洲国产一区二区三区四区| 久草视频手机在线观看| 国产伦精品一区二区三区免费迷| 一本一道久久a久久精品综合 | 欧美在线亚洲| 91久久精品美女高潮| 免费在线观看av| 欧美嫩在线观看| 国产日产精品一区二区三区的介绍| 青青草国产精品亚洲专区无| 亚洲成色www久久网站| www.成人在线视频| 精品国产拍在线观看| 国产一区二区麻豆| 亚洲免费观看高清在线观看| 亚洲天堂一区二区在线观看| 欧美一区二区三区另类| 不卡视频一区| 爱啪视频在线观看视频免费| 精品中文视频在线| 亚洲色成人www永久网站| 国产欧美日韩三区| 交换做爰国语对白| 99成人在线| 欧美一级二级三级九九九| 日韩和的一区二在线| 色婷婷av一区二区三区久久| 91影院在线播放| 亚洲一区二区视频在线观看| 大乳护士喂奶hd| 日韩电影在线免费看| 中文字幕成人一区| 福利电影一区| 欧美一级淫片播放口| 91看片在线观看| 日韩一级高清毛片| 三级视频在线观看| 国产精品免费免费| 香蕉在线观看视频| 美女精品一区| 欧美交换配乱吟粗大25p| 西野翔中文久久精品字幕| 国产精品午夜一区二区欲梦| 在线视频观看国产| 亚洲男人天堂网站| 国产精品一区二区av白丝下载 | 蜜桃视频一区二区在线观看| 日韩理论电影中文字幕| 国产欧美一区二区三区四区| 麻豆av在线播放| 亚洲男女自偷自拍图片另类| 国产又粗又猛又黄又爽| 精品久久久视频| 很污很黄的网站| 99视频一区二区| 在线观看岛国av| 国产婷婷精品| 黄色一级视频播放| 国产影视精品一区二区三区| 91麻豆蜜桃| 亚洲不卡系列| 国内精品国产三级国产在线专 | 欧美激情videoshd| 北岛玲日韩精品一区二区三区| 欧美大片一区二区| 中文字幕 日韩有码| 精品动漫一区二区三区| 放荡的美妇在线播放| 国产欧美日韩久久| 亚洲男人在线天堂| 国产suv精品一区二区883| 色一情一区二区| 久热国产精品| 日韩av一二三四区| 亚洲成人在线| 日韩视频 中文字幕| 99久久99热这里只有精品| 日韩精品久久久| 欧美国产不卡| 岛国一区二区三区高清视频| 看片一区二区| 国产精品久久久久久久一区探花 | 五月精品视频| 日韩亚洲不卡在线| 女厕嘘嘘一区二区在线播放 | 一二三级黄色片| 肉丝袜脚交视频一区二区| 99热自拍偷拍| 91久久夜色精品国产九色| 黄色影视在线观看| 亚洲国产一区二区三区在线播放| 日韩欧美在线一区二区| 你微笑时很美电视剧整集高清不卡 | 久久精品五月天| 日韩欧美在线观看视频| 免费黄色网址在线| 欧美日韩一二三四五区| 日本视频www| 香蕉久久一区二区不卡无毒影院 | 成人亚洲激情网| 国产三级一区| 国产日韩欧美另类| 婷婷久久免费视频| 91牛牛免费视频| 韩国三级成人在线| 3d精品h动漫啪啪一区二区| 精品国产亚洲一区二区三区| 亚洲综合社区网| 999久久久精品一区二区| 91网免费观看| 精品嫩草影院| 欧美高清视频一区| 精品午夜久久| 一区二区视频在线免费| 亚洲第一天堂| 日韩精品综合在线| 国产精品综合| 男女啪啪网站视频| 国内精品久久久久影院色| 欧美人与性动交α欧美精品| 成人精品视频.| 免费黄色在线视频| 亚洲国产高清不卡| 国产十六处破外女视频| 午夜国产不卡在线观看视频| www.com国产| 欧美精选在线播放| 欧美自拍第一页| 亚洲人成网在线播放| 成人激情电影在线看| 久久中文久久字幕| 捆绑调教日本一区二区三区| 国产成人精品久久久| 只有精品亚洲| 久久九九精品99国产精品| 国产淫片在线观看| 91精品国产免费久久久久久| 制服诱惑亚洲| 亚洲一区二区自拍| 亚洲另类春色校园小说| 国产又爽又黄ai换脸| 狠狠综合久久| 精品久久久久久中文字幕2017| 国内精品伊人久久久久影院对白| 50一60岁老妇女毛片| 中文字幕免费不卡| 精品在线视频观看| 欧美在线你懂的| 亚洲免费成人在线| 亚洲一区第一页| 欧美理论电影| 国产乱人伦真实精品视频| 农村少妇一区二区三区四区五区 | 欧美另类亚洲| 黄色一级大片在线观看| 国产伦精品一区二区三区在线观看| 亚洲第一黄色网址| 亚洲免费观看视频| 中文字幕无码乱码人妻日韩精品| 日韩欧美的一区| eeuss影院www在线观看| 欧美精品video| 偷拍自拍亚洲| 日韩美女一区| 国产亚洲毛片| 日本美女视频网站| 中文字幕一区二区三区乱码在线 | 亚洲承认在线| 成人免费黄色av| 国产欧美精品国产国产专区| 日本熟妇色xxxxx日本免费看| 欧美色老头old∨ideo| 天堂在线视频免费| 欧美高跟鞋交xxxxhd| 亚洲a成人v| 色综合久久av| 亚洲一区日韩| 白嫩情侣偷拍呻吟刺激| 亚洲同性gay激情无套| 亚洲国产无线乱码在线观看 | 国产激情第一页| 亚洲午夜久久久| 国产激情视频在线播放| 久久精品国产精品| 国产麻豆一区| 少妇特黄a一区二区三区| 免费日韩视频| 玖草视频在线观看| 午夜精品福利在线| 免费国产羞羞网站视频| 欧美另类69精品久久久久9999| 午夜不卡一区| 中文字幕在线中文字幕日亚韩一区| 日韩不卡在线观看日韩不卡视频| 国产精品无码永久免费不卡| 性感美女久久精品| 婷婷久久久久久| 欧美一区二区三区精品电影| 免费福利视频一区| 国产视频一视频二| 91在线观看地址| 久久一区二区三区视频| 亚洲精品久久久久久久久久久| 97人人爽人人澡人人精品| 国产精品久久久久久久久久直播 | 久久久久国产一区二区三区| 亚洲一级大片| 欧美一级欧美一级| 91视频在线观看免费| 日本中文字幕在线| 亚洲人在线视频| 狠狠久久综合| 手机看片日韩国产| 国产91丝袜在线18| 中文字幕一区二区三区精品 | 日本精品一区二区三区在线播放| 国产在线久久久| 综合日韩在线| 理论片大全免费理伦片| 欧美午夜影院在线视频| 番号集在线观看| 成人激情春色网| 韩国精品一区二区三区| 亚洲 欧美 日韩在线| 色婷婷综合久久久久中文一区二区 | 日韩国产精品毛片| 国产99精品国产| 久久久久亚洲av成人毛片韩| 在线成人免费网站| 成人污版视频| 欧美精品自拍视频| 久久久国际精品| 国产强伦人妻毛片| 26uuu日韩精品一区二区| 国产区精品区| 日韩精品在线播放视频| 欧美日韩亚洲激情| 久cao在线| 精品一卡二卡三卡四卡日本乱码| 日韩精品亚洲一区二区三区免费| 天天色天天综合| 亚洲电影av在线| 成人1区2区| 福利视频一区二区三区四区| 国产视频在线观看一区二区三区| 一级片免费网站| 77777少妇光屁股久久一区| 97精品在线| www.超碰97| 日韩视频免费直播| 91tv亚洲精品香蕉国产一区| 免费看日本黄色| 中文字幕欧美国产| 神马一区二区三区| 91亚洲人电影|