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

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

共 29380字,需瀏覽 59分鐘

 ·

2021-04-20 18:05


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

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

點(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è)注解是開啟自動(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 ImportBeanDefinitionRegistrar, DeterminableImports {
        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查看具體的值:

img

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

img

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

看看注解@Import(AutoConfigurationImportSelector.class),@Import注解就是給Spring容器中導(dǎo)入一些組件,這里傳入了一個(gè)組件的選擇器:AutoConfigurationImportSelector。

img

可以從圖中看出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)景需要的所有組件,并配置好這些組件。

img

有了自動(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)入。

img

接下來(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.class, args);
    }

來(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)聽器
    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.class, applicationContext);
   ((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):

img

比如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容器。

img

我們看到還有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)目目錄。

img
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)目引入就可以使用。

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



推薦閱讀:
怎么接私貨?這個(gè)渠道你100%有用!請(qǐng)收藏!

,點(diǎn)個(gè)在看 
瀏覽 58
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

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

手機(jī)掃一掃分享

分享
舉報(bào)

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

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 亚洲无码在线免费观看视频| 精品一二三区| 日韩操逼网站| 欧美性爱怡红院| 久久久久久免费| 国产精品免费麻豆| 日韩无码免费视频| 欧美成人色图| 亚洲AV无码一区东京热久久| 大香蕉AV在线观看| 伊人影院99| AV大全在线免费观看| 大鸡巴黄色视频免费观看| 深爱五月婷婷| 在线看片你懂的| 国产精品欧美一区二区| 佐山爱人妻无码蜜桃| 国产成人精品国内自产拍免费看| 日韩在线视频免费观看| 人人摸人人摸人人| 一本一道久久a久久精品综合| 边摸边做| 天天撸天天干| 亚洲日韩欧美一区二区天天天 | 久久婷婷国产麻豆91天堂| 国产一区二区不卡视频| 国产精品一区网站| 日韩av在线免费观看| 国产乱伦内射| 91无码人妻精品1国产四虎| 97香蕉久久夜色精品国产| 偷拍视频网站北条麻妃| 青娱乐大香蕉| 天天看天天射| 毛多水多丰满女人A片| 大香蕉男人天堂| 国产青草视频| 大地影视中文第三页最新在线观看 | 天天日天天舔| 亚洲欧美影院| 久久久成人视频| 操美女影院| 国产精品自拍三级| 国产56页| 在线播放日韩| 青青草原视频在线| 亚洲第一黄色| 黄色片网站视频| 欧美激情片| 91成人影片| 大肉大捧视频免费观看| 国产午夜免费| 尤物av| 青青草大香蕉在线| 国产香蕉在线观看| 日韩欧美性爱网站| 日韩成人观看| 91av电影| 好男人一区二区三区在线观看| 躁BBB躁BBB躁BBBBB乃| 51成人网站免费| 欧美日韩岛国| 亚洲一级性爱| 俺也干| 日韩码线观看视频| 国产精品一区二区AV日韩在线| 猛男大粗猛爽H男人味| 噜噜噜色| 欧美日韩国产尤物主播精品| 青青草原网站在线观看| 91狠狠综合久久久久久| 操碧一区| 91麻豆精品在线观看| 欧美久久久久久| 四虎精品影院| AAA免费视频| 无码视频免费观看| 日韩久久人妻| 精品中文字幕在线播放| 日韩视频精品| 久久av一区二区三区观看| 91人人爽| 五月丁香天堂| 日本中文在线观看| 亚洲在线视频观看| 日韩av电影免费在线观看 | 97免费视频在线观看| 久久久久综合| 婷婷五月天性爱| 91成人在线视频| AV五月| 天堂亚洲| 日本少妇BBw| 日本在线小视频| 男女怕怕网站| 久久精品内射| 少妇456| 亚洲成色A片77777在线小说| 日韩免费无码| 双腿张开被9个男人调教| 中文字幕一区二区三区四区五区六区 | AV天堂电影网| 男女激情网站| 内射视频免费看| 国产av一级片| 大香蕉伊人网在线| 日韩VA| 亚洲一本色道中文无码| 99人人操| 人妻精品一卡二卡| 亚洲激情无码视频| 99热| 极品毛片| 国产欧美二区综合中文字幕精品一| 少妇bbb搡bbbb搡bbbb| 日本三级网站| 国产免费av片| 91香蕉在线观看视频在线播放| 一本色道久久| 91在线无码精品秘国产三年| 亚洲无码AV在线观看| 免费播放片色情A片| 亚洲丁香五月天| 91成人精品视频| 91精品视频在线免费观看| 国产一级特黄A片| 久久都是精品| 人人插人人| www.日韩一区| 国产剧情一区二区av在线观看 | 色一本| 日本精品无码a62v在线| 五月天激情网址| 中日韩免费视频| 2015中文字幕黄色视频| 黄色高清无码视频| 蜜臀99| 亚洲中文字幕高清| 欧洲亚洲无码| www.bbbb| 97国产精品人人爽人人做| 欧美成人黄色小视频| 不卡视频一区二区| www.黄色大片| 91视频久久| 影音先锋国产在线| 午夜亚洲福利视频| 欧美日韩亚洲成人| adn日韩av| 91人妻人人澡人人爽人人精| 五月天激情啪啪| 欧洲一区二区| 香蕉视频毛片| 成人性视频Aⅴ| 日韩无码A片| 亚洲AV无码成人精品一区| 伊人免费视频| 91在线无码精品秘入口三人| 东北奇淫老老妇| 麻豆精品| 粉嫩小泬BBBBBB免费看| 日本不卡一区二区三区四区| 国产肏逼视频| 欧美+日韩+国产+成人+在线| 亚洲在线免费| 亚洲色老板| 一级a一级a爰片免费免免中国A片| 91牛| 91狠狠综| 日逼免费| 国产91白浆四溢| 69国产精品成人无码| 日本午夜无码| 亚洲人操逼| www.一区| 色哟哟一中文字慕| 人人操人人操人人操人人操人人操| 九九热免费视频| 四川BBB嫩BBBB爽BBBB| 成人一级精品| 2017天天干| 国产A级视频| 国产一毛a一毛a在线观看| 亚洲中文字幕网| 亚洲一区二区精品| 青青久视频| 波多野结衣成人网站| 99er热精品视频| 女生自慰网站免费| 国产主播av| 天天综合91| 做爱视频无码| 成人在线一区二区三区| www.99免费视频| 婷婷色色五月天| 在线免费黄| 国产精品成人在线视频| 黄色一级aa片| 亚洲人成电影| 99re在线观看视频| 免费视频无码| 爱爱91| 一级A级毛片| 日本免费黄色小视频| 国产久久免费视频| 青青草视频在线观看| 操逼视频免费播放| 思思热这里只有精品| 五月婷婷六月激情| 又大又粗又爽| 麻豆国产在线| 久久青青草在线视频| 国产免费一区二区三区网站免费 | 操人人| 亚洲va欧洲va国产va不卡| 黑人亚洲娇小videos∞| 北条麻妃精品视频| 大色欧美综合| 成人精品鲁一鲁一区二区| 亚洲超碰在线| 91热热| 天天撸在线| 一本色道无码人妻精品| 人人操夜夜| 亚洲AV成人无码精在线| 91免费成人| 久久精品视频网站| A级片网站| 欧美老熟妇BBBBB搡BBB| 亚洲日本一区二区三区| 国产P片内射天涯海角| 国产激情视频在线观看| 北条麻妃91| 91蝌蚪视频在线观看| 久操视频免费在线观看| 最近最经典中文MV字幕| 久久av一区二区三区观看| 国产无码乱伦内射| 俺来也俺去啦欧美www| 欧洲精品码一区二区三区免费看| 精品A片| 亚洲色老板| 亚洲综合在线观看视频| 高清无码在线视频观看| 日韩日批| 一区二区三区四区成人| 大香蕉玖玖| 国产成人视频在线播放| 日韩一级一级一级| 性爱免费专区| 国产视频一区二区三区四区| 超碰久草| 操逼操| 精品人妻中文字幕| 激情综合五月天| 超碰操逼| 久久久国产91桃色一区二区三区 | 日本午夜福利电影| 天堂中文资源在线| 伊人精品视频| 香蕉视频在线看| 午夜视频在线播放| 在线AⅤ| 操逼视频免费播放| 免费看v片| 7777影视电视剧在线观看官网| 国产一级a毛一级a做免费图片 | 天天干91| 国产免费观看视频| 成人毛片18女人毛片真水| aaa三级片| 日韩在线免费播放| 噜噜噜在线视频| BBB搡BBB搡BBB搡BBB| 中文字幕精品视频在线| 日韩无码高清免费| 黄色电影视频在线| 91精彩视频在线观看| 91网站在线播放| 国产成人无码Av片在线公司| av无码一区二区| 黄网站在线播放| 青娱乐最新官网| 丝袜乱伦| 强辱丰满人妻HD中文字幕| 四虎成人网站| 少妇搡BBBB搡BBBB毛多多| av在线免费播放| 四虎永久www成人影院| 高清免费无码| 日本欧美中文| 成人毛片在线大全免费| 亚洲欧美日韩在线| 国产一区二区不卡视频| 无码一区二区区| 国产AⅤ无码一区二区| 桃花岛tⅴ+亚洲品质| 日韩成人高清| 黄片在线免费播放| 成人AA片| 影音先锋男人站| 免费中文字幕日韩欧美| 亚洲中文字幕人妻。| 亚洲精品国产精品乱码不卡√香蕉| 国产综合色网| 91欧美精品成人综合在线观看| 免费版成人久久幺| 看肏屄视频| 水蜜桃在线观看视频| 毛片在线观看网站| 狠狠撸视频| 久久免费观看视频| 一区二区三区四区无码| WWW.豆花视频精品| 黃色毛片A片AAAA级20| 波多野结衣久久精品| 麻豆成人网| 人人草人人操| 久久久久久久国产精品| 日韩无码中文字幕| JIZZJIZZ国产精品喷水| 天天干天天肏| 小h片| 欧美性爱-熊猫成人网| 国产熟妇| 国产粉嫩小泬白浆18p| 影音先锋久久久久AV综合网成人| 美女久久久久| 亚洲无码观看视频| 久久这里只有精品99| 苍井空一区二区| 日韩黄片| 日本親子亂子倫XXXX| 色色激情五月天| 91在线无码精品秘国产| 91精品国产欧美一区二区成人| 91欧美黑人| www尤物| 亚洲天堂在线观看免费| 国产在线观看国产精品产拍| 在线无码一区| 成人色播播| 国产精品一区二区三区不卡| 亚洲国产成人在线视频| 国产女人18毛片水18精| 久久久久久av| 欧美三级长视频| 国产福利美女网站| 吹潮喷水高潮HD| www.17c嫩嫩草色蜜桃网站| 特级西西444www高清视频| 五月婷婷性爱| 中文字幕黄色| 操欧美老女人| 日韩精品一区二区三| 夜夜嗨AⅤ一区二区三区| 久久在线精品| 国产久久久久| 亚洲欧美在线一区| 亚洲精选中文字幕| 中文字幕日韩在线观看| 操逼AⅤ| 91中文字幕网| 口爆吞精在线观看| 懂色成人av影院| 日本成人一区二区三区| 日韩无码视频网站| 国产女人18毛片水真多18精品| 亚洲AV自拍| 骚逼久久| 国产又爽又黄免费视频免费| 一级a片激情啪啪免费观| 黄色综合网站| 日韩黄色电影网址| 韩国GOGOGO高清| 91人妻中文字幕| 四川少扫搡BBBBB搡B| 中文字幕色情| 亚洲AV无码成人精品区久| 丰滿人妻一区二区三区| 日韩在线中文字幕亚洲| 精产国品一区二区三区| 国产AV中文字幕| 免费无码婬片A片AA片| 97人人色| 无码成人AV在线看免费| 人妻体体内射精一区二区| 亚洲精品ww| 18禁在线播放| 亲孑伦XXXⅹ熟女| 国产午夜在线视频| 卡一卡二卡三| 男人的天堂手机在线| 亚洲高清免费视频| 亚洲人妖在线| 蜜桃视频网站18| 婷婷五月天激情丁香| 成人做爰黄A片免费视频网站野外| 亚洲免费在线观看视频| 先锋成人电影| 大香伊人中文字幕精品| 国产国产国产在线无码视频| 俺也去五月婷婷| 欧美视频操逼| 9久9久9久9久女女女女| 欧美一区二区三区四区视频| av一区二区在线观看| AV大全在线观看| 青青草五月天色婷婷丁香| 成人伊人电影| 中文字幕91| 中文字幕无码A片| 加勒比色综合| 精品成人网| 成人电影一区| 在线中文AV| 国产AⅤ爽aV久久久久成人| 精品久久久999| 日韩操操操| 国产精品免费麻豆| 在线看国产| 性欧美XXXX| 日韩操B视频| 又粗又硬又爽18级A片| 亚洲欧美成人电影| 国产人妻人伦精品一区| 久久久久一| 国产精品日韩欧美| 骚逼黄片| 精品国产va久久久久久| 国产无遮挡又黄又爽又色| 操碰在线视频| 国产精品不卡一区二区三区| 懂色av粉嫩AV蜜臀AV| 黄色片在线观看视频| 亚洲综合一二三区| 国产精品无码专区AV免费播放| 影音先锋无码AV| 国产色综合视频| 欧美日韩一区二区三区视频| 久久一级视频| 99久免费视频| 色噜噜狠狠色综无码久久合欧美| 日韩在线你懂的| 日韩aaa| 丁香婷婷六月天| 久久免费成人| 黄色日韩| 骚骚肥肥一区二区三区| 手机av在线| 黄色国产视频在线观看| 五月婷婷五月天| 成人福利视频在线观看| 正在播放李彩斐被洋老外| 手机在线观看AV| 无码人妻丰满熟妇啪啪| 婷婷中文字幕| 色亭亭影院| 久久久久久久香蕉视频| 无码囯无精品毛片大码| 青青久久91| 91精品一区| 97无码精品人妻一区二区三区| 久久国产热在8| 99久久精品国产精品有折扣吗| 亚洲福利在线免费观看| 久久国产精品波多野结衣AV | 国产地址| 江苏妇搡BBBB搡BBB| 精品无码人妻一区二区媚黑| 波多野结衣成人网站| 国产女人18毛片精品18水| 免费观看黄色在线视频| 国产精品成人片| 一级黄色小视频| 日韩无码中文字| 综合天堂AV久久久久久久| 国产亚洲天堂| 久久精品视频播放| 91色欲| 九九九在线视频| 在线观看中文字幕亚洲| 成人自拍偷拍| 日韩精品人妻无码| 亚洲av小说| 东京热综合影院| 国精品伦一区一区三区有限公司| 久久大香蕉精品| 黄色视频在线免费观| 囯产精品久久久久久久久久| 99亚洲天堂| 日韩无码人妻视频| 99热超碰| 日韩一级高清| 亚洲精品一区二区三区四区五区六区 | 韩日一区二区三区| 熟妇操逼视频| 网址你懂的| 久久黄色网址| 男人天堂综合网| 亚洲精品久久久久毛片A级牛奶 | 久久手机电影| 日韩五码| 亚洲福利一区| 婷婷五月丁香在线| 成人免看一级a一片| 亚洲欧美国产精品专区久久| 中文字幕欧美视频| 人妻18无码人伦一区二区三区精品| 高清欧美日韩第一摸| 欧美强开小嫩苞| 日皮视频在线| 久久综合17p| 裸体黄色一极大片| 欧美天天干| 四季AV一区二区夜夜嗨| 亚洲五月丁香婷婷| 国产人妻人伦精品1国产丝袜| 五月婷婷色| 黄色av免费| 一道本一区二区三区| 另类老妇性BBwBBw图片| 日韩中文字幕区| 成人电影亚洲天堂| 综合网久久| 韩国无码专区| 激情无码一区二区| 午夜三级无码| 天天拍天天日| 久草视频在线免费| 在线一区| 日韩在线视频一区| 国产精品一区二| 大荫蒂视频另类XX| 极品少妇av| 一本久道视频一本久道| 丁香五月亚洲综合| 99九九网| 亚洲无码高清在线观看| 亚洲欧美在线观看视频| 国产欧美黄片| 人人操人人人| 亚洲精品乱码在线| 波多野结衣vs黑人巨大| 影音先锋一区| 久草福利在线| 亚洲免费在线播放| 亚洲日韩激情| 一道本一区二区三区| 影音先锋成人无码| 免费无码在线视频| 亚洲成人大片| 免费高清无码视频在线观看| 黄色大片中国一级片-免费看特一级片-亚洲黄色AV| 久久九九99| 国产精品秘久久久久久久久| 九九成人视频| 黑人一级| 青草精品| 午夜福利黄| 中文无码第一页| 欧美AAA在线观看| 一级免费黄色视频| 超碰福利导航| 伊人大香蕉精品| 欧美性爱AAA| 开心色播五月天| 久久久亚洲AV无码精品色午夜| 亚洲成人视频| 国产激情无码| 浙江妇搡BBBB搡BBBB| 亚洲精品区| 天天拍天天干| 精品无码一区二区三区爱与| 五月网| 久久久久久亚洲| 91精品福利| 国产1区| 高清无码视频网站| 波多野结衣不卡| 樱桃码一区二区三区| 大香蕉尹人网| 深爱激情五月天| 男女拍拍拍| 日韩三级| 亚洲美女喷水视频| 亚洲高清国产欧美综合s8| 中文字幕三级片在线观看| 婷婷开心色四房播播在线| 国产AV18岁| www,操逼| 色AV网| 午夜老湿机| 无套内射免费视频| 女女女女女女BBBBBB手| 欧美va视频| 美女被操面费网站| 国产一区二区不卡亚洲涩情| 国产一区二三区| 亚洲AV无码精品国产| a片视频网站| 久久免费国产视频| 一区二区三区免费看| 亚洲aa| 免费在线黄色电影| www.啪啪| 五月天激情爱爱| JlZZJLZZJlZZ亚洲女人17| 国产成人综合亚洲| 强行征服邻居人妻HD高清日本| 风间由美大荫蒂无码AV| 国产又粗又猛又爽又黄91精品| 大奶AV| 免费超碰在线| 久久久久久亚洲AV无码专区| 一区二区无码在线| 黄色片A| 亚洲AV官方网站| 中字无码AV| 性爱av在线观看| 黄色a一级| 99久久精品国产一区二区三区| 色婷婷18禁| 亚洲va视频| 国产有码视频| 人人爱人人操| 精品亚洲一区二区三区| 亚洲熟妇在线观看| 天天日夜夜拍| 免费超碰在线| 国产精品1| 淫秽视频免费看| 亚洲欧美日韩不卡| 嫩BBB槡BBBB槡BBBB免费视频| 欧美性爱视频免费观看| 91www| 日本日韩欧美| 婷婷国产成人精品| 欧美一区二区三区四| 91在线无码精品在线看| 99re免费视频| 天天干天天拍| 青娱乐三级在线免| 久久久久久无码精品亚洲日韩麻豆| 嫩BBB槡BBBB槡BBBB免费视频| 成人电影久久久| 日韩av一区二区三区| 18禁网址| 天天拍夜夜爽| 开心五月激情网| 日韩2区| 人人妻人人澡人人爽人人欧美一区| 亚洲大哥天天干| 看免费黄色录像| 免费成人三级片| 欧美亚洲激情| 俺去也| 无码人妻中文| 一区二区三区四区免费看| 国产视频你懂的| 黄色视频在线观看亚洲一区二区三区免费| 69AV网站| 日韩综合在线视频| 在线观看黄色电影| 婷婷国产成人精品| 黄色电影视频在线| 97精品在线视频| 国产精品96久久久久久| 久久久久久久久成人| 91香蕉视频免费在线观看| 成人区精品一区二区婷婷| 人妻精品一卡二卡| 亚洲精品黄色电影| 国产91网| 大香蕉尹人| 午夜成人无码视频| 久久婷婷网| 91成人在线观看学生和老师| 大香蕉伊人手机在线| 大香蕉免费在线观看| 大香蕉久久爱| 亚洲精品一区无码A片丁香花| a片网站在线观看| 一道本一区二区三区| 一本在线| 国产农村乱婬片A片AAA图片| 插菊花综合网站| 人人爽人人操| av天堂资源在线| 久久停停| 大香蕉福利视频导航| 囯产精品一区二区三区AV做线| 西西人体大胆ww4444多少集| 亚洲国产熟妇综合色专区| 国产又爽又黄视频在线看| 无码AV一区| 男女操逼视频网站免费| 欧美老女人操逼视频| 婷婷成人电影| 中文字幕特黄A片| 大香蕉中文网| 亚洲无码视频在线观看| 九九九视频在线观看| 无码AV在线观看| 一本色道久久88综合无码| 毛片久久久| 久久久久久国产| 欧美色爽| 国产在线视频你懂的| 黄色污污污网站| 一区二区日本| 逼逼75大秀| 三级片网站在线观看| 大香蕉久草| 欧美国产另类| 国产午夜在线视频| 国产成人精品a区在线观看| 91精品在线观看视频| 黄色激情网站| 日韩无码AV一区二区三区| 波多野结衣av无码| 欧美日韩肏屄视频| 国产黄| 豆花视频一区| 搡bbb| 成人黄网站免费观看| 中文字幕日本在线| 四川少妇搡bbbb搡bbbb| 亚洲一区二区AV| 日韩欧美不卡色不卡| 先锋资源一区| 日韩gay| 嫩BX区二区三区的区别| 羞羞色院91蜜桃| 国产日韩一区二区三区| 69av在线| aaaaaa在线观看免费高清| 欧美日韩在线免费观看| 久久综合操| 亚洲一级黄色片| 在线操b| 做爱激情视频网站| 奇米88888| 成人做爰100部片视频| 杨门女将婬乱史1—6| 亚日韩视频| 丁香婷婷视频| 伊人啪啪| 羽月希无码| 国产精品久久77777| 残忍另类BBWBBWBBW| 国产又粗又长又硬又大毛苴茸图片| 三级片91| 成人天堂一区二区三区| 激情91| 日本AA片视频| 驲韩在线视频免费观看| 91麻豆精品视频| 北条麻妃视频在线播放| 四虎精品一区二区| 一级片免费观看视频| 大香蕉久操| 欧美精产国品一二三产品价格| 色婷婷在线视频| 无套免费视频欧美| 97人人操人人干| 欧美日韩国产一区二区| 久久久久久久免费无码| 一区二区三区久久久| 成人久久久久一级大黄毛片中国 | 日韩无码性爱| 91中文字幕网| 日本50路熟女| 国产视频二区| 五月天操逼网站| 欧美口爆| 欧美偷拍精品| 欧美在线视频你懂的| 中文字幕精品视频| 色天使视频| 五月亭亭在线视频| 欧美草逼视频| 亚洲精品成人一二三区| 亚洲精品mv| 国产女同性系列| 亚洲永久天堂| 国产乱伦网站| 91在线无码精品秘国产| a天堂在线| 天美果冻麻豆国产一区| 欧美在线视频免费观看| 男人天堂无码视频| 台湾省成人网站| 国产精品18禁| 精品欧美成人片在线| 蜜臀AV一区二区三区免费看| 亚洲视频在线免费播放| 男人天堂视频在线| 久久99精品久久久久婷婷| 国产色情网站| 亚洲无码AV在线观看| 99久久精品一区二区成人| 日韩无码电影网站| 欧美人妻日韩精品| 五月丁香婷婷在线观看| 欧美视频一区二区三区| 日本三级中文字幕| 日本韩国欧美18| 婷婷视频网站| 无码一区二区三区免费| 国产精品免费一区二区三区都可以| 51国产视频| 免费中文资源在线观看| 欧美亚洲激情| 日韩成人高清| 99re视频在线播放| 激情一一区二区三区| 国产毛片一区二区三区| 九九A片| 制服丝袜一区| 成人手机AV| 天天干天天射天天操| 婷婷五月天小说| 日韩在线你懂的| 第四色色综合| 天天影视综合网免费观看电视剧国产 | 91香蕉国产视频| 日韩性爱网址| 黄色视频在线观看亚洲一区二区三区免费 | caopeng97| 国产亚洲欧美视频| 成人精品二区| 国产精品久久AV电影| 黄色三级在线观看| 91草视频| 亚洲色五月天| 欧美在线A| 韩国精品一区| 日韩一级在线观看| 成人做爰A片一区二区app | aaa在线观看| 麻豆911精一区二区| 日韩视频免费观看高清完整版在线观 | 国产黄色视频在线观看| 成人做爰A片一区二区app | 欧美91视频| 亚洲经典一| 日韩免费在线观看一区入口| 欧美精品性爱| 果冻传媒一区二区三区| 日韩精品一区二区三区中文在线 | 怍爱视频| 中文字幕日韩精品人妻| 青草视频在线播放| 欧美性爱视频在线观看| 亚洲另类天堂| 亚洲大片在线观看| 国产18禁网站| 91精品少妇| 大香蕉伊人影视| 亚洲天堂av在线观看| 夜夜骚AV一二三区无码| 91色色色| 91小宝寻花一区二区三区三级| 国产色色色色| JULIA超乳JULIA无码| 国产成人AV免费无码| 激情一级| 4438成人网站| av免费观看网址| 中文字幕在线观看网| 熟妇高潮一区二区高潮| 激情视频免费看| 懂色在线精品分类视频| 亚洲午夜久久久久久久久久久| 国产性爱在线| 在线观看91| 超碰成人免费| 无码123| 蜜桃Av噜噜一区二区| 狠狠撸在线观看| 欧美成人版| 狠狠穞A片一區二區三區| www.蜜桃视频| 网址你懂得| 国产成人无码一区二区| 一二三区视频| 91亚洲欧美| 久久久成人免费电影| 欧美疯狂做受XXXXX高潮| 波多野结衣亚洲视频| 久久婷婷六月| 日韩区一中文字幕a∨| 熟女老阿V8888AV| 国产伦精品一区二区三区视频女 | 黄色视频网站亚洲| 日韩av一级| 亚洲伦理一区二区| 99久久久久久久久久| 加勒比综合无码|