国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

SpringBoot 注解原理,自動(dòng)裝配原理,圖文并茂,萬(wàn)字長(zhǎng)文!

共 29595字,需瀏覽 60分鐘

 ·

2021-04-15 00:16

程序員的成長(zhǎng)之路
互聯(lián)網(wǎng)/程序員/技術(shù)/資料共享 
關(guān)注


閱讀本文大概需要 8.5 分鐘。

來(lái)自:http://cnblogs.com/jing99/p/11504113.html


首先,先看SpringBoot的主配置類:

@SpringBootApplication
public class StartEurekaApplication
{
    public static void main(String[] args)
    
{
        SpringApplication.run(StartEurekaApplication.classargs);
    }
}

點(diǎn)進(jìn)@SpringBootApplication來(lái)看,發(fā)現(xiàn)@SpringBootApplication是一個(gè)組合注解。

@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 
{

}

首先我們先來(lái)看 @SpringBootConfiguration:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {
}

可以看到這個(gè)注解除了元注解以外,就只有一個(gè)@Configuration,那也就是說(shuō)這個(gè)注解相當(dāng)于@Configuration,所以這兩個(gè)注解作用是一樣的,它讓我們能夠去注冊(cè)一些額外的Bean,并且導(dǎo)入一些額外的配置。
那@Configuration還有一個(gè)作用就是把該類變成一個(gè)配置類,不需要額外的XML進(jìn)行配置。所以@SpringBootConfiguration就相當(dāng)于@Configuration。進(jìn)入@Configuration,發(fā)現(xiàn)@Configuration核心是@Component,說(shuō)明Spring的配置類也是Spring的一個(gè)組件。

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {
    @AliasFor(
        annotation = Component.class
    )
    String value() default ""
;
}

繼續(xù)來(lái)看下一個(gè)@EnableAutoConfiguration,這個(gè)注解是開(kāi)啟自動(dòng)配置的功能。

@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,@Import(EnableAutoConfigurationImportSelector.class)這兩個(gè)而組成的,我們先說(shuō)@AutoConfigurationPackage,他是說(shuō):讓包中的類以及子包中的類能夠被自動(dòng)掃描到spring容器中。

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

使用@Import來(lái)給Spring容器中導(dǎo)入一個(gè)組件 ,這里導(dǎo)入的是Registrar.class。來(lái)看下這個(gè)Registrar:

static class Registrar implements ImportBeanDefinitionRegistrarDeterminableImports {
        Registrar() {
        }

        public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
            AutoConfigurationPackages.register(registry, (new AutoConfigurationPackages.PackageImport(metadata)).getPackageName());
        }

        public Set<Object> determineImports(AnnotationMetadata metadata) {
            return Collections.singleton(new AutoConfigurationPackages.PackageImport(metadata));
        }
    }

就是通過(guò)以上這個(gè)方法獲取掃描的包路徑,可以debug查看具體的值:
那metadata是什么呢,可以看到是標(biāo)注在@SpringBootApplication注解上的DemosbApplication,也就是我們的主配置類Application:
其實(shí)就是將主配置類(即@SpringBootApplication標(biāo)注的類)的所在包及子包里面所有組件掃描加載到Spring容器。因此我們要把DemoApplication放在項(xiàng)目的最高級(jí)中(最外層目錄)。
看看注解@Import(AutoConfigurationImportSelector.class),@Import注解就是給Spring容器中導(dǎo)入一些組件,這里傳入了一個(gè)組件的選擇器:AutoConfigurationImportSelector。
可以從圖中看出AutoConfigurationImportSelector 繼承了 DeferredImportSelector 繼承了 ImportSelector,ImportSelector有一個(gè)方法為:selectImports。將所有需要導(dǎo)入的組件以全類名的方式返回,這些組件就會(huì)被添加到容器中。

public String[] selectImports(AnnotationMetadata annotationMetadata) {
    if (!this.isEnabled(annotationMetadata)) {
        return NO_IMPORTS;
    } else {
        AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader.loadMetadata(this.beanClassLoader);
        AutoConfigurationImportSelector.AutoConfigurationEntry autoConfigurationEntry = 
        this.getAutoConfigurationEntry(autoConfigurationMetadata, annotationMetadata);
        return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
    }
}

會(huì)給容器中導(dǎo)入非常多的自動(dòng)配置類(xxxAutoConfiguration);就是給容器中導(dǎo)入這個(gè)場(chǎng)景需要的所有組件,并配置好這些組件。
有了自動(dòng)配置類,免去了我們手動(dòng)編寫配置注入功能組件等的工作。那是如何獲取到這些配置類的呢,看看下面這個(gè)方法:

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

我們可以看到getCandidateConfigurations()這個(gè)方法,他的作用就是引入系統(tǒng)已經(jīng)加載好的一些類,到底是那些類呢:

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
    List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
    Assert.notEmpty(configurations, 
    "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.");
    return configurations;
}



public static List<String> loadFactoryNames(Class<?> factoryClass, @Nullable ClassLoader classLoader) {
    String factoryClassName = factoryClass.getName();
    return (List)loadSpringFactories(classLoader).getOrDefault(factoryClassName, Collections.emptyList());
}

會(huì)從META-INF/spring.factories中獲取資源,然后通過(guò)Properties加載資源:

