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

10000 字講清楚 Spring Boot 注解原理

共 29317字,需瀏覽 59分鐘

 ·

2021-08-03 22:12

首先,先看SpringBoot的主配置類:
@SpringBootApplication
public class StartEurekaApplication
{
    public static void main(String[] args)
    
{
        SpringApplication.run(StartEurekaApplication.classargs);
    }
}

點(diǎn)進(jìn)@SpringBootApplication來看,發(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 
{

}

首先我們先來看 @SpringBootConfiguration:

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

可以看到這個(gè)注解除了元注解以外,就只有一個(gè)@Configuration,那也就是說這個(gè)注解相當(dāng)于@Configuration,所以這兩個(gè)注解作用是一樣的,它讓我們能夠去注冊一些額外的Bean,并且導(dǎo)入一些額外的配置。

那@Configuration還有一個(gè)作用就是把該類變成一個(gè)配置類,不需要額外的XML進(jìn)行配置。所以@SpringBootConfiguration就相當(dāng)于@Configuration。進(jìn)入@Configuration,發(fā)現(xiàn)@Configuration核心是@Component,說明Spring的配置類也是Spring的一個(gè)組件。

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

繼續(xù)來看下一個(gè)@EnableAutoConfiguration,這個(gè)注解是開啟自動(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è)而組成的,我們先說@AutoConfigurationPackage,他是說:讓包中的類以及子包中的類能夠被自動(dòng)掃描到spring容器中。

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

使用@Import來給Spring容器中導(dǎo)入一個(gè)組件 ,這里導(dǎo)入的是Registrar.class。來看下這個(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));
        }
    }

就是通過以上這個(gè)方法獲取掃描的包路徑,可以debug查看具體的值:

那metadata是什么呢,可以看到是標(biāo)注在@SpringBootApplication注解上的DemosbApplication,也就是我們的主配置類Application:

其實(shí)就是將主配置類(即@SpringBootApplication標(biāo)注的類)的所在包及子包里面所有組件掃描加載到Spring容器。因此我們要把DemoApplication放在項(xiàng)目的最高級中(最外層目錄)。

看看注解@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è)場景需要的所有組件,并配置好這些組件。

有了自動(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中獲取資源,然后通過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常見的一些類已經(jīng)自動(dòng)導(dǎo)入。

接下來看@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:就是說,他已經(jīng)把很多東西準(zhǔn)備好,具體是否使用取決于我們的程序或者說配置。

接下來繼續(xù)看run方法:

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

來看下在執(zhí)行run方法到底有沒有用到哪些自動(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)聽器
    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)來看。

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)來看:

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的加載過程。繼續(xù)來看一個(gè)方法叫做 onRefresh():

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

他在這里并沒有直接實(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());他是通過工廠的方式創(chuàng)建的。

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

可以看到 它是一個(gè)接口,為什么會(huì)是接口。因?yàn)槲覀儾恢故荰omcat一種web容器。

我們看到還有Jetty,那我們來看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è)過程當(dāng)中,我們可以看到創(chuàng)建Tomcat的一個(gè)流程。

如果不明白的話, 我們在用另一種方式來理解下,大家要應(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>

我們先來看maven配置寫入版本號,如果自定義一個(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+"說:你們好啊");
    }
}

我們做的就是通過配置文件來定制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è)類可以通過@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)椋瑂pring-boot的stater都是這么寫的,我們可以參照他仿寫stater,以達(dá)到自動(dòng)配置的目的,然后我們在通過spring.factories也來進(jìn)行配置。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.gw.GwAutoConfiguration
然后這樣一個(gè)簡單的stater就完成了,然后可以進(jìn)行maven的打包,在其他項(xiàng)目引入就可以使用。
來自:博客園

鏈接:cnblogs.com/cmt/p/14553189.html

瀏覽 33
點(diǎn)贊
評論
收藏
分享

手機(jī)掃一掃分享

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

手機(jī)掃一掃分享

