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

手把手帶你開發(fā)Starter,點對點帶你講解原理

開發(fā) 前端
spring-boot-autoconfigure :提供自動化裝配功能,是為了Spring Boot 應(yīng)用在各個模塊提供自動化配置的作用;即加入對應(yīng) pom,就會有對應(yīng)配置其作用;所以我們想要自動裝配功能,就需要引入這個依賴。
_____            _             ____              _   
/ ____| (_) | _ \ | |
| (___ _ __ _ __ _ _ __ __ _| |_) | ___ ___ | |_
\___ \| '_ \| '__| | '_ \ / _` | _ < / _ \ / _ \| __|
____) | |_) | | | | | | | (_| | |_) | (_) | (_) | |_
|_____/| .__/|_| |_|_| |_|\__, |____/ \___/ \___/ \__|
| | __/ |
|_| |___/

為什么要用Starter?

現(xiàn)在我們就來回憶一下,在還沒有Spring-boot框架的時候,我們使用Spring 開發(fā)項目,如果需要某一個框架,例如mybatis,我們的步驟一般都是:

到maven倉庫去找需要引入的mybatis jar包,選取合適的版本(易發(fā)生沖突)

到maven倉庫去找mybatis-spring整合的jar包,選取合適的版本(易發(fā)生沖突)

在spring的applicationContext.xml文件中配置dataSource和mybatis相關(guān)信息

假如所有工作都到位,一般可以一氣呵成;但很多時候都會花一堆時間解決jar 沖突,配置項缺失,導(dǎo)致怎么都啟動不起來等等,各種問題。

所以在2012 年 10 月,一個叫 Mike Youngstrom 的人在 Spring Jira 中創(chuàng)建了一個功能請求,要求在 Spring Framework 中支持無容器 Web 應(yīng)用程序體系結(jié)構(gòu),提出了在主容器引導(dǎo) Spring 容器內(nèi)配置 Web 容器服務(wù);這件事情對 SpringBoot 的誕生應(yīng)該說是起到了一定的推動作用。

所以SpringBoot 設(shè)計的目標(biāo)就是簡化繁瑣配置,快速建立Spring 應(yīng)用。

然后在開發(fā)Spring-boot 應(yīng)用的是時候, 經(jīng)常可以看到我們的pom 文件中引入了spring-boot-starter-web、spring-boot-starter-data-redis、mybatis-spring-boot-starter 這樣的依賴,然后幾乎不用任何配置就可以使用這些依賴的功能,真正的感受到了開箱即用的爽。

下面我們就先來嘗試自己開發(fā)一個Starter。

  1. 命名規(guī)范

在使用spring-boot-starter,會發(fā)現(xiàn),有的項目名稱是 XX-spring-boot-starter,有的是spring-boot-starter-XX,這個項目的名稱有什么講究呢?從springboot官方文檔摘錄:

這段話的大概意思就是,麻煩大家遵守這個命名規(guī)范:

Srping官方命名格式為:spring-boot-starter-{name}

非Spring官方建議命名格式:{name}-spring-boot-starter

  1. 開發(fā)示例

下面我就以記錄日志的一個組件為示例來講述開發(fā)一個starter 的過程。

  1. 新建工程

首先新建一個maven 工程,名稱定義為
jd-log-spring-boot-starter

  1. Pom 引入依賴
<?xml versinotallow="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.13</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.jd</groupId>
<artifactId>jd-log-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
<name>jd-log-spring-boot-starter</name>
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>


<dependencies>
<!-- 提供了自動裝配功能-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
<!-- 在編譯時會自動收集配置類的條件,寫到一個META-INF/spring-autoconfigure-metadata.json-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
<!--記錄日志會用到切面,所以需要引入-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.2.1</version>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

這邊稍微解釋一下這幾個依賴:

spring-boot-autoconfigure :提供自動化裝配功能,是為了Spring Boot 應(yīng)用在各個模塊提供自動化配置的作用;即加入對應(yīng) pom,就會有對應(yīng)配置其作用;所以我們想要自動裝配功能,就需要引入這個依賴。