private static Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader) {
    MultiValueMap<String, String> result = (MultiValueMap)cache.get(classLoader);
    if (result != null) {
        return result;
    } else {
        try {
            Enumeration<URL> urls = classLoader != 
          null ? classLoader.getResources("META-INF/spring.factories") : ClassLoader.getSystemResources("META-INF/spring.factories");
            LinkedMultiValueMap result = new LinkedMultiValueMap();

            while(urls.hasMoreElements()) {
                URL url = (URL)urls.nextElement();
                UrlResource resource = new UrlResource(url);
                Properties properties = PropertiesLoaderUtils.loadProperties(resource);
                Iterator var6 = properties.entrySet().iterator();

                while(var6.hasNext()) {
                    Map.Entry<?, ?> entry = (Map.Entry)var6.next();
                    String factoryClassName = ((String)entry.getKey()).trim();
                    String[] var9 = StringUtils.commaDelimitedListToStringArray((String)entry.getValue());
                    int var10 = var9.length;

                    for(int var11 = 0; var11 < var10; ++var11) {
                        String factoryName = var9[var11];
                        result.add(factoryClassName, factoryName.trim());
                    }
                }
            }

            cache.put(classLoader, result);
            return result;
        } catch (IOException var13) {
            throw new IllegalArgumentException("Unable to load factories from location [META-INF/spring.factories]", var13);
        }
    }
}

可以知道SpringBoot在啟動(dòng)的時(shí)候從類路徑下的META-INF/spring.factories中獲取EnableAutoConfiguration指定的值,將這些值作為自動(dòng)配置類導(dǎo)入到容器中,自動(dòng)配置類就生效,幫我們進(jìn)行自動(dòng)配置工作。以前我們需要自己配置的東西,自動(dòng)配置類都幫我們完成了。如下圖可以發(fā)現(xiàn)Spring常見(jiàn)的一些類已經(jīng)自動(dòng)導(dǎo)入。
接下來(lái)看@ComponentScan注解,@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) }),這個(gè)注解就是掃描包,然后放入spring容器。

@ComponentScan(excludeFilters = {
  @Filter(type = FilterType.CUSTOM,classes = {TypeExcludeFilter.class}), 
  @Filter(type 
= FilterType.CUSTOM,classes = {AutoConfigurationExcludeFilter.class})})
public @interface SpringBootApplication 
{}

總結(jié)下@SpringbootApplication:就是說(shuō),他已經(jīng)把很多東西準(zhǔn)備好,具體是否使用取決于我們的程序或者說(shuō)配置。
接下來(lái)繼續(xù)看run方法:

public static void main(String[] args) {
        SpringApplication.run(Application.classargs);
    }

來(lái)看下在執(zhí)行run方法到底有沒(méi)有用到哪些自動(dòng)配置的東西,我們點(diǎn)進(jìn)run:

public ConfigurableApplicationContext run(String... args) {
    //計(jì)時(shí)器
    StopWatch stopWatch = new StopWatch();
    stopWatch.start();
    ConfigurableApplicationContext context = null;
    Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList();
    this.configureHeadlessProperty();
    //監(jiān)聽(tīng)器
    SpringApplicationRunListeners listeners = this.getRunListeners(args);
    listeners.starting();

    Collection exceptionReporters;
    try {
        ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
        ConfigurableEnvironment environment = this.prepareEnvironment(listeners, applicationArguments);
        this.configureIgnoreBeanInfo(environment);
        Banner printedBanner = this.printBanner(environment);
        //準(zhǔn)備上下文
        context = this.createApplicationContext();
        exceptionReporters = this.getSpringFactoriesInstances(SpringBootExceptionReporter.class,                       new Class[]{ConfigurableApplicationContext.class}, context);
        //預(yù)刷新context
        this.prepareContext(context, environment, listeners, applicationArguments, printedBanner);
        //刷新context
        this.refreshContext(context);
        //刷新之后的context
        this.afterRefresh(context, applicationArguments);
        stopWatch.stop();
        if (this.logStartupInfo) {
            (new StartupInfoLogger(this.mainApplicationClass)).logStarted(this.getApplicationLog(), stopWatch);
        }

        listeners.started(context);
        this.callRunners(context, applicationArguments);
    } catch (Throwable var10) {
        this.handleRunFailure(context, var10, exceptionReporters, listeners);
        throw new IllegalStateException(var10);
    }

    try {
        listeners.running(context);
        return context;
    } catch (Throwable var9) {
        this.handleRunFailure(context, var9, exceptionReporters, (SpringApplicationRunListeners)null);
        throw new IllegalStateException(var9);
    }
}

那我們關(guān)注的就是 refreshContext(context); 刷新context,我們點(diǎn)進(jìn)來(lái)看。

private void refreshContext(ConfigurableApplicationContext context) {
   refresh(context);
   if (this.registerShutdownHook) {
      try {
         context.registerShutdownHook();
      }
      catch (AccessControlException ex) {
         // Not allowed in some environments.
      }
   }
}

我們繼續(xù)點(diǎn)進(jìn)refresh(context);

protected void refresh(ApplicationContext applicationContext) {
   Assert.isInstanceOf(AbstractApplicationContext.classapplicationContext);
   ((AbstractApplicationContext) applicationContext).refresh();
}

他會(huì)調(diào)用 ((AbstractApplicationContext) applicationContext).refresh();方法,我們點(diǎn)進(jìn)來(lái)看:

