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

Quarkus依賴注入:用注解選擇注入Bean

開(kāi)發(fā) 前端
本篇學(xué)習(xí)一個(gè)與創(chuàng)建Bean有關(guān)的重要知識(shí)點(diǎn):一個(gè)接口如果有多個(gè)實(shí)現(xiàn)類時(shí),Bean實(shí)例應(yīng)該如何選擇其中的一個(gè)呢?可以用注解來(lái)設(shè)定Bean的選擇邏輯。

本篇概覽

  • 本文是《quarkus依賴注入》系列的第三篇,前文咱們掌握了創(chuàng)建bean的幾種方式,本篇趁熱打鐵,學(xué)習(xí)一個(gè)與創(chuàng)建bean有關(guān)的重要知識(shí)點(diǎn):一個(gè)接口如果有多個(gè)實(shí)現(xiàn)類時(shí),bean實(shí)例應(yīng)該如何選擇其中的一個(gè)呢?可以用注解來(lái)設(shè)定bean的選擇邏輯。
  • 如果您熟悉spring,此刻應(yīng)該會(huì)想到ConditionalXXX注解,下面的代碼來(lái)自spring官方,注解ConditionalOnProperty的作用是根據(jù)配置信息來(lái)控制bean是否實(shí)例化,本篇咱們要掌握的是quarkus框架下的類似控制邏輯。
@Service
@ConditionalOnProperty(
  value="logging.enabled", 
  havingValue = "true", 
  matchIfMissing = true)
class LoggingService {
    // ...
}
  • 本篇主要是通過(guò)實(shí)例學(xué)習(xí)以下五個(gè)注解的用法。
  1. LookupIfProperty,配置項(xiàng)的值符合要求才能使用bean。
  2. LookupUnlessProperty,配置項(xiàng)的值不符合要求才能使用bean。
  3. IfBuildProfile,如果是指定的profile才能使用bean。
  4. UnlessBuildProfile,如果不是指定的profile才能使用bean。
  5. IfBuildProperty,如果構(gòu)建屬性匹配才能使用bean。