spring-boot-configuration-processor:將自定義的配置類生成配置元數(shù)據(jù),所以在引用自定義STARTER的工程的YML文件中,給自定義配置初始化時,會有屬性名的提示;確保在使用@ConfigurationProperties注解時,可以優(yōu)雅的讀取配置信息,引入該依賴后,IDEA不會出現(xiàn)“spring boot configuration annotation processor not configured”的錯誤;編譯之后會在META-INF 下生成一個
spring-configuration-metadata.json 文件,大概內(nèi)容就是定義的配置的元數(shù)據(jù);效果如下截圖。

spring-boot-starter-aop :這個就不用解釋了,因為示例是記錄日志,我們用到切面的功能,所以需要引入。

  1. 定義屬性配置
/**
* @author kongxiangdong2
* @Title: LogProperties
* @ProjectName jd-log-spring-boot-starter
* @Description: TODO
* @date
@ConfigurationProperties(prefix = "jd")
@Data
public class LogProperties {


/**
* 是否開啟日志
*/
private boolean enable;


/**
* 平臺:不同服務(wù)使用的區(qū)分,默認(rèn)取 spring.application.name
*/
@Value("${spring.application.name:#{null}}")
private String platform;

@ConfigurationProperties:該注解和@Value 注解作用類似,用于獲取配置文件中屬性定義并綁定到Java Bean 或者屬性中;換句話來說就是將配置文件中的配置封裝到JAVA 實體對象,方便使用和管理。

這邊我們定義兩個屬性,一個是是否開啟日志的開關(guān),一個是標(biāo)識平臺的名稱。

  1. 定義自動配置類
/**
* @author kongxiangdong2
* @Title: JdLogAutoConfiguration
* @ProjectName jd-log-spring-boot-starter
* @Description: TODO
* @date 2022/9/110:06
*/
@Configuration
@ComponentScan("com.jd")
@ConditionalOnProperty(prefix = "jd",name = "enable",havingValue = "true",matchIfMissing = false)
@EnableConfigurationProperties({LogProperties.class})
public class JdLogAutoConfiguration {


//
}

這個類最關(guān)鍵了,它是整個starter 最重要的類,它就是將配置自動裝載進(jìn)spring-boot的;具體是怎么實現(xiàn)的,下面在講解原理的時候會再詳細(xì)說說,這里先完成示例。

@Configuration :這個就是聲明這個類是一個配置類

@ConditionalOnProperty:作用是可以指定prefix.name 配置文件中的屬性值來判定configuration是否被注入到Spring,就拿上面代碼的來說,會根據(jù)配置文件中是否配置jd.enable 來判斷是否需要加載JdLogAutoConfiguration 類,如果配置文件中不存在或者配置的是等于false 都不會進(jìn)行加載,如果配置成true 則會加載;指定了havingValue,要把配置項的值與havingValue對比,一致則加載Bean;配置文件缺少配置,但配置了matchIfMissing = true,加載Bean,否則不加載。

在這里稍微擴(kuò)展一下經(jīng)常使用的Condition

注解

類型

說明

@ConditionalOnClass

Class Conditions類條件注解

當(dāng)前classpath下有指定類才加載

@ConditionalOnMissingClass

Class Conditions類條件注解

當(dāng)前classpath下無指定類才加載

@ConditionalOnBean

Bean ConditionsBean條件注解

當(dāng)期容器內(nèi)有指定bean才加載

@ConditionalOnMissingBean

Bean ConditionsBean條件注解

當(dāng)期容器內(nèi)無指定bean才加載

@ConditionalOnProperty


Property Conditions環(huán)境變量條件注解(含配置文件)

prefix 前綴name 名稱havingValue 用于匹配配置項值matchIfMissing 沒找指定配置項時的默認(rèn)值

@ConditionalOnResource

ResourceConditions 資源條件注解

有指定資源才加載

@ConditionalOnWebApplication

Web Application Conditionsweb條件注解