public void refresh() throws BeansException, IllegalStateException {
   synchronized (this.startupShutdownMonitor) {
      // Prepare this context for refreshing.
      prepareRefresh();
      // Tell the subclass to refresh the internal bean factory.
      ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
      // Prepare the bean factory for use in this context.
      prepareBeanFactory(beanFactory);

      try {
         // Allows post-processing of the bean factory in context subclasses.
         postProcessBeanFactory(beanFactory);
         // Invoke factory processors registered as beans in the context.
         invokeBeanFactoryPostProcessors(beanFactory);
         // Register bean processors that intercept bean creation.
         registerBeanPostProcessors(beanFactory);
         // Initialize message source for this context.
         initMessageSource();
         // Initialize event multicaster for this context.
         initApplicationEventMulticaster();
         // Initialize other special beans in specific context subclasses.
         onRefresh();
         // Check for listener beans and register them.
         registerListeners();
         // Instantiate all remaining (non-lazy-init) singletons.
         finishBeanFactoryInitialization(beanFactory);
         // Last step: publish corresponding event.
         finishRefresh();
      }catch (BeansException ex) {
         if (logger.isWarnEnabled()) {
            logger.warn("Exception encountered during context initialization - " +
                  "cancelling refresh attempt: " + ex);
         }
         // Destroy already created singletons to avoid dangling resources.
         destroyBeans();
         // Reset 'active' flag.
         cancelRefresh(ex);
         // Propagate exception to caller.
         throw ex;
      }finally {
         // Reset common introspection caches in Spring's core, since we
         // might not ever need metadata for singleton beans anymore...
         resetCommonCaches();
      }
   }
}

由此可知,就是一個(gè)spring的bean的加載過(guò)程。繼續(xù)來(lái)看一個(gè)方法叫做 onRefresh():

protected void onRefresh() throws BeansException {
   // For subclasses: do nothing by default.
}

他在這里并沒(méi)有直接實(shí)現(xiàn),但是我們找他的具體實(shí)現(xiàn):
比如Tomcat跟web有關(guān),我們可以看到有個(gè)ServletWebServerApplicationContext:

@Override
protected void onRefresh() {
   super.onRefresh();
   try {
      createWebServer();
   }
   catch (Throwable ex) {
      throw new ApplicationContextException("Unable to start web server", ex);
   }
}

可以看到有一個(gè)createWebServer();方法他是創(chuàng)建web容器的,而Tomcat不就是web容器,那是如何創(chuàng)建的呢,我們繼續(xù)看:

private void createWebServer() {
   WebServer webServer = this.webServer;
   ServletContext servletContext = getServletContext();
   if (webServer == null && servletContext == null) {
      ServletWebServerFactory factory = getWebServerFactory();
      this.webServer = factory.getWebServer(getSelfInitializer());
   }
   else if (servletContext != null) {
      try {
         getSelfInitializer().onStartup(servletContext);
      }
      catch (ServletException ex) {
         throw new ApplicationContextException("Cannot initialize servlet context",
               ex);
      }
   }
   initPropertySources();
}

factory.getWebServer(getSelfInitializer());他是通過(guò)工廠的方式創(chuàng)建的。

public interface ServletWebServerFactory {
   WebServer getWebServer(ServletContextInitializer... initializers);
}

可以看到 它是一個(gè)接口,為什么會(huì)是接口。因?yàn)槲覀儾恢故荰omcat一種web容器。
我們看到還有Jetty,那我們來(lái)看TomcatServletWebServerFactory:

@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
   Tomcat tomcat = new Tomcat();
   File baseDir = (this.baseDirectory != null) ? this.baseDirectory
         : createTempDir("tomcat");
   tomcat.setBaseDir(baseDir.getAbsolutePath());
   Connector connector = new Connector(this.protocol);
   tomcat.getService().addConnector(connector);
   customizeConnector(connector);
   tomcat.setConnector(connector);
   tomcat.getHost().setAutoDeploy(false);
   configureEngine(tomcat.getEngine());
   for (Connector additionalConnector : this.additionalTomcatConnectors) {
      tomcat.getService().addConnector(additionalConnector);
   }
   prepareContext(tomcat.getHost(), initializers);
   return getTomcatWebServer(tomcat);
}

那這塊代碼,就是我們要尋找的內(nèi)置Tomcat,在這個(gè)過(guò)程當(dāng)中,我們可以看到創(chuàng)建Tomcat的一個(gè)流程。
如果不明白的話, 我們?cè)谟昧硪环N方式來(lái)理解下,大家要應(yīng)該都知道stater舉點(diǎn)例子。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>

首先自定義一個(gè)stater。

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.4.RELEASE</version>
    <relativePath/>
</parent>
<groupId>com.zgw</groupId>
<artifactId>gw-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-autoconfigure</artifactId>
    </dependency>
</dependencies>

我們先來(lái)看maven配置寫入版本號(hào),如果自定義一個(gè)stater的話必須依賴spring-boot-autoconfigure這個(gè)包,我們先看下項(xiàng)目目錄。

public class GwServiceImpl  implements GwService{
    @Autowired
    GwProperties properties;

    @Override
    public void Hello()
    
{
        String name=properties.getName();
        System.out.println(name+"說(shuō):你們好啊");
    }
}

我們做的就是通過(guò)配置文件來(lái)定制name這個(gè)是具體實(shí)現(xiàn)。

@Component
@ConfigurationProperties(prefix = "spring.gwname")
public class GwProperties {