分享
舉報(bào)

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

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 久久婷婷视频| 国产av一区二区三区| 午夜成人网站| 成人免费在线网站| 天天草网| 国产香蕉视屏| 精品国产99| 天天综合干| www,色婷婷| 中文字幕五月久久婷婷| 大香蕉一区二区| 一级免费视频| 十八禁福利网站| 黄色片免费观看| 97人妻一区二区三区| 久久大香蕉网| 国产精品偷拍视频| 91视频在线观看网| 亚洲操逼网站| 亚洲国产免费| 黄色电影A| 波多一区| 国内综合久久| 欧美成人A片在线观看| 男女无码| av在线观看中文字幕| 蜜桃亚洲AV无码一区二区三区| 亚洲人成77777| 五月婷婷六月丁香| 日韩av电影在线观看| 天天操夜操| 影音先锋成人在线资源| 久久久久黄| 国产中文人人国际| 青草网| 亚洲丁香五月| 成年人视频在线免费观看| 日本aaaa片| 青娱乐A片| 永久免费看片视频5355| 亚洲无码高清在线观看| 99精品在线免费观看| 日本高清不卡视频| 亚洲无码AV一区二区| 97精品超碰一区二区三区| 444444免费高清在线观看电视剧的注意 | 波多野结衣一级婬片A片免费下载 囯产精品久久久久久久久免费无码 | 亚洲精品午夜精品| 91免费看片| NP玩烂了公用爽灌满视频播放 | 国产精品91在线| 国产视频无码在线| 大鸡巴操小逼视频| 桃色五月天| 国产剧情一区二区av在线观看| 久久九九国产| 高清无码网| 少妇搡BBBB搡BBB搡毛片少妇| 少妇嫩搡BBBB搡BBBB| 中文无码不卡| 好吊视频一区二区三区红桃视频you | 国产激情在线| 麻豆自拍偷拍| 中文字幕国产综合| 亚洲A√| 久久无码人妻精品一区二区三区| 亚洲有码在线播放| 蜜桃高清无码| 在线免费观看黄色电影| 日韩无码精品一区二区三区| 亚洲精品一级| 先锋影音资源一区| 伊人黄色网| 欧美精产国品一二三产品动漫| 久久久久久毛片| 97中文在线| 重庆美女揉BBBB搡BBBB| 在线无码视频观看| 国产精品视频免费看| 无码一二区| 999福利视频| 青娱乐AV在线| 97色吧| 欧美四区| 日本视频一区二区| 日p视频在线观看| 亚洲高清毛片一区二区| 日韩中文字幕电影| 精品国产AⅤ麻豆| 少妇白洁视频| 中文字幕第10页| 就要干就要操| 在线观看免费一区| 日本免费色视频| 天天操人人射| 亚洲国产精品成人综合色在线婷婷 | 色呦呦视频| 伊人综合干| 91新婚人妻偷拍| 大鸡吧操逼| 天天狠天天干| a级黄色视频免费观看| 神马Aⅴ| 国产成人电影| 青青草无码成人AV片| 伊人网视频在线观看| 嫩草av| 日本成人中文字幕| 日韩成人无码一区二区| 97久久精品国产熟妇高清网| 黄片大全在线观看| 日本无码在线播放| 黄色动态视频| 性色网| 国模在线| 江苏妇搡BBBB搡BBBB小说 | 久久五月丁香| 亚洲精品成AV人片天堂无码| 国产精品无码专区AV免费播放| 欧美色噜噜| 日韩午夜电影| 日韩精品三级| 亚洲天堂AV网| 亚洲AV小说| 日一日干一干| 成人亚洲在线| 色婷婷综合激情| 北条麻妃无码精品| 黄色影院在线观看| 中文日韩欧美| 第四色大香蕉| 秋霞A片| 久久爆乳一区二区三区| 国产成人精品AA毛片| 中文字幕日韩在线观看| 亚洲无码在线电影| 九九热在线视频| 国产AV天堂| 亚洲综合五月天婷婷丁香| 大香蕉电影网| 熊猫AⅤ| 俺来也俺去啦欧美www| 亚洲去干网| 久久久久久久久久免费视频| 亚洲精品无码在线播放| 亚洲中文无码在线观看| 天天日天天噜| 真人一级毛毛片| 豆花成人视频在线观看| 日韩一区二区三区精品| 国产3级片| 91精品国产aⅴ一区二区| 日一日干一干| 精品视频久久久| 操逼大香蕉| 国产ts在线| 爱干视频| 久操播放器| 激情日逼| 亚洲国产成人精品激情在线| 妹子色综合| 色欲一区二区三区| 亚洲AV毛片成人精品网站| 人人人人人人操| 99视频在线精品| 91黄色视频在线播放| 自拍偷拍精品视频| 亚洲色综合久久五月| 操操操影院| 国产在线观看av| 婷婷五月天激情小说| 东北嫖老熟女一区二区视频网站 | 青春草在线免费观看| 狠狠干2022| 狠狠2021| 午夜天堂在线观看| 国产乱伦中文字幕| 久久免费视频播放| 特黄aaaaaaaa真人毛片| 男女激情网站| 蜜桃黄片AV在线观看| 一本久久A精品一合区久久久 | 操一炮在线视频| 18成人毛片| 男人的天堂婷婷| 91人人妻人人澡人人爽人人精品| 蜜桃系列一区二区精品| 欧美在线v| 亚洲AV无码成人精品区| 国产美女自慰网站| 日韩欧美高清| 国产色黄视频| 青青日逼| 一级黄色视频片| 自拍超碰在线| 91亚洲国产成人久久精品麻豆| 91九色首页| 男男做受A片AAAA| 涩涩99| 青青草五月天色婷婷丁香| 黄色免费在线观看网站| 国内无码精品| 天堂网2018| 大香蕉伊人精品| 亚洲中文免费视频| 91蝌蚪| 亚洲乱伦| 成人五月天黄色电影| 神马午夜三级| 色五月婷婷基地| 日韩人妻在线视频| 一级免费视频| 日韩在线观看网站| 操逼视频下载| 草在线| 51精品国产| 久久丝袜| 木牛AV| 免费高清无码视频在线观看| www.亚洲视频| 蜜桃AV在线播放| 成人激情在线| 久久精品禁一区二区三区四区五区| 国产A片一区| 欧美BBWBBWBBWBBWBBwBBW| 午夜成人福利片| 黄色成人在线视频| gogogo视频在线观看黑人| 国产三级成人| 日本国产视频| av片在线观看| 欧美黄色A片| 色欧美大香蕉| 麻豆www| 大香蕉免费在线| 大香蕉av在线观看| 亚洲无码第一页| 人人妻人人澡人人爽久久| 三须三级久久三级久久18| 欧美国产一区二区| 中文在线字幕高清电视剧| 日韩欧美久久| 中文字幕五月久久婷婷| 插穴网站| 六月天婷婷| 免费无码在线观看| 大香蕉伊人成人网| 日本精品视频一区二区| 亚洲av无码乱码| 亚洲卡一卡二| 一本大道香蕉av久久精东影业| 激情黄色毛片| 亚洲精品国产精品国自产网站| 微拍福利一区| 中文字幕在线视频观看| 欧美激情伊人| 日本久久综合网| 人妻操逼| 超碰免费在线| 久久久久亚洲AV无码成人片| 操操色| 99这里只有精品视频| 老司机AV91| 色色网的五月天| 黑人狂躁女人高潮视频| 强奸乱伦制服丝袜| 亚洲第一综合网| 亚洲AV秘成人久久无码海归| 在线91| 成人做爰100片免费看| 欧美一区二区三区成人| 91狠狠色丁香婷婷综合久久精品| 日日夜夜av| 乱伦一级黄片| 伊人666| 先锋资源av在线| www.97色色| 亚洲伊人在线| 国产精品高潮呻吟| 天堂中文网| 亚洲中文字幕高清| 爱爱视频免费看| 国产精品视频你懂的| 日韩精品丰满无码一级A片∴ | 91视频美女| 在线观看视频免费无码免费视频| 亚洲欧洲免费视频| 91操视频| 久久久久麻豆V国产精华液好用吗 色噜噜狠狠一区二区三区牛牛影视 | 婷婷丁香五月花| 亚洲免费观看高清完整版在线观| 国产高清免费视频| 草逼免费看| 超碰人人操在线| 江苏妇搡BBBB搡BBBB小说 | 国产精品视频一区二区三| 毛片无遮挡| 日本内射网站| 夜夜骑婷婷91| 黄色一级视频在线观看| 中文字幕乱码中文字乱码影响大吗| 中文AV第一页| 一区二区三区无码区| 人人操在线观看| 亚洲成人福利在线| 亚洲AV成人无码一区二区三区| 成人午夜福利电影| 三级无码av| 久久婷婷婬片A片AAA| 婷婷中文字幕| 欧美老妇大BBBBXXXX| 中文字幕一区二区三区日本在线 | 中文字幕一区二区三区四虎在线| 婷婷视频网站| 日韩欧美成人在线观看| 99在线免费观看| jizz18日本| 免费手机av| 一区二区三区国产| AV资源在线免费观看| 国产一级a毛一级a做免费高清视频| 国产欧美综合精品| 国內精品久久久久久久| 亚洲理论电影| 国产A片视频| 一区二区三区四区五区六区高清无吗视频| www,色婷婷| 国产永久免费| 精品无码一区二区三区四区五区| 欧美毛片在线观看| 蜜桃91精品秘入口| 大香蕉久久伊人| 国产一区二区AV| 边摸边插| 国产91网| 亚洲天媒在线播放| 激情婷婷网| 欧美黄色性爱视频| 国产91高跟丝袜| 欧洲成人免费视频| 99乱伦| 91精品国产成人观看| 国产精品久久久大香蕉| 日韩极品视频| 国产性受XXXXXYX性爽| 久久XX| footjobvk| 黄色激情五月| 日韩在线一区二区| 91中文字幕网| 97超碰在线免费观看| jzzijzzij亚洲成熟少妇在线观看 九色蝌蚪9l视频蝌蚪9l视频成人熟妇 | 日韩V欧美| 欧美成人黄色小说| 在线一区二区三区四区| 成年人AV| 日韩在线精品| 人人草人人看人人摸| 欧美男人的天堂| 国产熟女一区二区视频网站| 国产成人免费在线视频| 亚洲群交| 99精品视频国产| 欧美手机在线| 亚洲最大网站| 狠狠干狠狠草| 爱爱视频天天操| www.51av| 久草高清视频| 激情五月丁香婷婷| 操逼免费观看视频| 91精品国产偷窥一区二区| 午夜av免费| 欧美日韩东京热| 大香蕉视频国产| 午夜九九九| 欧美黄色站| 免费A在线观看| 午夜福利干B在线免费小视频| 波多野结衣一二三区| wwwav| 羽月希奶水饱胀在线播放| 久久黄网| 狼友视频免费在线观看| 91在线无码| 欧美色图俺去了| 尤物无码| 日韩无码AV中文字幕| 亚洲日本在线观看| 国产成人777777精品综合| 久久精品视频在线观看| 五月婷在线视频| 久久久1| 新BBWBBWBBWBBW| 日本一级a片| 免费尻屄视频| 强伦轩一区二区三区四区播放方式| 大香蕉尹人在看| 亚洲在线中文字幕| 七十路の高齢熟女千代子下载| 一级欧美一级日韩| 男女乱伦视频| 在线观看一区| 99在线视频免费| 97精品视频| 成人先锋| 国产一级a毛一级a毛片视频黑人| 欧美操BB| 亚洲高清福利| 天天骑夜夜操| 操逼免费观看视频| 亚洲色综合| 成人H在线| 美女被操免费网站| 99成人网站| 91大神免费观看| 国产精品成人无码专区| 国产高清毛片| 亚洲AV成人无码精品直播在线| 国产高清无码免费视频| 午夜激情视频网站| 国产天堂av| 国产做受91| 亚洲成人不卡| 日韩精品欧美一区二区三区| 老司机视频在线视频18| AV三级片网站| 丰满岳乱妇一区二区三区| 1024香蕉视频| 国精品91无码一区二区三区在线 | 欧美黄色一级网站| 欧美精品99| 成人电影综合网| 逼特逼| 日皮在线观看| 国产一级黄色毛片| 丁香五月激情网| 日韩无码电影| 亚洲AV日韩AV永久无码网站| 一区二区三区四区精品视频| 黄色插逼视频| 中文日韩字幕| 波多野结衣与黑人| 国产成人久久777777黄蓉| 久久婷香| 操比免费视频| 欧美午夜福利在线观看| 手机AV在线观看| 无码在线免费| 欧美一级视频在线观看| 91人体视频| 成人黄片18| 探花极品无套大学生| 亚洲天堂在线视频| 69国产精品成人无码视频色| 日韩V欧美| 久久精品视频在线观看| 2021国产视频| 国产亚洲99久久精品| 一级成人A片| 99久久9| 国产激情在线视频| 精品久久一区二区| 亚洲天堂美女| 狼人久久| 久久嫩草国产成人一区| 国产欧美一| 麻豆免费视频| 无码欧美成人AAAA三区在线| 天天日天天干麻豆| 国产精品午夜成人免费| 九色PORNY丨自拍蝌蚪| 欧美自拍性爱视频| 中文字幕视频网站| 亚洲精品麻豆| 亚洲www| 色综合久久天天综合网| 骚逼自拍| 色男人天堂| 成人无码一区二区三区| 搡BBB搡BBBB搡BBBB'| 免费视频一区| 岛国无码破解AV在线播放| 久草大香蕉视频| 国产小视频在线| 五月婷婷无码| 日韩无码a| 无码在线免费观看| 2025国产成人精品一区| 一级片AV| 兔子先生和優奈玩游戲脫衣服,運氣報表優奈輸到脫精光 | 人人妻日日摸狠狠躁| 成人一级电影| 丰满人妻一区二区三区四区54| 亚洲天堂人妻少妇| 少妇嫩搡BBBB搡BBBB| 美国无码| 日韩va亚洲va欧美va高清| AV在线精品| 中文字幕高清无码在线| 广西少妇BBwBBwBBw| 免费av大全| 99热在线观看免费精品| 在线看毛片网站| 91无码人妻传媒tv| 免费日本黄色| h视频免费看| 天天日毛片| 麻豆人妻换人妻好紧| 亚洲无码图片| 东京热观看| 偷拍99| 国产美女啪啪视频| 欧美综合自拍| 91丨九色丨熟女老版| 欧美综合激情| 亚洲天堂网在线视频| 亚洲永久天堂| 日日夜夜精品| 无码精品人妻一区二区三区漫画| 四虎操逼| 中文字幕无码综合| 蜜柚av| 欧美亚洲日韩国产| 国产A片电影| 欧美高清国产| 日本操B| 日韩家庭乱伦| 操人视频网站| 一级成人视频| 爽好紧别夹喷水无码| aaa免费视频| 欧美性爱18| 国产黄色片网站| 国产高清视频在线| wwwxxx18| 成人网站www污污污网站公司| 西西444WWW无码视频软件| 91精品国产综合久久久不打电影| 亚洲AV无码成人| 麻豆成人精品| 久久久久亚洲AV成人片乱码| 99性爱视频| 毛多水多丰满女人A片| 精品乱子伦| 91青青视频| 国产精品18在线| 豆花成人视频| 俺来也在线视频| 国产在线拍揄自揄拍无码男男 | 高清无码网址| h视频免费看| 日本国产高清| 一区二区不卡视频| 国产棈品久久久久久久久久九秃 | 日韩无码三级视频| 精品人妻一区二区三区四区不卡在 | 97人妻人人澡人人爽人人| 性欧美xxxx| 91亚洲精品久久久久蜜桃| 欧美综合色| 亚洲精品一区二区三区新线路| 操操综合| 亚洲五月六月| 爆乳一区二区三区AV| 久草综合视频| 国产棈品久久久久久久久久九秃 | 亚洲视频在线观看网站| 思思热思思操免费视频| 黄片免费大全| 国产色情在线| 哪里能看毛片| 九七精品| 曰韩精品| 中国一级黄片| 91色色| 高清无码在线观看18| 亚洲视频a| 黄片视频在线播放| 午夜无码福利视频| 成人国产片女人爽到高潮| 视频一区中文字幕| 欧美午夜福利电影| 二区三区免费视频| 亚洲AV人人夜夜澡人人| 超碰P| 成人免费区一区二区三区| 77777色婷婷| 真实国产乱子伦毛片| 中文字幕你懂的| 先锋成人av| 久艹在线视频| 亚洲a级毛片| 国产激情在线观看| 久久精品免费观看| 免费毛片网| 老熟妇一区二区三区啪啪| 亚洲国产成人一区二区| 天天操夜夜操狠狠| 欧美日韩一级在线观看| 伊人成人视频在线观看| 欧美色图在线视频| 人妻无码一区二区三区摄像头 | 天天射夜夜骑| 日本操骚逼| 怡红院AV| av水果派| 午夜电影无码| 再深点好爽灬轻点久久国产| jizz日韩| 亚洲AV无码乱码国产精品黑人| 六月婷婷七月丁香| 日本伊人网| 精品一区二区三区四区| 亚洲AV无码成人精品| 日韩国产高清无码| wwwxxx18| 亚洲电影无码| 久草视频免费看| 91视频第一页| 日逼大香蕉| 97人妻人人操| 激情亚洲五月天| 一区二区免费视频| 免费看无码网站成人A片| 国产在线秘麻豆精品观看| 丝袜美腿亚洲综合| 久久久人妻熟妇精品无码蜜桃| 俺来俺也去| 亚洲精品久久久久毛片A级绿茶| 手机av网站| 51成人精品午夜福利| 91麻豆精品在线| 人妻无码一区二区三区免费 | 色天堂污| 伊人精品| 高清无码视频免费看| 亚洲视频在线观看中文字幕| 国产乱伦片、| 麻豆91网站| 东方美美高清无码一区| 国产黄网| 天天干天天添| 国产一级婬片A片| 中国操逼视频| 精品无码在线| 欧美八区| 麻豆激情| 特大妓女BBwBBWBBw| AAA无码| 国产精品久久久久久久久久久久久久久 | 欧美操逼在线观看| 亚洲成人精品AV| 秋霞午夜福利影院| 人妻中文字幕av| 影音先锋色资源站| 中字幕视频在线永久在线观看免费| 蜜桃久久久久久久| 吴梦梦md0069| 日本50路熟女| mm131亚洲国产精品久久| 国产一区二区三区在线| 在线观看视频一区| 国产免费一区二区在线A片视频| 伊人无码视频| www.狠狠| 日韩A级毛片| 翔田千里无码XXXXXX| 操逼大香蕉| 久久久久久久免费视频| 欧美老熟妇乱大交XXXXX| 国产精品国产三级国产专业不| 综合中文字幕| AV日韩无码| 久操福利视频| 亚洲无码高清视频在线| 黄片免费视频观看| 囯产精品久久久久久久久久辛辛| 国产精品77777| 成人四区| 中文无码日本一级A片人| 久色精品| 91在线无码精品秘入口国战| 国产精品大全| 日本特黄| 国内精品卡一卡二卡三| 日本AⅤ在线观看| 成人婷婷| 成人免费在线| 91蝌蚪网| www.俺来也| 国产一级免费| 人人操在线观看| 在线激情| 日韩中文字幕AV| 免费一级无码婬片A片APP直播| 97碰碰碰| 精品国产久久| 久久久三级| 操逼逼网| 日韩人妻精品无码| 91成人做爰A片| 久久精品| 免费观看色情视频| 久久无码黄片| 91麻豆精品国产91久久久久久久久| 中文字幕日韩欧美在线| AA片免费| 97色色视频| 日本熟妇在线| 91在线成人电影| 丁香花激情网| 日韩少妇无码视频| 欧美一卡| 色色视频在线观看| 国产福利一区二区| 国产成人av在线| 综合无码| 国产欧美日韩在线| 亚洲精品无码在线观看| 美妇肥臀一区二区三区-久久99精品国 | 男女AV在线| 中文无码在线视频| 国产成人免费在线观看| 成人无码专区| 亚洲激情在线| 久久夜色视频网| 久艹AV| 天天爱夜夜爱| 韩国一区二区在线观看| A级毛片视频| 亚洲精品一区二区三区四区五区六区 | 超碰97人人爱| 伊人青青操| 精品一区二区三区免费| 欧美成人精品欧美一级| 中文字幕天天干| 蜜桃传媒一区二区亚洲| 久久久网| 亚洲无码电影在线| 亚洲三级在线观看| 欧美性猛交一区二区三区精品| 亚洲精品天堂无码| 台湾色综合| 亚洲有码在线视频| 久久婷婷国产综合| 六月婷婷中文字幕| 影音先锋国产精品| 亚洲综合一区二区| 国产第二页| 白虎高清无码大尺度免费在线观看| 天堂亚洲精品| 97香蕉久久夜色精品国产| 操逼网站在线看| 国产三级片无码| 成人午夜在线| 国产成人无码区免费AV片在线| 苍井空二区| 天天色天天| 青青青青操| 亚洲免费观看高清完整| 青娱乐精品在线视频| 人人射人人爱| 免费黄片视频在线观看| 婷婷五月天综合网| 婷婷久久久| 高清无码1区| 五月天激情啪啪| 亚洲无码av电影| 26uuu国产| 在线观看的av网站| 免费观看黄色片| h网站在线观看| 性感欧美美女| AV在线播放中文字幕| 肏屄在线观看| 大香蕉天天操| 无码人妻在线| 日本中文字幕电影| 亚洲成人无码视频| AV无码国产| 性性性性性XXXXX| 亚洲伊人大香蕉| 亚洲AV小说| 亚洲中文网| 久久一级片| 麻豆疯狂做受XXXX高潮视频| 日本有码中文字幕| 日本亲子乱婬一级A片| 久久久久久久久久国产| 青青艹在线视频| 成人在线免费| 色婷婷视屏| 国产日逼片| 久久6精品| 国产精品黄色视频| 日本成人电影| 国产毛片久久久久久国产毛片 | 色婷婷影院| 日韩精品成人| 正在播放ADN156松下纱荣子 | 国产成人精品av在线观看| 国产成人高清无码| 18禁在线| 人妻无码HEYZO少妇精品| 9一区二区三区| 亚洲无码性爱视频| 高清日韩无码视频| 欧美一区二区在线| 欧美精品18videosex性欧美 | 一区二区三区四区在线视频| 97国产精品久久| 国产嫩BBwBBw高潮| 午夜成人精品视频| 久久日韩操| 久久久久一区二区三区| 婷婷丁香五月亚洲| 无码人妻一区| 中文字幕福利电影| 欧美激情久久久| anwuye官方网站| 人人澡人人干| 天天操天天操| 91久久偷拍视频| 黄色片视频免费| 六月丁香激情| 欧美日韩免费在线播放电影在线播放电影在线播放电影免费 | 97午夜福利视频| 五月天一区二区| 成人免费视频18| 欧美色欲| 国产精品福利在线播放| 体内射精视频| 四川少妇BBB| 亚洲成人中文字幕在线| 欧美性天天| caopro| 成人无码专区| 欧美大胆视频| 爱草在线| 国产精品久久久久久久久久九秃| 精品第一页| 四虎影院最新地址| 毛片久久久| 91蝌蚪| 成人A电影| 蜜芽成人精品久久久视频| 无码中文字幕在线播放| 精品二区| 亚洲高清视频无码| 久久免费视频,久久免费视频| 婷婷五月情| 韩国三级HD中文字幕2019年| 亚洲美女网站免费观看网址| 蜜臀av在线观看| 亚洲一级在线| 一本色道久久综合狠狠| 国产精品久久久久久精| 九九综合久久| 午夜久操| 多啪啪免费视频| 青青草伊人网| 天天都色| 在线观看亚洲中文字幕| а天堂中文在线资源| 日韩黄色视频| 国产永久在线| 中国黄色A片| 久久三级电影| 一级婬片A片AAAAA毛片| 操逼视频网址| 操逼免费| 日本色中文字幕| 五月天乱伦小说| 国产精品久久久久永久免费看| 美女毛片网站| 翔田千里在线播放| 俺来也俺也啪www色| 国产尤物在线| 国产第一夜| 亚洲AV成人无码精在线| 伊人在线综合| 色色网五月天| 狠狠撸在线| 大学生18一19GAY169 | 四川BBB搡BBB搡多人乱| 高清无码色播| 青青草原在线视频免费观看 | 婷婷夜色福利网| 一区二区三区无码视频| 中文字幕无码一区二区三区一本久 | 懂色av粉嫩av蜜臀av| 女人的天堂AV在线观看| 久久久久a| 黄片免费观看网站| 91久久久裸身美女| 国产黄片免费视频| 三级网址在线观看| 久久你懂的| 影音先锋色先锋|