是web才加載

@ConditionalOnNotWebApplication

Web Application Conditionsweb條件注解

不是web才加載

@ConditionalOnExpression

SpEL Expression Conditions

符合SpEL 表達(dá)式才加載

@
EnableConfigurationProperties使@ConfigurationProperties 注解的類生效。

  1. 配置EnableAutoConfiguration

在resources/META-INF/ 目錄新建spring.factories 文件,配置內(nèi)容如下;

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.jd.JdLogAutoConfiguration

好了,至此自定義Starter 大體框架已經(jīng)好了,下面就是我們記錄日志的功能。

  1. 業(yè)務(wù)功能實現(xiàn)

首先我們先定義一個注解Jdlog

/**
* @author kongxiangdong2
* @Title: Jdlog
* @ProjectName jd-log-spring-boot-starter
* @Description: TODO
* @date 2022/9/110:04
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Jdlog {
}

定義切面執(zhí)行邏輯,這邊就簡單的打印一下配置文件的屬性值+目標(biāo)執(zhí)行方法+耗時。

import com.jd.annotation.Jdlog;
import com.jd.config.LogProperties;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;


/**
* @author kongxiangdong2
* @Title: LogAspectjProcess
* @ProjectName jd-log-spring-boot-starter
* @Description: TODO
* @date
@Aspect
@Component
@Slf4j
@AllArgsConstructor
public class LogAspectjProcess {


LogProperties logProperties;


/**
* 定義切點
*/
@Pointcut("@annotation(com.jd.annotation.Jdlog)")
public void pointCut(){}