    String name="zgw";

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

這個(gè)類可以通過(guò)@ConfigurationProperties讀取配置文件。

@Configuration
@ConditionalOnClass(GwService.class)  //掃描類
@EnableConfigurationProperties(GwProperties.class) //讓配置類生效
public class GwAutoConfiguration 
{

    /**
    * 功能描述 托管給spring
    * @author zgw
    * @return
    */

    @Bean
    @ConditionalOnMissingBean
    public GwService gwService()
    
{
        return new GwServiceImpl();
    }
}

這個(gè)為配置類,為什么這么寫因?yàn)?,spring-boot的stater都是這么寫的,我們可以參照他仿寫stater,以達(dá)到自動(dòng)配置的目的,然后我們?cè)谕ㄟ^(guò)spring.factories也來(lái)進(jìn)行配置。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.gw.GwAutoConfiguration

然后這樣一個(gè)簡(jiǎn)單的stater就完成了,然后可以進(jìn)行maven的打包,在其他項(xiàng)目引入就可以使用

<END>

掃碼加入技術(shù)交流群,不定時(shí)送書

推薦閱讀:

看看人家 SpringBoot 的全局異常處理,多么優(yōu)雅...

簡(jiǎn)直暴利?四川某加密幣礦場(chǎng)實(shí)拍曝光,一天營(yíng)收 6300 多萬(wàn)

最近面試BAT,整理一份面試資料《Java面試BATJ通關(guān)手冊(cè)》,覆蓋了Java核心技術(shù)、JVM、Java并發(fā)、SSM、微服務(wù)、數(shù)據(jù)庫(kù)、數(shù)據(jù)結(jié)構(gòu)等等。

獲取方式:點(diǎn)個(gè)「在看」,點(diǎn)擊上方小卡片,進(jìn)入公眾號(hào)后回復(fù)「面試題」領(lǐng)取,更多內(nèi)容陸續(xù)奉上。

朕已閱 