源碼下載

  • 本篇實(shí)戰(zhàn)的完整源碼可在GitHub下載到,地址和鏈接信息如下表所示(https://github.com/zq2599/blog_demos)。

  • 這個(gè)git項(xiàng)目中有多個(gè)文件夾,本次實(shí)戰(zhàn)的源碼在quarkus-tutorials文件夾下,如下圖紅框。

  • quarkus-tutorials是個(gè)父工程,里面有多個(gè)module,本篇實(shí)戰(zhàn)的module是basic-di,如下圖紅框。

LookupIfProperty,配置項(xiàng)的值符合要求才能使用bean

  • 注解LookupIfProperty的作用是檢查指定配置項(xiàng),如果存在且符合要求,才能通過(guò)代碼獲取到此bean。
  • 有個(gè)關(guān)鍵點(diǎn)請(qǐng)注意:下圖是官方定義,可見(jiàn)LookupIfProperty并沒(méi)有決定是否實(shí)例化beam,它決定的是能否通過(guò)代碼取到bean,這個(gè)代碼就是Instance<T>來(lái)注入,并且用Instance.get方法來(lái)獲取。

  • 定義一個(gè)接口TryLookupIfProperty.java。
public interface TryLookupIfProperty {
    String hello();
}
  • 以及兩個(gè)實(shí)現(xiàn)類,第一個(gè)是TryLookupIfPropertyAlpha.java。
public class TryLookupIfPropertyAlpha implements TryLookupIfProperty {
    @Override
    public String hello() {
        return "from " + this.getClass().getSimpleName();
    }
}
  • 第二個(gè)TryLookupIfPropertyBeta.java。
public class TryLookupIfPropertyBeta implements TryLookupIfProperty {
    @Override
    public String hello() {
        return "from " + this.getClass().getSimpleName();
    }
}
  • 然后就是注解LookupIfProperty的用法了,如下所示,SelectBeanConfiguration是個(gè)配置類,里面有兩個(gè)方法用來(lái)生產(chǎn)bean,都用注解LookupIfProperty修飾,如果配置項(xiàng)service.alpha.enabled的值等于true,就會(huì)執(zhí)行tryLookupIfPropertyAlpah方法,如果配置項(xiàng)service.beta.enabled的值等于true,就會(huì)執(zhí)行tryLookupIfPropertyBeta方法。
package com.bolingcavalry.config;

import com.bolingcavalry.service.TryLookupIfProperty;
import com.bolingcavalry.service.impl.TryLookupIfPropertyAlpha;
import com.bolingcavalry.service.impl.TryLookupIfPropertyBeta;
import io.quarkus.arc.lookup.LookupIfProperty;
import javax.enterprise.context.ApplicationScoped;

public class SelectBeanConfiguration {

    @LookupIfProperty(name = "service.alpha.enabled", stringValue = "true")
    @ApplicationScoped
    public TryLookupIfProperty tryLookupIfPropertyAlpha() {
        return new TryLookupIfPropertyAlpha();
    }

    @LookupIfProperty(name = "service.beta.enabled", stringValue = "true")
    @ApplicationScoped
    public TryLookupIfProperty tryLookupIfPropertyBeta() {
        return new TryLookupIfPropertyBeta();
    }
}
  • 然后來(lái)驗(yàn)證注解LookupIfProperty是否生效,下面是單元測(cè)試代碼,有兩處需要注意的地方,稍后會(huì)提到。
package com.bolingcavalry;

import com.bolingcavalry.service.TryLookupIfProperty;
import com.bolingcavalry.service.impl.TryLookupIfPropertyAlpha;
import io.quarkus.test.junit.QuarkusTest;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import javax.enterprise.inject.Instance;
import javax.inject.Inject;

@QuarkusTest
public class BeanInstanceSwitchTest {

    @BeforeAll
    public static void setUp() {
        System.setProperty("service.alpha.enabled", "true");
    }

    // 注意,前面的LookupIfProperty不能決定注入bean是否實(shí)力話,只能決定Instance.get是否能取到,
    //所以此處要注入的是Instance,而不是TryLookupIfProperty本身
    @Inject
    Instance<TryLookupIfProperty> service;

    @Test
    public void testTryLookupIfProperty() {
        Assertions.assertEquals("from " + tryLookupIfPropertyAlpha.class.getSimpleName(),
                                service.get().hello());
    }
}
  • 上述代碼有以下兩點(diǎn)要注意。
  1. 注意TryLookupIfProperty的注入方式,對(duì)這種運(yùn)行時(shí)才能確定具體實(shí)現(xiàn)類的bean,要用Instance的方式注入,使用時(shí)要用Instance.get方法取得bean。
  2. 單元測(cè)試的BeforeAll注解用于指定測(cè)試前要做的事情,這里用System.setProperty設(shè)置配置項(xiàng)service.alpha.enabled,所以,理論上SelectBeanConfiguration.tryLookupIfPropertyAlpha方法應(yīng)該會(huì)執(zhí)行,也就是說(shuō)注入的TryLookupIfProperty應(yīng)該是TryLookupIfPropertyAlpha實(shí)例,所以testTryLookupIfProperty中用assertEquals斷言預(yù)測(cè):TryLookupIfProperty.hello的值來(lái)自TryLookupIfPropertyAlpha。
  • 執(zhí)行單元測(cè)試,如下圖,符合預(yù)期。

  • 修改BeanInstanceSwitchTest.setUp,將service.alpha.enabled改成service.alpha.enabled,如此理論上SelectBeanConfiguration.tryLookupIfPropertyBeta方法應(yīng)該會(huì)執(zhí)行,實(shí)例化的應(yīng)該就是TryLookupIfPropertyBeta,那么本次單元測(cè)試就不能通過(guò)了。
  • 如下圖,果然,注入的實(shí)例變成了TryLookupIfPropertyBeta,但是預(yù)期的還是之前的TryLookupIfPropertyAlpha,于是測(cè)試失敗。

LookupUnlessProperty,配置項(xiàng)的值不符合要求才能使用bean

  • LookupIfProperty的意思是配置項(xiàng)的值符合要求才會(huì)創(chuàng)建bean,而LookupUnlessProperty恰好相反,意思是配置項(xiàng)的值不符合要求才能使用bean。
  • 為了驗(yàn)證LookupUnlessProperty的效果,修改SelectBeanConfiguration.java,只修改tryLookupIfPropertyBeta方法的注解,由從之前的LookupIfProperty改為L(zhǎng)ookupUnlessProperty,屬性也改為service.alpha.enabled,現(xiàn)在的邏輯是:如果屬性service.alpha.enabled的值是true,就執(zhí)行tryLookupIfPropertyAlpha,如果屬性service.alpha.enabled的值不是true,就執(zhí)行tryLookupIfPropertyBeta。
public class SelectBeanConfiguration {

    @LookupIfProperty(name = "service.alpha.enabled", stringValue = "true")
    @ApplicationScoped
    public TryLookupIfProperty tryLookupIfPropertyAlpha() {
        return new TryLookupIfPropertyAlpha();
    }

    @LookupUnlessProperty(name = "service.alpha.enabled", stringValue = "true")
    @ApplicationScoped
    public TryLookupIfProperty tryLookupIfPropertyBeta() {
        return new TryLookupIfPropertyBeta();
    }
}
  • 打開(kāi)剛才的BeanInstanceSwitchTest.java,setUp方法中將service.alpha.enabled的值設(shè)為true。
@BeforeAll
public static void setUp() {
	System.setProperty("service.alpha.enabled", "true");
}
  • 運(yùn)行單元測(cè)試,如下圖,符合預(yù)期。

  • 現(xiàn)在把service.alpha.enabled的值設(shè)為false,單元測(cè)試不通過(guò),提示返回值是TryLookupIfPropertyBeta,這也是符合預(yù)期的,證明LookupUnlessProperty已經(jīng)生效了。

  • 此刻您可能會(huì)好奇,如果配置項(xiàng)service.alpha.enabled不存在會(huì)如何,咱們將setUp方法中的System.setProperty這段代碼刪除,這樣配置項(xiàng)service.alpha.enabled就不存在了,再次執(zhí)行單元測(cè)試,發(fā)現(xiàn)SelectBeanConfiguration類的tryLookupIfPropertyAlpha和tryLookupIfPropertyBeta兩個(gè)方法都沒(méi)有執(zhí)行,導(dǎo)致沒(méi)有TryLookupIfProperty類型的bean。

  • 這時(shí)候您應(yīng)該發(fā)現(xiàn)了一個(gè)問(wèn)題:如果配置項(xiàng)service.alpha.enabled不存在的時(shí)候如何返回一個(gè)默認(rèn)bean,以避免找不到bean呢?
  • LookupIfProperty和LookupUnlessProperty都有名為lookupIfMissing的屬性,意思都一樣:指定配置項(xiàng)不存在的時(shí)候,就執(zhí)行注解所修飾的方法,修改SelectBeanConfiguration.java,如下圖黃框所示,增加lookupIfMissing屬性,指定值為true(沒(méi)有指定的時(shí)候,默認(rèn)值是false)。

  • 再次運(yùn)行單元測(cè)試,如下圖,盡管service.alpha.enabled不存在,但lookupIfMissing屬性起了作用,SelectBeanConfiguration.tryLookupIfPropertyAlpha方法還是執(zhí)行了,于是測(cè)試通過(guò)。

IfBuildProfile,如果是指定的profile才能使用bean

  • 應(yīng)用在運(yùn)行時(shí),其profile是固定的,IfBuildProfile檢查當(dāng)前profile是否是指定值,如果是,其修飾的bean就能被業(yè)務(wù)代碼使用。
  • 對(duì)比官方對(duì)LookupIfProperty和IfBuildProfile描述的差別,LookupIfProperty決定了是否能被選擇,IfBuildProfile決定了是否在容器中。
# LookupIfProperty,說(shuō)的是be obtained by programmatic
Indicates that a bean should only be obtained by programmatic lookup if the property matches the provided value.
# IfBuildProfile,說(shuō)的是be enabled
the bean will only be enabled if the Quarkus build time profile matches the specified annotation value.
  • 接下來(lái)寫(xiě)代碼驗(yàn)證,先寫(xiě)個(gè)接口。
public interface TryIfBuildProfile {
    String hello();
}
  • 再寫(xiě)兩個(gè)實(shí)現(xiàn)類,第一個(gè)是TryIfBuildProfileProd.java。
public class TryIfBuildProfileProd implements TryIfBuildProfile {
    @Override
    public String hello() {
        return "from " + this.getClass().getSimpleName();
    }
}
  • 第二個(gè)TryIfBuildProfileDefault.java。
public class TryIfBuildProfileDefault implements TryIfBuildProfile {
    @Override
    public String hello() {
        return "from " + this.getClass().getSimpleName();
    }
}
  • 再來(lái)看IfBuildProfile的用法,在剛才的SelectBeanConfiguration.java中新增兩個(gè)方法,如下所示,應(yīng)用運(yùn)行時(shí),如果profile是test,那么tryIfBuildProfileProd方法會(huì)被執(zhí)行,還要注意的是注解DefaultBean的用法,如果profile不是test,那么quarkus的bean容器中就沒(méi)有TryIfBuildProfile類型的bean了,此時(shí)DefaultBean修飾的tryIfBuildProfileDefault方法就會(huì)被執(zhí)行,導(dǎo)致TryIfBuildProfileDefault的實(shí)例注冊(cè)在quarkus容器中。
@Produces
@IfBuildProfile("test")
public TryIfBuildProfile tryIfBuildProfileProd() {
	return new TryIfBuildProfileProd();
}

@Produces
@DefaultBean
public TryIfBuildProfile tryIfBuildProfileDefault() {
	return new TryIfBuildProfileDefault();
}
  • 單元測(cè)試代碼寫(xiě)在剛才的BeanInstanceSwitchTest.java中,運(yùn)行單元測(cè)試是profile被設(shè)置為test,所以tryIfBuildProfile的預(yù)期是TryIfBuildProfileProd實(shí)例,注意,這里和前面LookupIfProperty不一樣的是:這里的TryIfBuildProfile直接注入就好,不需要Instance<T>來(lái)注入。
@Inject
TryIfBuildProfile tryIfBuildProfile;

@Test
public void testTryLookupIfProperty() {
	Assertions.assertEquals("from " + TryLookupIfPropertyAlpha.class.getSimpleName(),
                            service.get().hello());
}

@Test
public void tryIfBuildProfile() {
	Assertions.assertEquals("from " + TryIfBuildProfileProd.class.getSimpleName(),
                tryIfBuildProfile.hello());
}
  • 執(zhí)行單元測(cè)試,如下圖,測(cè)試通過(guò),紅框顯示當(dāng)前profile確實(shí)是test。

  • 再來(lái)試試DefaultBean的是否正常,修改SelectBeanConfiguration.java的代碼,如下圖紅框,將IfBuildProfile注解的值從剛才的test改為prod,如此一來(lái),再執(zhí)行單元測(cè)試時(shí)tryIfBuildProfileProd方法就不會(huì)被執(zhí)行了,此時(shí)看tryIfBuildProfileDefault方法能否執(zhí)行。

  • 執(zhí)行單元測(cè)試,結(jié)果如下圖,黃框中的內(nèi)容證明是tryIfBuildProfileDefault方法被執(zhí)行,也就是說(shuō)DefaultBean正常工作。

UnlessBuildProfile,如果不是指定的profile才能使用bean

  • UnlessBuildProfile的邏輯與IfBuildProfile相反:如果不是指定的profile才能使用bean。
  • 回顧剛才測(cè)試失敗的代碼,如下圖紅框,單元測(cè)試的profile是test,下面要求profile必須等于prod,因此測(cè)試失敗,現(xiàn)在咱們將紅框中的IfBuildProfile改為UnlessBuildProfile,意思是profile不等于prod的時(shí)候bean可以使用。

  • 執(zhí)行單元測(cè)試,如下圖,這一次順利通過(guò),證明UnlessBuildProfile的作用符合預(yù)期。

IfBuildProperty,如果構(gòu)建屬性匹配才能使用bean

  • 最后要提到注解是IfBuildProperty是,此注解與LookupIfProperty類似,下面是兩個(gè)注解的官方描述對(duì)比,可見(jiàn)IfBuildProperty作用的熟悉主要是構(gòu)建屬性(前面的文章中提到過(guò)構(gòu)建屬性,它們的特點(diǎn)是運(yùn)行期間只讀,值固定不變)。
# LookupIfProperty的描述,如果屬性匹配,則此bean可以被獲取使用
Indicates that a bean should only be obtained by programmatic lookup if the property matches the provided value.
# IfBuildProperty的描述,如果構(gòu)建屬性匹配,則此bean是enabled
the bean will only be enabled if the Quarkus build time property matches the provided value
  • 限于篇幅,就不寫(xiě)代碼驗(yàn)證了,來(lái)看看官方demo,用法上與LookupIfProperty類似,可以用DefaultBean來(lái)兜底,適配匹配失敗的場(chǎng)景。
@Dependent
public class TracerConfiguration {

    @Produces
    @IfBuildProperty(name = "some.tracer.enabled", stringValue = "true")
    public Tracer realTracer(Reporter reporter, Configuration configuration) {
        return new RealTracer(reporter, configuration);
    }

    @Produces
    @DefaultBean
    public Tracer noopTracer() {
        return new NoopTracer();
    }
}
  • 至此,基于多種注解來(lái)選擇bean實(shí)現(xiàn)的學(xué)習(xí)已經(jīng)完成,依靠配置項(xiàng)和profile,已經(jīng)可以覆蓋多數(shù)場(chǎng)景下bean的確認(rèn),如果這些不能滿足您的業(yè)務(wù)需求,接下來(lái)的文章咱們繼續(xù)了解更多靈活的選擇bean的方式。
責(zé)任編輯:姜華 來(lái)源: 今日頭條
相關(guān)推薦

2023-06-27 08:58:13

quarkusBean

2023-06-29 08:32:41

Bean作用域

2016-03-21 17:08:54

Java Spring注解區(qū)別

2023-10-07 08:35:07

依賴注入Spring

2011-05-31 10:00:21

Android Spring 依賴注入

2017-08-16 16:00:05

PHPcontainer依賴注入

2022-12-29 08:54:53

依賴注入JavaScript

2009-06-15 17:48:32

Spring注解注入屬性

2011-04-15 09:44:45

Spring

2021-06-03 07:55:12

技術(shù)

2016-10-20 19:36:01

androiddagger2依賴注入

2024-12-30 12:00:00

.NET Core依賴注入屬性注入

2015-09-02 11:22:36

JavaScript實(shí)現(xiàn)思路

2022-04-30 08:50:11

控制反轉(zhuǎn)Spring依賴注入

2019-09-18 18:12:57

前端javascriptvue.js

2022-04-11 09:02:18

Swift依賴注

2014-07-08 14:05:48

DaggerAndroid依賴

2021-02-28 20:41:18

Vue注入Angular

2024-04-01 00:02:56

Go語(yǔ)言代碼

2025-01-13 00:13:59

VSCode架構(gòu)依賴注入
點(diǎn)贊
收藏

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

少妇黄色一级片| 精品国产欧美一区二区五十路| 欧美少妇在线观看| 少妇人妻精品一区二区三区| 久久九九电影| 久久成人免费视频| 爱爱的免费视频| 爱情电影网av一区二区| 亚洲高清久久久| 亚洲欧美日韩国产yyy| 老牛影视av牛牛影视av| 青娱乐精品视频| 午夜精品一区二区三区在线视| 99久久99久久精品免费| 91蝌蚪精品视频| 欧美日韩中文一区| heyzo国产| 在线看三级电影| 久久亚洲综合av| 97自拍视频| 亚洲天堂网在线视频| 99精品视频网| 久久成人综合视频| 精品无码国产污污污免费网站| 亚洲精品国产九九九| 欧美日韩一级二级| 国产91对白刺激露脸在线观看| 超碰在线免费播放| 国产精品污www在线观看| 久久99精品久久久久久三级| 国产丰满果冻videossex| 青青草精品视频| 欧日韩在线观看| 国产一级特黄毛片| 欧美激情亚洲| 久久久久999| 色婷婷粉嫩av| 日韩电影一区| 国产亚洲激情视频在线| 久久丫精品国产亚洲av不卡| 97品白浆高清久久久久久| 69堂亚洲精品首页| 欧美另类久久久品| 欧洲av无码放荡人妇网站| av中文字幕在线观看第一页| 亚洲精品你懂的| 亚洲成人午夜在线| 在线看的av网站| 国产精品欧美经典| 天堂资源在线亚洲视频| 爱爱爱免费视频在线观看| 国产亚洲美州欧州综合国| 欧美日韩一区二区三区免费| 亚洲欧美日韩动漫| 久久综合久久综合九色| 免费看成人片| 成人综合影院| 国产精品久久久久影院色老大| 亚洲国产精品一区二区第一页| 97人人在线| 日韩一区中文字幕| 男人草女人视频| freexxx性亚洲精品| 欧美午夜精品久久久久久浪潮| 国模无码视频一区二区三区| 亚洲黄色中文字幕| 欧美性猛交xxxx黑人交| 亚洲综合色在线观看| 四虎在线精品| 欧美v日韩v国产v| 三级黄色片网站| 国产欧美日韩免费观看 | 亚洲国产日韩欧美在线观看| 欧洲精品一区二区三区| 欧美日韩一区二区三区视频| 久久久久久综合网| 国产精品xxxav免费视频| 亚洲老头同性xxxxx| 正在播放国产对白害羞| 欧美激情1区| 97精品一区二区三区| 欧美一区二区三区网站| 精品一区二区日韩| 电影午夜精品一区二区三区| 天堂91在线| 欧洲不卡av| 国产清纯白嫩初高生在线观看91 | 欧美日韩午夜影院| 欧美体内she精高潮| 黄色免费大全亚洲| 中文字幕av一区二区三区谷原希美| 在线观看黄网址| 亚洲精品系列| 国产精品中文字幕在线观看| 亚洲国产福利视频| 国产日韩精品一区二区浪潮av| 三年中国中文在线观看免费播放| www欧美xxxx| 欧美三级在线播放| 中文字幕免费在线播放| 91一区二区| 51午夜精品视频| 国产美女三级无套内谢| 91美女视频网站| 美女在线免费视频| 综合在线影院| 精品国产一区久久| 蜜桃av.com| 亚洲一区国产一区| 51蜜桃传媒精品一区二区| 国产主播福利在线| 午夜精品福利视频网站| 亚洲AV无码久久精品国产一区| 亚洲素人在线| 国模吧一区二区| 国产一区二区三区视频免费观看| 91年精品国产| www插插插无码免费视频网站| 999国产精品亚洲77777| 日韩精品在线第一页| 国产精品 欧美激情| 秋霞影院一区二区| 麻豆91蜜桃| 女厕盗摄一区二区三区| 日韩视频免费直播| 老司机成人免费视频| 天堂午夜影视日韩欧美一区二区| 亚洲欧美激情一区| 日韩黄色片视频| 亚洲一区二区三区免费| 日韩在线观看成人| 无码人妻一区二区三区免费| av中文字幕不卡| 97免费视频观看| 欧州一区二区三区| 伦理中文字幕亚洲| 国产乱码精品一区二区三区精东| 国产日韩欧美不卡| 国产视频在线视频| 国产精品欧美在线观看| 日韩美女在线观看| 色视频在线观看免费| 婷婷国产在线综合| 95视频在线观看| 在线国产欧美| 丁香婷婷久久久综合精品国产| 国产黄a三级三级三级av在线看| 欧美三级乱人伦电影| 少妇无套高潮一二三区| 日精品一区二区| 日本日本精品二区免费| 日韩不卡免费高清视频| 国产亚洲成精品久久| 国产精品国产精品国产| 欧美高清在线视频| 欧美大尺度做爰床戏| 久久中文字幕二区| 91精品啪aⅴ在线观看国产| а√天堂在线官网| 欧美成人aa大片| 日本少妇毛茸茸高潮| 成人免费av资源| 久久久999视频| 欧美在线色图| 亚洲精品免费网站| 超碰97免费在线| 亚洲免费视频观看| 伊人久久一区二区| 一区二区三区中文在线| 97人妻精品一区二区三区免费| 国产精品久久久一区二区| 欧洲高清一区二区| 91精品麻豆| 国自在线精品视频| 国产在线免费观看| 在线播放日韩导航| 精品少妇theporn| 久久久蜜臀国产一区二区| 亚洲欧美日韩中文视频| 国产a免费视频| 不卡视频免费播放| 能看的毛片网站| 夜间精品视频| 久久精品二区| 亚洲伦理一区二区| 欧美极品美女电影一区| 国产在线一二三| 91麻豆精品国产综合久久久久久| 国产 日韩 欧美 成人| 久久老女人爱爱| 国产欧美精品一二三| 新67194成人永久网站| 在线观看亚洲视频啊啊啊啊| 国产精品对白久久久久粗| 国产精品久久久久一区二区| a级影片在线观看| 亚洲欧美日韩中文在线| www国产一区| 91高清在线观看| 精品无码m3u8在线观看| 国产精品沙发午睡系列990531| 日本国产在线视频| 精品亚洲porn| av网址在线观看免费| 亚洲欧美综合久久久| 欧美日韩视频在线一区二区观看视频| 韩国三级成人在线| 国产成人亚洲综合青青| 免费在线观看的电影网站| 中日韩美女免费视频网站在线观看 | 午夜激情一区| 日日骚一区二区网站| 国产区精品视频在线观看豆花| 国产精品亚洲网站| 伊人久久视频| 久久久免费高清电视剧观看| 国产调教视频在线观看| 伊人精品在线观看| 五月激情婷婷网| 精品日韩成人av| 国产精品久久久久久久久久久久久久久久 | 国产麻豆精品一区| 欧美系列一区二区| www欧美在线| 久久久久黄久久免费漫画| 精品欧美一区二区三区精品久久 | 激情国产在线| 色在人av网站天堂精品| 免费网站成人| 中文字幕精品一区二区精品| 完全免费av在线播放| 亚洲色婷婷一区二区三区| 国产精品乱码妇女bbbb| 卡一卡二卡三在线观看| 久久精品综合网| 巨胸大乳www视频免费观看| 99精品视频一区二区| 日本美女视频网站| 成人久久视频在线观看| 成年人看片网站| 国产精品一二三区| japan高清日本乱xxxxx| 国产一区二区美女诱惑| 91看片破解版| 国产一区二区中文字幕| 捷克做爰xxxⅹ性视频| 国产一区二区伦理片| 一起草最新网址| 国v精品久久久网| 熟妇高潮一区二区| 成人av免费在线播放| 亚洲制服丝袜在线播放| 91香蕉视频黄| 免费视频91蜜桃| 国产精品三级视频| 糖心vlog免费在线观看| 亚洲欧美区自拍先锋| 麻豆视频在线观看| 亚洲国产日韩av| 97免费在线观看视频| 日韩欧美国产激情| 波多野结衣电影在线播放| 欧美色大人视频| aa视频在线免费观看| 精品国产区一区| 性高潮久久久久久久久久| 亚洲视频在线观看网站| 1pondo在线播放免费| 欧美老少做受xxxx高潮| 韩日毛片在线观看| 国产成人一区二| 玖玖玖电影综合影院| 国产伦精品一区二区三区照片91| 亚州国产精品| 亚洲自拍的二区三区| 综合视频在线| a√天堂在线观看| 免费观看日韩电影| 午夜大片在线观看| 99re热这里只有精品视频| 在线观看免费小视频| 亚洲女爱视频在线| 啦啦啦免费高清视频在线观看| 欧美午夜视频网站| 亚洲爱爱综合网| 亚洲人在线观看| 2024短剧网剧在线观看| 人人做人人澡人人爽欧美| 国产精品视频一区视频二区| 久久久久成人精品免费播放动漫| 午夜激情久久| jizzjizzxxxx| 国内精品久久久久影院一蜜桃| 极品粉嫩小仙女高潮喷水久久| 中文字幕亚洲成人| 日韩在线视频免费播放| 欧美一区二区视频网站| 青青草视频在线免费观看| 久久伊人精品天天| 午夜欧美巨大性欧美巨大| 99超碰麻豆| 91九色精品| 成人一区二区三| av在线不卡免费看| 91高清免费看| 欧美偷拍一区二区| 手机av免费在线观看| 久久成人亚洲精品| av成人亚洲| 欧美日韩国产高清视频| 亚洲手机视频| 五月天婷婷在线观看视频| 欧美激情中文不卡| 91在线看视频| 亚洲精品在线观| 91精品久久| 91精品视频免费看| 精品久久久久久久久久久下田| 男人添女人下面高潮视频| 国产精品2024| 日韩激情综合网| 欧美亚洲国产一区二区三区va| 亚洲aⅴ在线观看| 亚州国产精品久久久| 欧美激情精品| 一区中文字幕在线观看| 美女一区二区三区| www.99热| 在线观看欧美精品| 欧美18xxxxx| 2020久久国产精品| 无码日韩精品一区二区免费| 亚洲国产精品无码观看久久| 国产成人免费在线视频| 动漫性做爰视频| 欧美一区二区三区性视频| 麻豆视频在线观看免费网站| 国产精品美女久久| 欧美在线电影| 中文字幕免费高清在线| 国产精品国模大尺度视频| 中文字幕码精品视频网站| 在线观看日韩视频| 国产精品.xx视频.xxtv| 亚洲一卡二卡| 寂寞少妇一区二区三区| 日韩在线视频网址| 日韩丝袜美女视频| 牛牛在线精品视频| 国产一区二区久久久| 欧美亚洲一级| 人妻体内射精一区二区| 91黄色免费看| 日韩免费啪啪| 5g国产欧美日韩视频| 国内综合精品午夜久久资源| 久久久老熟女一区二区三区91| 午夜精品一区二区三区电影天堂| 天天干天天色天天| 日本老师69xxx| 日韩综合网站| 中文字幕av一区二区三区人妻少妇| 亚洲午夜日本在线观看| 午夜18视频在线观看| 日本精品性网站在线观看| 欧美日中文字幕| 国产探花在线观看视频| 亚洲国产另类精品专区| 人人九九精品| 成人精品视频久久久久| 欧美日一区二区在线观看| 国产精品无码毛片| 精品视频资源站| 亚洲男同gay网站| 久久国产欧美精品| 精品无人码麻豆乱码1区2区 | 精品人伦一区二区三区蜜桃网站| 青青草免费在线| 成人黄色短视频在线观看| 狠狠88综合久久久久综合网| 日本丰满少妇裸体自慰| 欧美日韩国产一区| 91黄页在线观看| 亚洲a∨一区二区三区| 国产91精品一区二区麻豆亚洲| 亚洲欧美综合自拍| 久久精品国产清自在天天线| 动漫视频在线一区| 中文字幕第100页| 亚洲成人av在线电影| 一本一道波多野毛片中文在线| 成人黄动漫网站免费| 日韩和欧美一区二区三区| 欧美成人综合色| 国产一区二区三区中文| 粉嫩久久久久久久极品| 亚洲欧美日韩一级| 午夜精品在线看| 黄色网页网址在线免费| 欧美一区二区在线|