/**
* 環(huán)繞通知
*
* @param thisJoinPoint
* @param jdlog
* @return
@Around("pointCut() && @annotation(jdlog)")
public Object around(ProceedingJoinPoint thisJoinPoint, Jdlog jdlog){


//執(zhí)行方法名稱
String taskName = thisJoinPoint.getSignature()
.toString().substring(
thisJoinPoint.getSignature()
.toString().indexOf(" "),
thisJoinPoint.getSignature().toString().indexOf("("));
taskName = taskName.trim();
long time = System.currentTimeMillis();
Object result = null;
try {
result = thisJoinPoint.proceed();
} catch (Throwable throwable) {
throwable.printStackTrace();
}
log.info("{} -- method:{} run :{} ms",logProperties.getPlatform(), taskName,
(System.currentTimeMillis() - time));
return result;


整體項目結(jié)構(gòu)就是這樣子

好了,現(xiàn)在就可以打包編譯安裝

  1. 測試使用

然后就可以在其他項目中引入使用了;下面以一個簡單的spring-boot web 項目做個測試,在pom 中引入下面的依賴配置。

  <dependency>
<groupId>com.jd</groupId>
<artifactId>jd-log-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>

增加一個http 訪問的方法,標(biāo)注上@Jdlog 注解

application.yaml 文件中配置

jd:
enable: true
platform: "測試項目"

啟動測試,訪問地址http://localhost:8080/test/method1,控制臺打印如下:

咋樣,自定義的Starter是不是特別的簡單啊,快動手試試吧!

上面我們講的都是怎么去開發(fā)一個starter,但是到底為什么要這樣,spring-boot 是如何去實現(xiàn)的?是不是還不知道?那下面我們就來說說;

  1. 原理講解

我們上面已經(jīng)看到一個starter,只需要引入到pom 文件中,再配置一下(其實都可以不配置)jd.enable=true,就可以直接使用記錄日志的功能了,Spring-boot 是怎么做到的?

在開始的時候說過,Spring-boot 的好處就是可以自動裝配。那下面我就來說說自動裝配的原理。

相比于傳統(tǒng)Spring 應(yīng)用,我們搭建一個SpringBoot 應(yīng)用,我們只需要引入一個注解(前提:引入springBoot y依賴)@SpringBootApplication,就可以直接運行;所以我們就從這個注解開始入手,看看這個注解到底做了寫什么?

SpringBootApplication 注解

點開@SpringBootApplication注解可以看到包含了@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan三個注解。

前面的四個注解就不用過多敘述了,是定義注解最基本的,關(guān)鍵在于后面的三個注解:@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan,其實也就是說在啟動類上如果不使用@SpringBootApplication 這個復(fù)合注解,直接使用者三個注解一樣可以達(dá)到相同的效果。

@SpringBootConfiguration 注解:我們再次點進(jìn)去看這個注解,其實它就是一個@Configuration 注解。

@ComponentScan 注解

@ComponentScan 注解:配置包掃描定義的掃描路徑,把符合掃描規(guī)則的類裝配到spring容器

@EnableAutoConfiguration 注解

@EnableAutoConfiguration 打開自動裝配(自動配置著重來看該注解)

注解

作用

解釋

@SpringBootConfiguration

標(biāo)記當(dāng)前類為配置類

加上這個注解就是為了讓當(dāng)前類作為一個配置類交由 Spring 的 IOC 容器進(jìn)行管理,因為前面我們說了,SpringBoot 本質(zhì)上還是 Spring,所以原屬于 Spring 的注解 @Configuration 在 SpringBoot 中也可以直接應(yīng)用

@ComponentScan

配置包掃描定義的掃描路徑,把符合掃描規(guī)則的類裝配到spring容器

用于定義 Spring 的掃描路徑,等價于在 xml 文件中配置 <context:component-scan>,假如不配置掃描路徑,那么 Spring 就會默認(rèn)掃描當(dāng)前類所在的包及其子包中的所有標(biāo)注了 @Component,@Service,@Controller 等注解的類。

@EnableAutoConfiguration

打開自動裝配

下面著重講解

我們再次點擊@EnableAutoConfiguration進(jìn)入查看,它是一個由 @AutoConfigurationPackage 和 @Import 注解組成的復(fù)合注解;

首先我們先來看@Import 這個注解,這個是比較關(guān)鍵的一個注解;

在說這個注解之前我們先舉個例子,假如我們有一個類Demo,它是一個不在啟動配置類目錄之下的,也就意味著它不會被掃描到,Spring 也無法感知到它的存在,那么如果需要能將它被掃描到,是不是我們可以通過加@Import 注解來導(dǎo)入Demo 類,類似如下代碼

@Configuration
@Import(Demo.class)
public class MyConfiguration {
}

所以,我們可以知道@Import 注解其實就是為了去導(dǎo)入一個類。所以這里@Import({
AutoConfigurationImportSelector.class}) 就是為了導(dǎo)入AutoConfigurationImportSelector 類,那我們繼續(xù)來看這個類,AutoConfigurationImportSelector實現(xiàn)的是DeferredImportSelector接口,這是一個延遲導(dǎo)入的類;再細(xì)看會有一個方法比較顯眼,根據(jù)注解元數(shù)據(jù)來選擇導(dǎo)入組件,當(dāng)注解元數(shù)據(jù)空,直接返回一個空數(shù)組;否則就調(diào)用getAutoConfigurationEntry ,方法中會使用AutoConfigurationEntry的getConfigurations(),configurations是一個List<String>,那么我們看下AutoConfigurationEntry是怎么生成的。

進(jìn)入到getAutoConfigurationEntry 方法中可以看到主要是getCandidateConfigurations 來獲取候選的 Bean,并將其存為一個集合;后續(xù)的方法都是在去重,校驗等一系列的操作。

我們繼續(xù)往
getCandidateConfigurations 方法里看,最終通過SpringFactoriesLoader.loadFactoryNames來獲取最終的configurations,并且可以通過斷言發(fā)現(xiàn)會使用到META-INF/spring.factories文件,那么我們再進(jìn)入SpringFactoriesLoader.loadFactoryNames()中來看下最終的實現(xiàn)。

SpringFactoriesLoader.loadFactoryNames()方法會讀取META-INF/spring.factories文件下的內(nèi)容到Map中,再結(jié)合傳入的factoryType=EnableAutoConfiguration.class,因此會拿到 org.springframework.boot.autoconfigure.EnableAutoConfiguration為key對應(yīng)的各個XXAutoConfiguration的值,然后springboot在結(jié)合各個starter中的代碼完成對于XXAutoConfiguration中的Bean的加載動作。

這邊再擴(kuò)展一下這個內(nèi)容,通過 SpringFactoriesLoader 來讀取配置文件 spring.factories 中的配置文件的這種方式是一種 SPI 的思想。

@AutoConfigurationPackage 注解

進(jìn)入這個注解看,其實它就是導(dǎo)入了Registrar 這個類

再進(jìn)入這個類查看,它其實是一個內(nèi)部類,看代碼的大概意思就是讀取到我們在最外層的 @SpringBootApplication 注解中配置的掃描路徑(沒有配置則默認(rèn)當(dāng)前包下),然后把掃描路徑下面的Bean注冊到容器中

總結(jié)

好了,現(xiàn)在我們大概來理一下整個自動裝配的流程:

  1. 啟動類中通過使用@SpringBootApplication實現(xiàn)自動裝配的功能;
  2. 實際注解@SpringBootApplication是借助注解@EnableAutoConfiguration的功能。
  3. 在注解@EnableAutoConfiguration中又有兩個注解,@AutoConfigurationPackage,@EnableAutoConfiguration。
  4. 通過@AutoConfigurationPackage實現(xiàn)對于當(dāng)前項目中Bean的進(jìn)行加載;
  5. @EnableAutoConfiguration通過@Import({AutoConfigurationImportSelector.class})實現(xiàn)對于Pom引入的start中的XXAutoConfiguration的加載;
  6. @AutoConfigurationImportSelector類中通過SpringFactoriesLoader讀取 META-INF/spring.factories中key為org.springframework.boot.autoconfigure.EnableAutoConfiguration對應(yīng)的各個XXAutoConfiguration的值,然后springboot在結(jié)合各個start中的代碼完成對于XXAutoConfiguration中的Bean的加載動作;

到這里是不是已經(jīng)可以很了然對我們之前開發(fā)starter中的定義了啊,趕緊試試吧

責(zé)任編輯:武曉燕 來源: 今日頭條
相關(guān)推薦

2022-08-11 07:32:51

Starter自動裝配

2023-03-29 10:02:36

2021-12-15 07:24:57

人工神經(jīng)網(wǎng)絡(luò)翻譯

2022-11-07 18:36:03

組件RPC框架

2023-03-27 08:28:57

spring代碼,starter

2020-12-13 11:38:09

Go語言clac包

2021-01-08 10:24:32

Python項目基礎(chǔ)

2023-04-03 08:08:54

2021-07-24 11:15:19

開發(fā)技能代碼

2021-02-26 11:54:38

MyBatis 插件接口

2017-09-20 16:39:31

云主機(jī)網(wǎng)站MySQL

2017-09-20 12:36:50

云主機(jī)網(wǎng)站MySQL

2021-01-13 09:03:48

Java游戲函數(shù)

2021-10-09 13:08:58

C++STLSet

2021-04-25 14:56:18

開發(fā)技能代碼

2017-11-27 15:17:24

PythonMonkey腳本

2023-06-05 13:07:38

2021-01-12 05:05:15

Java對碰游戲

2025-10-29 04:22:00

點贊
收藏

51CTO技術(shù)棧公眾號

性做久久久久久久久久| 国产一二三四视频| 欧亚av在线| 久久综合九色综合欧美就去吻| 国产精品96久久久久久又黄又硬| 黄色av片三级三级三级免费看| 亚洲国产高清在线观看| 日韩欧美在线播放| 麻豆视频传媒入口| 毛片在线免费| 国产不卡视频在线播放| 国产成人免费av| 免费无码毛片一区二区app| 国产乱码精品一区二区亚洲| 欧美精选一区二区| 18岁视频在线观看| 成人黄色在线电影| 久久久精品2019中文字幕之3| 国产日韩精品入口| 91传媒久久久| 米奇精品一区二区三区| 丁香婷婷深情五月亚洲| 国产日本欧美一区| 伊人手机在线视频| 国色天香一区二区| 色阁综合伊人av| 最新中文字幕视频| 国内毛片久久| 欧美xxx久久| 污网站在线免费| 人人视频精品| 天天做天天摸天天爽国产一区 | 天天干天天色天天| 国产精品99久久久久久有的能看 | 亚洲欧美一级| 在线精品视频一区二区| 国产一区二区视频播放| 69成人在线| 亚洲色图在线看| 色噜噜一区二区| 男女污污视频在线观看| 成人福利视频在线看| 97人人模人人爽人人喊38tv| 国产又粗又黄又爽| 日本女优在线视频一区二区| 国产成+人+综合+亚洲欧美丁香花| 国产精品成人网站| 亚洲成人在线| 久久久久久久久久久久av| 久久精品黄色片| 91精品国产乱码久久久久久久| 在线亚洲午夜片av大片| 午夜精产品一区二区在线观看的| 日韩欧美影院| 亚洲免费一级电影| 色哟哟精品观看| 国产精品三级| 亚洲一区二区久久| 老司机精品免费视频| 成人精品影院| 久久黄色av网站| 免费在线黄色网| 国产一区美女| 久久久噜噜噜久噜久久| 国产在线一二区| 中文在线一区| 日韩av电影手机在线| 精品国产xxx| 久久国产综合精品| 亚洲在线观看视频| 狠狠躁日日躁夜夜躁av | 男女做爰猛烈刺激| 欧美精品一区二区三区精品| 中文字幕欧美在线| 成人在线观看免费完整| 韩国av一区| 欧美在线亚洲在线| 最新在线中文字幕| 国产精一品亚洲二区在线视频| av噜噜色噜噜久久| 亚洲欧美日韩免费| 中文字幕不卡一区| 欧美 亚洲 视频| 五月天国产在线| 欧美日韩国产一二三| 少妇愉情理伦片bd| 亚洲天堂日韩在线| 久久久精品一区| 国产乡下妇女做爰| 蜜桃视频一区二区三区| 成人3d动漫一区二区三区91| 你懂的在线看| 亚洲毛片av在线| 黄色片视频在线免费观看| 99久久婷婷国产综合精品首页| 欧美顶级少妇做爰| 中文成人无字幕乱码精品区| 成人免费av| 久久全国免费视频| 在线免费一级片| www.激情成人| 懂色av粉嫩av蜜臀av| 在线观看的黄色| 91精品国产91久久久久久最新毛片 | 亚洲男人的天堂在线| 色欲一区二区三区精品a片| 国产一区二区三区的电影 | 亚洲午夜日本在线观看| 国内自拍视频一区| 中文字幕区一区二区三| 日韩中文字幕不卡视频| 亚洲一区欧美在线| 狠狠色伊人亚洲综合成人| 久久精品国产一区二区三区日韩 | 日本人妻一区二区三区| 欧美色婷婷久久99精品红桃| 国色天香2019中文字幕在线观看| 影音先锋国产资源| 国产亚洲欧洲一区高清在线观看| 男人添女荫道口女人有什么感觉| 日本黄色一区| 亚洲人在线观看| 国产成人亚洲欧洲在线| 国产成人亚洲综合a∨婷婷图片| 日韩精品福利视频| 超碰一区二区| 亚洲精品第一页| 久久精品国产亚洲av无码娇色| 激情欧美一区二区| 亚洲精品国产精品久久| 欧美一区 二区 三区| 亚洲国产日韩欧美在线99| 青青草原在线免费观看视频| 麻豆国产精品官网| 亚洲v日韩v欧美v综合| 成人欧美一区二区三区的电影| 亚洲国产91色在线| 国产一级淫片免费| 高清shemale亚洲人妖| 日韩不卡一二区| 99综合99| 欧美成人免费一级人片100| 91影院在线播放| 国产精品久久久久久久久免费相片 | 欧美日韩一区二区三区在线视频 | 午夜欧美理论片| 亚洲精品日韩av| 中日韩高清电影网| 欧美成人三级在线| 日本三级理论片| 成人免费电影视频| 成人免费aaa| 中文字幕伦av一区二区邻居| 77777少妇光屁股久久一区| 天天操天天干天天爱| 黑人巨大精品欧美一区二区| 日本一区二区三区网站| 欧美亚洲免费| 色综合影院在线观看| yiren22亚洲综合| 久久精品免费电影| 好吊色在线观看| 第一福利永久视频精品| 国产免费一区二区三区网站免费| 日本中文字幕一区| 视频一区二区视频| 91精品入口| 欧洲成人午夜免费大片| 黄色av网站在线| 欧美久久久一区| 国产 日韩 欧美 成人| 91小视频免费观看| 在线免费视频a| 在线精品国产| 久久久综合亚洲91久久98| 欧美成a人片在线观看久| 在线观看免费高清视频97| 国产精品无码一区二区桃花视频| 亚洲一区二区中文在线| 国产ts丝袜人妖系列视频| 日本最新不卡在线| 欧美一区二区视频在线播放| 亚洲精品播放| 成人中文字幕+乱码+中文字幕| 日本无删减在线| 国产亚洲欧洲高清一区| 99久久精品无免国产免费 | 国产精品又粗又长| 成人午夜国产| 国产精品久久久久久久久久直播| 中文在线免费视频| 久久影院在线观看| 欧美成人免费| 日韩一区二区三区在线观看| 日本熟女毛茸茸| 一区二区三区四区在线播放| 右手影院亚洲欧美| 国产精品一区二区三区乱码 | 偷拍视频一区二区三区| 美女性感视频久久久| 日韩偷拍自拍| 日韩美女一区二区三区| 波多野结衣在线观看视频| 一级做a爱片久久| 超薄肉色丝袜一二三| 成人精品亚洲人成在线| 黄大色黄女片18第一次| 一区二区三区高清视频在线观看| 亚洲AV无码成人精品一区| 免费视频国产一区| 成人三级视频在线观看一区二区| 成人精品国产亚洲| 欧美与欧洲交xxxx免费观看| 在线观看av免费| 色狠狠久久aa北条麻妃| 美州a亚洲一视本频v色道| 亚洲国产精品嫩草影院久久| 国产suv精品一区二区69| 在线视频一区二区免费| 91国产丝袜播放在线| 亚洲精选视频在线| 女同久久另类69精品国产| 久久久久久影视| 欧美丰满少妇人妻精品| 成人av电影免费观看| 在线观看一区二区三区视频| 久久精品国产精品亚洲综合| 国产无套粉嫩白浆内谢的出处| 国产精品日韩| 国产69精品久久久久999小说| 欧美日韩蜜桃| 成人一区二区av| 亚洲精品二区三区| 亚洲国产精品女人| 亚洲一区二区日韩| 黄色网址在线免费看| 天天色天天射综合网| 在线看无码的免费网站| 色喇叭免费久久综合网| 亚洲一区二区三区乱码 | 26uuu亚洲综合色| 免费日本黄色网址| 26uuu国产一区二区三区| 中文字幕乱码在线| av一区二区久久| 亚洲少妇18p| wwwwxxxxx欧美| 一区二区黄色片| 国产农村妇女毛片精品久久麻豆| 男生草女生视频| 国产精品天美传媒沈樵| 国产喷水在线观看| 夜夜精品视频一区二区 | 丝袜国产在线| 欧美精品video| 牛牛精品一区二区| 国产91免费观看| 激情久久99| 99电影在线观看| 精品自拍偷拍| 青青草久久网络| 国产精品久久久久久久久妇女| 午夜探花在线观看| 99精品国产在热久久下载| 东京热加勒比无码少妇| 欧美bbbbb| 污免费在线观看| 不卡的av电影| 亚洲av无码国产精品麻豆天美| 欧美韩国日本一区| 国产免费无码一区二区视频| 亚洲国产一区二区三区青草影视| 天天插天天操天天干| 一本久道久久综合中文字幕| 在线观看色网站| 精品国偷自产国产一区| 久久视频www| 久久人人爽亚洲精品天堂| 大桥未久在线播放| 国产精品福利网| 亚洲不卡视频| 深田咏美在线x99av| 欧美xxx在线观看| 黄在线观看网站| 精品在线你懂的| 中文字幕免费在线播放| 国产精品视频免费| 五月天婷婷网站| 欧美日韩高清不卡| 婷婷在线免费观看| www.亚洲天堂| 成人福利视频| 成人看片视频| 日韩在线第七页| 男人操女人逼免费视频| 久久99国产精品免费网站| 国产老熟女伦老熟妇露脸| 日本一区二区视频在线| 国产精选第一页| 8v天堂国产在线一区二区| 偷拍精品一区二区三区| 欧美成人久久久| 四虎影视4hu4虎成人| 国产一区喷水| 欧美黄色一区二区| 久久这里只精品| 91麻豆高清视频| 久久久精品91| 欧美精品久久99久久在免费线| 日本亚洲一区| 欧美激情视频在线观看| 青草综合视频| 茄子视频成人在线观看| 一区二区三区四区五区在线| 亚洲AV成人精品| 日韩毛片在线免费观看| 欧美性猛交xxxx乱大交hd| 亚洲激情久久久| 污视频在线免费观看网站| 国产精品专区h在线观看| 香蕉久久精品日日躁夜夜躁| 精品一区二区三区无码视频| 韩国av一区二区三区在线观看| 日本激情小视频| 欧美日韩在线看| 午夜影院在线视频| 午夜精品免费视频| 国产伦精品一区二区三区免费优势| 欧美性受黑人性爽| 精品一区二区免费视频| 欧美性生交大片| 欧美日韩久久一区二区| 成年人在线看| 国产精品久久综合av爱欲tv| 精品国产精品| 日本久久精品一区二区| 久久九九全国免费| 自拍偷拍福利视频| 最近2019好看的中文字幕免费| 国产成人精品一区二区三区视频| 欧美一区2区三区4区公司二百| 午夜亚洲影视| 成人性生交大免费看| 色综合天天综合在线视频| 蜜桃视频在线入口www| 国产suv精品一区二区三区88区| 亚洲综合图色| 日本爱爱免费视频| 国产精品欧美久久久久一区二区| 在线观看xxxx| 欧美成人午夜激情视频| 最新国产一区二区| 乱妇乱女熟妇熟女网站| 久久麻豆一区二区| 日韩精选在线观看| 日韩在线播放av| 日韩黄色av| 欧美v在线观看| 国产精品网站在线观看| 国产尤物视频在线观看| 欧美老女人性视频| 精品亚洲自拍| 国产精品久久久久9999小说| 中文字幕在线一区免费| aaa一区二区| 欧美亚洲在线视频| 日韩欧美视频在线播放| 无码国产精品一区二区高潮| 亚洲国产成人高清精品| 裸体xxxx视频在线| 成人激情黄色网| 99xxxx成人网| 少妇愉情理伦三级| 日韩一区二区三区四区| 校园春色亚洲| 亚洲在线不卡| 成人精品国产福利| 五月激情丁香网| 欧美丰满片xxx777| 九一精品国产| 手机看片国产精品| 精品人伦一区二区三区蜜桃免费| 成人亚洲综合天堂| aa成人免费视频| 日本aⅴ免费视频一区二区三区| 182在线观看视频| 日韩成人在线播放| 99综合久久| 亚洲人成无码www久久久| 亚洲欧美另类久久久精品| 手机福利在线| 亚洲一区久久久| 老鸭窝91久久精品色噜噜导演| 我要看黄色一级片| 亚洲男人天堂久| 日韩精品一区国产| 亚洲成色www.777999| 午夜亚洲国产au精品一区二区| 成人在线观看网站| 蜜桃精品久久久久久久免费影院|