瀏覽 26
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)
評(píng)論
圖片
表情
推薦
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 五月天无码免费视频| 亚洲A片一区二区三区电影网| 欧美日韩国产性爱| 日本视频一区二区三区| 人人爽人人澡| www.蜜桃| 三级理论片| 中文字幕成人在线播放| 你懂得在线视频| 青青在线免费视频| AV一区二区三区四区| 欧美熟妇精品一级A片视色| 国产一级18片视频| 久久久18禁一区二区三区精品| 2017天天射| 中文字幕日本成人| 99精品热视频| 不卡的av| 青草中文娱乐网在线| 麻豆精品在线播放| 91久久久久久久久久久久18| a片免费网站| 一级欧美| 国产又爽又黄免费观看视频| 成人午夜小电影| 亚洲天堂成人在线| 99精品在线观看视频| 逼网站| 亚洲AV无码乱码| 亚洲av小电影| 极品少妇av| 在线毛片网站| 五月天婷婷丁香| 韩日A片| 国产精品囯产三级囯产AV野外| 嫩草99| 动漫精品一区二区| 亚洲无码高清视频在线| 大鸡巴在线视频| 久久久国产一区二区三区| 美女一级A片| 蜜臀av一区二区| 亚洲WWW| 国产成人97精品免费看片| 国产91免费| 亚洲无码色| 一级a片免费看| 黄片视频链接| 色色五月丁香婷婷| 久在线观看| 成人AV电影在线观看| 亚洲无码乱码av| 欧美成人精品在线| 日韩天天干| 杨幂操逼视频| 天天爽天天日| 高清无码视频在线播放| 色天天综合网| 国产成人精品无码免费| 日韩精品一区二区三区四在线播放| 丁香一区二区| 无码毛片一区二区三区人口| 国产激情欧洲在线观看一区二区三区 | 日韩无码影视| v天堂在线| 亚洲免费观看A∨中文| 围内精品久久久久久久久久‘变脸 | 五月丁香天堂| 欧美成人毛片一级A片| 91蜜桃视频| 黄色高清视频在线观看| 精品一区二区三区在线观看| 亚洲色图15P| 国产suv精品一区二区6精华液| 俺来也在线视频| 五月婷婷丁香五月| 亚洲精品黄色电影| 精品999| 国产免费观看av| 丁香天堂| 蜜桃免费视频| 中文字幕在线无码视频| 北条麻妃日B视频| 欧美精品成人免费片| 色人天堂| 日韩一级免费视频| 91偷拍与自偷拍精品无码| 国产嫩BBwBBw高潮| 中文字幕三级片在线观看| 国产精品无码免费| 中文字幕1区| 在线看毛片网站| 国精产品久拍自产在线网站 | 黄色视频网站国产| av色在线| 懂色av懂色av粉嫩av无码 | 亚洲码无人客一区二区三区| 国产AV影院| 九色PORNY丨自拍蝌蚪| 久久久999久久久999精神| 亚洲欧美激情小说另类| 精品成人A片久久久久久不卡三区| 成人AV在线电影| 台湾精品无码| 国产精品无毛五区六区| 黄色成人视频免费看| 成人自拍偷拍视频| 免费人成视频在线| 丁香五月在线视频| 在线视频福利导航| 99精品丰满人妻无码一区二区| 操逼人妻| 亚洲国产高清无码| 99热只有精| 欧美亚洲| 韩国无码高清视频| 国产在线成人| 青误乐在线播放| 婷婷二区| 一级成人A片| 午夜福利视频无码| 麻豆91精品人妻成人无码| 日韩一级在线免费观看| 激情操逼| 亚洲精品视频免费观看| 日本少妇高清视频| 亚洲精品无码视频在线观看| 影音先锋婷婷| 午夜日韩| 无码二区三区| 色婷婷视频一区二区| 国产亚洲一区二区三区| h成人在线| 大香蕉精品| 人人做人人做人人做,人人做全句下一| 国产麻豆AⅤMDMD0071 | 操逼视频一级| 中文字幕操逼网站| 免费看成人A片无码照片88hⅤ | www.91madou| 黄色视频在线免费看| 日本熟妇高潮BBwBBwBBw| 欧美喷水视频| 精品福利视频导航| 天天干天天干天| 综合激情五月婷婷| 大香蕉伊人av| 国产精品毛片视频| 日本最新免费二区| 国产三级电影在线观看| 男女av免费观看| 一本一道久久a久久精品综合| 亚洲熟女少妇| 三级成人免费| 成人在线91| 狠狠躁日日躁夜夜躁A片无码 | AV日韩无码| 狠狠干2022| 欧美一级二级三级| 天天色天天日天天干| 久久亚洲AV成人无码国产野外| 日韩福利| 操逼网站在线观看| 国产69久久精品成人看| 欧美激情性爱网站| 亚洲精品AⅤ一区二| 韩国成人啪啪无码高潮| 天天操一操| 亚洲精品中文字幕乱码三区91 | 日本精品人妻无码77777| 亚洲三级在线观看| 国产免费一区二区三区四区 | 人妻少妇精品视频一区二区三区| 国产91小视频| 国产小福利| 97精品人妻一区二区三区香蕉 | 亚洲AV五月天在线| 狼友视频在线看| 国产小福利| 伊香蕉大综综综合| 日韩欧美v| 中文字幕熟女人妻| 怡红院成人网| 久久久18禁一区二区三区精品 | 超碰在线人人干| 日韩无码三级视频| 一区免费在线| 亚洲午夜免费视频| 五月天色综合| 国产欧美日韩在线| 亚洲激情网址| WWW亚洲视频| 成人黄网站免费视频| 欧美激情视频一区二区| 91丨九色丨蝌蚪丨成人| 国产内射在线观看| 成人免费视频性爱| 在线观看免费黄视频| 色琪琪在线视频| 精品人妻无码一区二区三区四川人| 国产精品久久久久久久久夜色| 影音先锋男人资源站| 婷婷五月天影院| 欧洲三级片网站| 草逼网视频| 蜜臀AV网| 亚洲AV无码乱码国产精品蜜芽| 最近最好的2019中文| 1插菊花综合网| 69视频在线观看免费| 日韩一区二区无码视频| 亚洲日韩精品在线观看| 去干网欧美| 日韩AV在线免费观看| 人人草超碰| 伊人色五月天| 日韩美女在线| 日本精品二区| 色aV牛牛在线观看| 五月丁香成人电影| 成人无码免费毛片| 精品久久久国产| 五月天黄色小说| 综合色国产精品欧美在线| 91视频黄| 国产乱人伦无码视频| 国产一卡二卡在线观看| 91成人亚洲| 亚欧成人在线视频| 蜜桃做爱| 婷婷无码在线| 俺来也俺也啪www色| 黄色av影院| 最新中文| 成人AV十八亚洲二区| 香蕉婷婷| 免费看AV大片| 爱爱视频天天操| 国产精品成人无码专区| 特级西西WWW888| 亚洲天堂av在线观看| 99久久久精品久久久久久| 欧美射精视频| 色色视频网站| 国产A片精品| 最近最火中文字幕mv歌词| 成人午夜小视频| 国产AV无码成人精品毛片| 大屌av| 国产精品999999| 欧美成人黄色小说| 日韩成人免费| 操大逼视频免费国产| 国产人人爱| 国产综合精品久久久久成人AV| 大香蕉国产视频| 亚洲中文无码在线观看| 春色AV| 国产精品精品| 在线免费观看国产| 操熟女视频| 北条麻妃日B视频| 99热这里| 黄片在线网站| 青草青在线视频| 神马午夜福利视频| 国产1024在线| 亚洲AV成人无码AV小说| 青青网站| 免费黄色小视频在线观看| 无码在线高清| 日本一级黃色大片看免费| 五月无码视频| 午夜福利站| 特级西西WWW444人体聚色| 91愛爱| 第一福利导航大全| 青草无码视频| 国精产品一区一区三区四区| 地表最强网红八月未央道具大秀 | 四虎性爱视频| 欧美精品久久久久久| 人妻无码在线观看| 天堂一区在线观看| 加勒比久久综合| 亚洲av综合在线| 四虎成人无码| 久热在线视频| 国产又粗又大又爽| 北条麻妃被躁57分钟视频在线| 操逼A片| 91精品久久久久久综合五月天| 成人AV十八亚洲二区| 国产成人在线播放| 成人做爰100片免费着| 国产男女啪啪视频| 日韩精品在线观看视频| 亚洲精品麻豆| 日皮视频免费在线观看| 国产操屄网| 激情久久AV一区AV二区AV三区| 日本无码专区| 大地资源第三页在线观看免费播放最新 | AV大全在线免费观看| 天天干天| 韩国无码视频| 久热思思| 亚洲天堂2015| 免费性网| 国产日韩一区二区| 豆花视频在线观看| 日韩在线中文字幕| 四虎一区| 国产理论视频在线观看| av在线免费观看网址| 日韩无码精品视频| 一级黄片免费| 成人特级毛片| 天天日天天操天天日| 久久久久成人精品无码| www.日韩| 97人妻精品一区二区三区免 | 国产成人精品a视频一区| 欧美囗交荫蒂AAAA| 91麻豆精品91久久久久同性| 国产老熟女久久久| 大香蕉伊人在线视频| 在线高清无码视频| 国产久久久久久久| 中文字幕特黄A片| 性饥渴熟妇乱子伦| 大香蕉伊人在线手机网| 国产精品久久久久久久久久久久久久久 | 北条麻妃亚洲无码| 激情综合婷婷| 日本一区二区视频在线观看| 亚洲最大视频| 麻豆一区视频| 澳门四虎影院| 中文字幕在线观看辣文| 成人精品123| 欧美浮力| 中文精品在线| 99热这里只有精品99| 国产无码一二三区| 99久视频| 大香蕉伊人手机在线| 欧美性爱视频在线观看| 男女怕怕网站| 哪里能看毛片| 日韩肏屄视频在线观看| 少妇做爱| 男人天堂AV片| 国产36页| 天天久久| 成人午夜精品无码区| 亚洲成人无码在线| 天天日天天色天天干| 婷婷性爱| 中文无码不卡| 丁香五月欧美| 亚洲色图自拍| 最新中文字幕777私人在线| 天天爱天天插| 婷婷日韩中文字幕| 久久久久久久艹| 九色PORNY自拍视频| 亚洲无码人妻在线| 97人妻人人澡人人爽人人精品| 最新亚洲中文字幕| 日本不卡中文字幕| 亚洲高清毛片一区二区| 涩久久| 成人国产无码| 丁香av| 精品视频免费在线| 7799精品视频| 青青草视频偷拍| 日韩无码国产精品| 99草在线视频| 69av在线观看| 亚洲AV无码精品国产| 国产黄色在线观看| 9l视频自拍蝌蚪9l成人| 韩国午夜电影| 艹逼免费视频| 黄色激情AV| A片黄色电影| 欧美色图网址| 国产一区二区视频在线观看| 一起操在线视频| 精品91海角乱| 亚洲国产成人无码a在线播放| 久久免费精品视频| 黄色a级毛片| 人人爱人人摸| 黄色一级视频网站| 亚洲国产97| 色拍拍视频| 人妖黃色一級A片| 国产精品一卡| 91在线观看网站| 亭亭五月天| 国产成人精品久久| 国产精品久久| 日韩AV一二三| 日韩高清无码成人| 亚洲精品播放| 日韩黄色精品| 国产高清视频在线| 久久永久免费视频| 中国免费看片| 逼特逼视频在线观看| 玖玖国产精品| 国产电影一区二区三区| 日韩无码链接| 免费看欧美日黄片| 麻豆国产91在线播放| 在线中出| 久久久久国产视频| 日本视频免费| 羞羞色院91蜜桃| 久久久久久久大香蕉| 成人亚洲性情网站www在线| 亚洲一区二区三| 日韩无码视频一区二区| 91成人免费视频| 三级片高清无码| 俺来也影院| 青娱乐毛片| 日批视频免费观看| 免费看成人747474九号视频在线观看| 红桃视频无码| 无码人妻精品一区二区50| 18国产免费视频在线观看| 成人无码影院日韩,成人年…| 黄色欧美视频| www.日本色| 翔田千里53歳在线播放| 色婷婷18| 国产午夜激情视频| 激情日逼| 91欧美视频| 99热只有精| 日本东京热视频| 中文字幕av一区二区| 特黄特色一级特黄大片| 婷婷性爱| 欧美第一色| 日韩欧美国产成人| 爽好紧别夹喷水网站| 迷情校园综合| 成人A片在线播放| 日韩A电影| 久久成人无码电影| 日本黄色视频官网| 色呦呦中文字幕| 色哟哟一中文字慕| 色婷婷激情五月天| 国产精品a片| 亚洲午夜无码久久久| 国产中文字幕亚洲综合欧美| A在线免费观看| www.俺去啦| 人操人人| 亚洲成人性爱网站| 午夜福利在线播放| 亚洲AV成人片色在线观看麻豆 | 日韩bbbb| 色网在线| 成年人视频在线免费观看| 国产一精品一aⅴ一免费| 91你懂的| 欧美XXX视频| 欧美AAA| 三级视频网站| 色综合一区二区| 国产AV剧情| 天天色免费视频| 日本黄在线观看| 黄色小说视频| 国产最新在线视频| 18禁一区二区三区| 天堂一区二区18| 亚洲欧洲自拍| 黄片视频大全| 亚洲午夜在线观看| 2021天天夜日| 91热99| 色婷婷视频在线| 狠狠干网站| 麻豆黄色电影| 91天天综合| 亚洲欧美国产日韩字幕| 久久99精品国产.久久久久久 | 久久视频99| 欧美日韩免费在线播放电影在线播放电影在线播放电影免费 | 日韩A片在线观看| 欧美午夜无码| 狠狠干B| 一区二区免费视频| 人妻精品一区二区| 骚逼影视| 国产资源网| 草逼免费视频| 久久久久无码| 可以免费看av的网站| 亚洲无码人妻一区| 高清无码三级片| 五月丁香性爱| 黄色福利视频在线观看| 亚洲精品无码永久| 免费黄色在线视频| 国产精品无码av| 逼逼视频| 中文无码日本高潮喷水| 在线观看黄色视频网站| 热99视频| 国产精品S色| 欧美特黄AAA| 欧美日韩久久| 成人在线国产| 亚洲中文字幕人妻| 超碰人人搞| 六月丁香五月天| 強姧伦一区二区三区在线播放 | 黄色一级片免费观看| 成年人免费看视频| 特黄视频| 日韩成人一区| 亚洲AV性爱| 91插插插插| 体内射精免费视频| 国产精品毛片久久久久久久| 亚洲成人网在线| 日韩专区在线观看| 激情二区| 日本高清版色视频| 毛片毛片毛片毛片| 玖玖99视频| 国内精品久久久久久久久久| 欧美精品国产动漫| 91在线观看| 波多野结衣AV在线播放| 国产无码中文| 国产aaaaaa| 688AV秘无码一区二区| 伊人青草视频9| 91av| 一级黄片免费观看| 91在线不卡| 日本久久播| 欧美视频在线免费| 国产AV激情| 欧美福利| 国产嫩BBwBBw高潮| 91天天爽| 三级影片在线观看性| 国产主播精品| 99久久久成人国产精品| 中国九九盗摄偷拍偷看| 欧美视频a| 日韩免费视频一区| 中文字幕+乱码+中文字幕一区| av久| 久久免费黄色视频| 五月天国产精品| 在线内射视频| 欧美日韩亚洲一区二区| 双腿张开被9个男人调教| A级片黄色片| 五月天黄色电影| jizz在线免费观看| 日韩中文字码无砖| 国产毛片777777| 中文字幕精品视频在线| 激情青青草| 国产吃奶| 毛片毛片毛片| 一级黄色视频网站| 狠狠操狠狠撸| 黄色国产AV| 久久婷婷婬片A片AAA| 懂色AV无码中字幕一区| 99er这里只有精品| 成人精东影业JDAV3密友| 日韩黄色电影在线观看| 一区二区三区高清| 久久免费视频播放| 久操视频免费在线观看| 亚洲精品女人| 四虎最新地址| 国产精品51麻豆cm传媒| 五月天av在线观看| 伊人乱伦| 天天干天天草| 手机看片日韩| 亚洲中文字幕影院| 天天爱天天爽| 久久一道| 亚洲欧美另类色图| 亚洲欧美日韩成人| 99精品一区二区三区| 草免费视频| 韩国无码视频| 成人在线免费| 亚洲无码在线电影| eeuss一区| 91精品国产麻豆国产自产在线| 天天日天天日天天干| 国产jizz| gogogo日本免费观看高清电视剧的注意| 一区高清| 五月天国产视频| 91人妻一区| 天堂精品在线| 欧美婷婷| 久久性视频| 亚洲高清无码在线| 人妻精品一区二区三区| 护士小雪的yin荡高日记H视频 | 人妻丝袜无码视频专区| 美女扣穴| 91操b| 国内自拍视频网站| 国产精品一区二区在线播放| 日韩一区二区在线看在线看| 人人人人干| а√在线中文网新版地址在线| 午夜性爽视频男人的天堂| 精品一二三区| 日本超碰| 全国最大成人网站| 日韩无码激情| 午夜无码熟妇丰满人妻| 四川BBB搡BBB搡多人乱| xxx日韩| 中文无码一区二区三区| 成年女人免费视频| 成人精品一区二区三区中文字幕| 欧美视频基地| 国产三级黄| 日韩精品成人av| 自拍偷拍视频网| 欧美日韩日逼视频| 亚洲天堂中文| 日日夜夜综合| 天天看高清无码| 伊人久久大香蕉国产| 2024av在线| 日本少妇高潮喷水XXXXXXX| 欧美精品欧美精品系列| 大地资源第三页在线观看免费播放最新 | 青青草超碰| 性无码专区| 熟女中文字幕| 色五月激情五月| www.av在线| 国产性爱在线| 午夜福利黄色| 日本免费爱爱视频| 久久久999精品日韩一区二区| 亚洲黄色电影网站| 无码在线免费观看视频| 国产一级AAAAA片免费| 国产不卡在线| 久久av一区二区三区| 青娱乐偷拍| 麻豆中文字幕| 特级黄色片| 成人伊人| 九一精品| 91激情| 日韩aaa| 国产激情都市一区二区三区欧美| 中国老太卖婬HD播放| 久久丁香五月婷婷五月天激情视频| 无码欧美| 国产清纯可爱美女自卫裸贷偷情| 肉片无遮挡一区二区三区免费观看视频 | 久久久久久免费毛片精品| 91视频在线网站| 日日骚av一区二区三区| 亚洲中文字幕观看| 欧一美一色一伦一A片| 亚洲视频免费在线播放| 天天综合干| 婷婷五月久久| 欧美日本国产| 亚洲无码专区在线| 久久久一区二区三区四区| 成人午夜福利网站| 国产综合第一页| 中文字幕成人电影| 黄色视频日本| 欧美日韩国产尤物主播精品| 中文字幕一区二区蜜桃| 亚欧成人在线视频| 色图插插插| 69AV网站| 人人操人人妻人人看| 无码在线观看免费| 激情久久av| 精品一区电影| 欧美色址| 2019天天干| www.国产视频| 国产精品无码怀孕软件| 成人A片视频| 小日本91在线观看| 国产欧美激情| 国产成人tv| 俺去也AV| 国产xxxx视频| 草逼视频免费看| 免费欧美性爱| 日韩黄色三级| 久久综合中文| 日韩视频免费| 国产91无码精品秘入口在线观看| 蜜臀久久99精品久久久巴士| 日本一节片在线播放| 日韩美女做爱| 青娱乐A片| 久久久91人妻无码精品蜜桃ID| 日韩久久精品视频| 2019国产精品| 三级片日韩| 日韩高清无码不卡| 国产TS丝袜人妖系列视频| 亚洲无码高清在线观看| 俺来也操逼| 蜜桃精品久久久| 北条麻妃无码视频在线| 中文字幕一级A片高清免| 久久无码在线观看| 中文字幕在线免费播放| 欧美成人午夜视频| 男人网站| 黄网站免费观看| 天天干天天撸影视| 天天欧美| 成人激情四射网| 成人网站www污污污网站公司| 黄色电影a片| 人妻精品一区二区| 亚洲一级Av无码毛片久久精品| 亚洲五月婷婷| 黄色片免费视频网站| 超碰97观看| 亚洲无码乱码精品| 中文字幕日本无码| 拍真实国产伦偷精品| 91小仙女jK白丝袜呻吟| 精品视频一区二区三区| 北条麻妃电影九九九| 西西444WWW无码视频软件功能介绍 | 国产美女网站| 色综合99久久久无码国产精品| 久草视频这里只有精品| 偷拍亚洲天堂| 人妻精品一区二区| 免费无码国产在线53| 人妻japanesewoman| 日韩一区二区三区在线视频| 国产精品999999| 免费黄色视频在线| 张柏芝BBw搡BBBB槡BBBBHDfree| 五月丁香综合激情| 九色视频在线观看| 日韩高清无码成人| 日韩精品极品视频在线观看免费| 欧美一级欧美三级在线观看| 性爱av在线| 国产少妇| 最近中文字幕2022在线观看A | 口工视频| 精品国产欧美一区二区三区成人| 日韩免费高清无码| 精品乱子伦一区二区三区,亚洲国产成| 手机AV免费| 亚洲无码乱码av| 五月婷婷婷婷| 小黄片免费| 伊人激情网| 北条麻妃精品青青久久价格| 免费国产黄色视频网站| 久久精品视频一区| 少妇黄色视频| 在线观看黄色片| 大帝AV| 国产亚洲精品久久久波多野结衣| 欧美日韩在线看| 日本不卡视频在线| 日韩婷婷| 看欧美黄片| 无码熟妇人妻无码AV在线天堂 | 亚洲一区二区av| 黄片网站在线观看| 高清无码一区二区在线| 视频你懂的| 中文字幕一区二区三区四区五区六区| 黄色视频网站在线| 三上悠亚一区二区| 亚洲美女网站免费观看网址| 91丝袜一区二区三区| 亚洲综合免费观看高清| 久久V| 国产91页| 一级a性色毛片| 免费看成人片| 99中文字幕| 超碰在线最新| 性生活无码视频| 日本伊人大香蕉| 国产精品视频播放| 亚洲精品无码在线播放| 国产91探花精品一区二区| 欧美成人黄色A片| 日韩高清一区| 中文字幕资源站| 四川少BBB搡BBB爽爽爽| 精品成人一区二区三区| 久久久性爱视频| 少妇69p| 晚上碰视频| 青青操网| 五十路在线| 亚洲a在线视频| 欧美黄色精品| 7777av| 久久青留社区金玉| 久久AV电影| 做爰视频毛片下载蜜桃视频。| 国产少妇| 免费观看高清无码视频| 宅男噜噜噜66一区二区| 91日日夜夜| 免费中文字幕日韩欧美| 国产黄色电影在线| 手机看片1024国产| 日韩中文字幕无码| 影音先锋无码一区| 午夜黄色视频在线观看| 西西444www无码精品| 日韩精品成人专区无码| 日韩A片免费观看| 麻豆传媒电影| 午夜国产| 日本少妇性爱视频| 日韩成人黄色| 亚洲天堂无码视频| 99大香蕉视频| 婷婷午夜福利| 刘玥91精一区二区三区| 老师机性爱视频在线播放| 久久久久久久久久久久高清毛片一级 | 亚洲激情网址| 91热爆TS人妖系列| 国产激情视频在线播放| 无码一区二区三区四区| 亚洲色图15| 日本A片在线播放| 强开小嫩苞一区二区三区视频| 高清毛片AAAAAAAAA郊外| 欧美毛片在线观看| 免费的av| 91人妻人人澡人人爽人人精品一 | 91狠狠| 精品国产乱子伦一区二区三区,小小扐 | 泄火熟妇2-ThePorn| 性欧美丰满熟妇XXXX性久久久 | 成人色色网| 密臀福利导航| 无码在线免费播放| 国产三级片在线视频| 亚洲精品色色| 免费日韩无码| 波多野结衣无码AV在线| 在线观看免费视频无码| 日日艹夜夜艹| 欧美在线一区二区| 国产精品黑人ThePorn| 视频二区| 嫩BBB槡BBBB槡BBB3i| 亚洲日本中文字幕在线| 无码V| 夜夜骚AV一二三区无码| 视频一二三区| 精品成人A片久久久久久不卡三区| 亚洲精品无码在线观看| 国产在线观看你懂的| 一本一道无码免费看视频| av福利电影在线| 国产乱论视频| 黄页网站免费观看| 麻豆国产成人AV一区二区三区| 69式荫蒂被添全过程| 嫩草av| 围内精品久久久久久久久白丝制服 |