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

有多少人用過Spring的@Lookup注解?

開發(fā) 前端
Spring的@Lookup注解提供了一種靈活的機制,用于在運行時動態(tài)地創(chuàng)建和初始化beans。通過@Lookup,開發(fā)者可以在配置中指定一個方法,該方法會在運行時被調(diào)用以獲取相應(yīng)的bean實例。這使得在某些特定條件下或在運行時配置變更時,能夠動態(tài)地選擇和創(chuàng)建不同的bean實現(xiàn)。

環(huán)境:Spring5.3.23

1. 簡介

Lookup方法注入能夠根據(jù)@Lookup注解的value屬性值或被注解該方法的返回值,從容器中查找bean作為方法的返回值對象使用。Spring容器會通過CGLIB生成當(dāng)前類的代理,然后重寫被@Lookup注解的方法。

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Lookup {


  /**
   * 根據(jù)你設(shè)置的value值,從容器中查找對應(yīng)的bean,如果沒有指定value值
   * 那么會根據(jù)被注解方法的返回值類型從容器中查找相應(yīng)的bean
   */
  String value() default "";


}

2. 應(yīng)用案例

準(zhǔn)備基礎(chǔ)類

static interface HttpSecurity {
  void http() ;
}
static class HtmlHttpSecurity implements HttpSecurity {
  @Override
  public void http() {
    System.out.println("Html HttpSecurity...") ;
  }
}

定義一個抽象類

該類中有一個抽象方法被@Lookup注解標(biāo)注

static abstract class SecurityManager {
  public void execute() {
    HttpSecurity httpSecurity = httpSecurity() ;
    System.out.println(httpSecurity.getClass()) ;
    httpSecurity.http() ; 
  }
  @Lookup("html")
  protected abstract HttpSecurity httpSecurity() ;
}

注冊Bean

將上面的類注冊到容器中

public static void main(String[] args) {
  try (AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext()) {
    context.registerBean("html", HtmlHttpSecurity.class) ;
    context.register(SecurityManager.class) ;
    context.refresh() ;
    SecurityManager sm = context.getBean(SecurityManager.class);
    sm.execute() ;
    System.out.println(sm.getClass()) ;
  }
}

執(zhí)行結(jié)果

class com.pack.main.lookup.MethodLookupInjectMain2$HtmlHttpSecurity
Html HttpSecurity...
class com.pack.main.lookup.MethodLookupInjectMain2$SecurityManager$$EnhancerBySpringCGLIB$$ae697832

SecurityManager通過CGLIB被創(chuàng)建為了代理類。同時execute方法中HttpSecurity對象就是HtmlHttpSecurity類,也就是容器通過查找注入的。

去掉@Lookup注解的value屬性

@Lookup
protected abstract HttpSecurity httpSecurity() ;

繼續(xù)執(zhí)行上面的測試代碼,程序也能正常的輸出。

在添加一個HttpSecurity的實現(xiàn)

static class CssHttpSecurity implements HttpSecurity {
  @Override
  public void http() {
    System.out.println("Css HttpSecurity...") ;
  }
}

將上面的類也注冊到容器中,如果這時候你的@Lookup注解沒有value屬性將會報錯

Exception in thread "main" org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'com.pack.main.lookup.MethodLookupInjectMain2$HttpSecurity' available: expected single matching bean but found 2: html,css
  at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1273)

expected single matching bean but found 2: html,css;錯誤提示你有2個bean,期望的是一個,所以這里我們必須添加value屬性,指明要查找的bean對象。

繼續(xù)測試,被@Lookup注解的方法是不是必須是抽象的?

修改代碼如下:

@Lookup("html")
protected HttpSecurity httpSecurity() {
  return null ;
};

方法返回null,執(zhí)行結(jié)果

class com.pack.main.lookup.MethodLookupInjectMain2$HtmlHttpSecurity
Html HttpSecurity...
class com.pack.main.lookup.MethodLookupInjectMain2$SecurityManager$$EnhancerBySpringCGLIB$$ae697832

程序正常,沒有問題。這也說明了,這里和具體的返回值是沒有關(guān)系的。

3. 實現(xiàn)原理

容器在創(chuàng)建一個Bean對象時會執(zhí)行如下步驟

public abstract class AbstractAutowireCapableBeanFactory {
  protected Object doCreateBean() {
    BeanWrapper instanceWrapper = null;
    // ...
    if (instanceWrapper == null) {
      // 創(chuàng)建實例
      instanceWrapper = createBeanInstance(beanName, mbd, args);
    }
    // ...
  }
  protected BeanWrapper createBeanInstance() {
    // 查找構(gòu)造方法
    Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
    // 實例化bean對象;上面一步對@Lookup注解的方法進行了初始化查找
    return instantiateBean(beanName, mbd);
  }
  protected Constructor<?>[] determineConstructorsFromBeanPostProcessors(@Nullable Class<?> beanClass, String beanName)
      throws BeansException {


    if (beanClass != null && hasInstantiationAwareBeanPostProcessors()) {
      // 調(diào)用BeanPostProcessor
      for (SmartInstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().smartInstantiationAware) {
        // 這里通過了AutowiredAnnotationBeanPostProcessor處理器
        // 這里其實最終返回了null,關(guān)鍵就是執(zhí)行了下面的動作,查找了@Lookup注解的方法進行解析
        // 保存到BeanDefinition中
        Constructor<?>[] ctors = bp.determineCandidateConstructors(beanClass, beanName);
        if (ctors != null) {
          return ctors;
        }
      }
    }
    return null;
  }
}

AutowiredAnnotationBeanPostProcessor處理器

public class AutowiredAnnotationBeanPostProcessor {
  public Constructor<?>[] determineCandidateConstructors() {
    do {
      // 遍歷當(dāng)前類的所有方法
      ReflectionUtils.doWithLocalMethods(targetClass, method -> {
        // 獲取方法是的@Lookup注解
        Lookup lookup = method.getAnnotation(Lookup.class);
        if (lookup != null) {
          // 如果存在則構(gòu)造LookupOverride對象,將當(dāng)前的Method及注解的value值傳入
          LookupOverride override = new LookupOverride(method, lookup.value());
          try {
            RootBeanDefinition mbd = (RootBeanDefinition)this.beanFactory.getMergedBeanDefinition(beanName);
            // 最后將其保存到BeanDefinition中
            mbd.getMethodOverrides().addOverride(override);
          }
        }
      });
      targetClass = targetClass.getSuperclass();
    }
    while (targetClass != null && targetClass != Object.class);
  }
}

繼續(xù)上面執(zhí)行到instantiateBean方法

public abstract class AbstractAutowireCapableBeanFactory {
  protected BeanWrapper instantiateBean() {
    // getInstancetiationStrategy方法返回了CglibSubclassingInstantiationStrategy
    beanInstance = getInstantiationStrategy().instantiate(mbd, beanName, this);
  }
}

進入SimpleInstantiationStrategy#instanceiate方法

public class SimpleInstantiationStrategy implements InstantiationStrategy {
  public Object instantiate(RootBeanDefinition bd) {
    // 判斷當(dāng)前的BeanDefinition中是否有LookupOverride
    // 上面查找到后已經(jīng)將其保存到了BeanDefinition中。
    if (!bd.hasMethodOverrides()) {
      // ...
    }
    else {
      // 存在則通過CGLIB進行創(chuàng)建代理
      // 進入CglibSubclassingInstantiationStrategy
      return instantiateWithMethodInjection(bd, beanName, owner);
    }
  }
}

CglibSubclassingInstantiationStrategy

public class CglibSubclassingInstantiationStrategy extends SimpleInstantiationStrategy {
  protected Object instantiateWithMethodInjection(RootBeanDefinition bd, @Nullable String beanName, BeanFactory owner) {
    return instantiateWithMethodInjection(bd, beanName, owner, null);
  }
  protected Object instantiateWithMethodInjection(RootBeanDefinition bd, @Nullable String beanName, BeanFactory owner,
      @Nullable Constructor<?> ctor, Object... args)
    return new CglibSubclassCreator(bd, owner).instantiate(ctor, args);
  }
}

CglibSubclassCreator

private static class CglibSubclassCreator {
  private static final Class<?>[] CALLBACK_TYPES = new Class<?>[]
        {NoOp.class, LookupOverrideMethodInterceptor.class, ReplaceOverrideMethodInterceptor.class};
  public Object instantiate(@Nullable Constructor<?> ctor, Object... args) {
    // 創(chuàng)建代理,當(dāng)前類的子類
    Class<?> subclass = createEnhancedSubclass(this.beanDefinition);
    // ...
  }
  private Class<?> createEnhancedSubclass(RootBeanDefinition beanDefinition) {
    Enhancer enhancer = new Enhancer();
    enhancer.setSuperclass(beanDefinition.getBeanClass());
    enhancer.setNamingPolicy(SpringNamingPolicy.INSTANCE);
    if (this.owner instanceof ConfigurableBeanFactory) {
      ClassLoader cl = ((ConfigurableBeanFactory) this.owner).getBeanClassLoader();
      enhancer.setStrategy(new ClassLoaderAwareGeneratorStrategy(cl));
    }
    
    enhancer.setCallbackFilter(new MethodOverrideCallbackFilter(beanDefinition));
    // 我們主要關(guān)注這里,這些都是CGLIB相關(guān)的知識了。
    // 關(guān)注LookupOverrideMethodInterceptor攔截器
    enhancer.setCallbackTypes(CALLBACK_TYPES);
    return enhancer.createClass();
  }
}

LookupOverrideMethodInterceptor攔截器

private static class LookupOverrideMethodInterceptor extends CglibIdentitySupport implements MethodInterceptor {
  public Object intercept(Object obj, Method method, Object[] args, MethodProxy mp) throws Throwable {
      LookupOverride lo = (LookupOverride) getBeanDefinition().getMethodOverrides().getOverride(method);
      Object[] argsToUse = (args.length > 0 ? args : null);  // if no-arg, don't insist on args at all
      // 判斷是否設(shè)置了@Lookup value值
      if (StringUtils.hasText(lo.getBeanName())) {
        // 根據(jù)value指定的值查找bean對象
        Object bean = (argsToUse != null ? this.owner.getBean(lo.getBeanName(), argsToUse) :
            this.owner.getBean(lo.getBeanName()));
        return (bean.equals(null) ? null : bean);
      }
      // 如果沒有設(shè)置value,那么會根據(jù)方法的返回值類型在容器中查找bean
      else {
        ResolvableType genericReturnType = ResolvableType.forMethodReturnType(method);
        return (argsToUse != null ? this.owner.getBeanProvider(genericReturnType).getObject(argsToUse) :
            this.owner.getBeanProvider(genericReturnType).getObject());
      }
    }
}

以上就是@Lookup注解的原理

總結(jié):Spring的@Lookup注解提供了一種靈活的機制,用于在運行時動態(tài)地創(chuàng)建和初始化beans。通過@Lookup,開發(fā)者可以在配置中指定一個方法,該方法會在運行時被調(diào)用以獲取相應(yīng)的bean實例。這使得在某些特定條件下或在運行時配置變更時,能夠動態(tài)地選擇和創(chuàng)建不同的bean實現(xiàn)。

完畢!!!

責(zé)任編輯:武曉燕 來源: Spring全家桶實戰(zhàn)案例源碼
相關(guān)推薦

2013-08-20 15:27:59

Linux操作系統(tǒng)

2019-08-08 16:27:36

自動駕駛無人駕駛駕駛

2020-04-02 14:33:42

MySQLBUG解決方案

2020-07-20 09:40:49

MySQLBUG數(shù)據(jù)庫

2022-11-12 12:32:39

.NET微軟

2010-07-01 14:35:57

Windows 7

2023-04-09 15:23:58

Python編程開發(fā)

2022-10-11 16:28:42

比特幣加密貨幣資產(chǎn)

2021-07-29 06:28:13

網(wǎng)絡(luò)網(wǎng)工網(wǎng)絡(luò)中斷

2018-07-23 14:47:09

人工智能AI機器

2021-04-15 11:07:01

比特幣貨幣加密貨幣

2018-06-21 07:40:23

無線充電無線供電無線輸電

2020-11-13 10:25:41

人臉數(shù)據(jù)

2010-08-09 16:39:42

職場

2021-08-29 23:20:09

5G4G技術(shù)

2012-04-16 15:08:33

2020-10-20 11:16:04

人工智能

2019-01-23 11:08:13

Windows微軟操作系統(tǒng)

2012-11-08 09:25:12

Win 8

2018-10-31 09:16:00

人工智能機器學(xué)習(xí)技術(shù)
點贊
收藏

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

精品国产乱码一区二区三| 日本韩国欧美在线观看| 中文字幕免费观看视频| 成人午夜国产| 一区二区欧美国产| 国产精品一国产精品最新章节| 国产无精乱码一区二区三区| 欧美中文一区| 在线视频欧美精品| 特级西西444www大精品视频| 国产又粗又猛又爽又黄的| 欧美黄色精品| 亚洲精品不卡在线| 五月婷婷丁香综合网| 成年人视频免费在线观看| 激情五月播播久久久精品| 欧美精品免费播放| 日本人dh亚洲人ⅹxx| 国产美女高潮在线观看| 国产精品色呦呦| av激情久久| 日日夜夜狠狠操| 久久国产综合| 亚洲国产精品久久久久久| 九一精品在线观看| 免费黄色电影在线观看| 成年人国产精品| 国产精品极品尤物在线观看| 亚洲av鲁丝一区二区三区 | 亚洲亚洲人成综合网络| 欧美日韩一区二区三区免费| 国产视频手机在线| 亚洲在线日韩| 日韩在线不卡视频| 亚洲黄色免费在线观看| 91精品网站在线观看| 天天综合网 天天综合色| 四虎永久国产精品| 色窝窝无码一区二区三区| 日韩av一级片| 欧美日韩国产va另类| 中文字幕av久久爽一区| caoporn成人| 欧美日韩成人在线| 粉嫩虎白女毛片人体| 精品自拍一区| 国产欧美一区二区精品性色| 精品无人区一区二区三区竹菊| 国产毛片一区二区三区va在线| 久久黄色影院| 午夜精品久久久久久久男人的天堂| 欧美丰满美乳xxⅹ高潮www| 欧美aaaaa级| 日韩精品自拍偷拍| 91av视频免费观看| 成人自拍视频网| 日韩欧美在线观看| 99视频在线免费播放| a视频在线观看免费| 欧美激情一区二区三区不卡| 久久综合福利| 五月天婷婷社区| 高清不卡在线观看av| 亚洲最大福利视频| 精品人妻少妇嫩草av无码专区| 麻豆视频观看网址久久| 国产精品入口尤物| 一级aaaa毛片| 国产精品1区2区3区在线观看| 亚洲一区二区三区久久| 午夜免费福利视频| av资源站一区| 日韩av一区二区三区在线观看| 福利成人在线观看| 国产精品免费丝袜| 黄色录像特级片| 免费网站在线观看人| 午夜欧美大尺度福利影院在线看| 日韩欧美国产综合在线| av有声小说一区二区三区| 欧美中文字幕一区二区三区亚洲| 九九精品久久久| 日本成人手机在线| 日韩国产高清视频在线| 伊人影院综合网| 中文无码久久精品| 2023亚洲男人天堂| 在线观看免费观看在线| 国产成人在线免费| 蜜桃传媒视频麻豆一区| 人人干在线视频| 亚洲国产日韩综合久久精品| 国产l精品国产亚洲区久久| 日韩毛片免费视频一级特黄| 精品国产在天天线2019| av男人的天堂av| 欧美成人一区二免费视频软件| 91精品国产色综合久久不卡98| 糖心vlog精品一区二区| 懂色av中文一区二区三区| 欧美日韩一区二区视频在线观看| 超碰在线网址| 色狠狠桃花综合| 亚洲天堂小视频| 欧美禁忌电影网| 欧美精品在线第一页| 天码人妻一区二区三区在线看| 国产真实乱子伦精品视频| 精品免费国产| 91麻豆免费在线视频| 色综合天天在线| 激情小说欧美色图| 日韩综合在线| 国产成人+综合亚洲+天堂| 亚洲精选一区二区三区| 国产精品欧美久久久久无广告| 国产日韩av网站| 色综合视频一区二区三区44| 日韩精品在线观看一区| 久久精品www人人爽人人| 青青草97国产精品免费观看 | 少妇人妻互换不带套| 日韩欧美久久| 日韩在线观看高清| 午夜精品免费观看| 成人动漫在线一区| 久久免费一级片| 久久久久黄色| 亚洲午夜国产成人av电影男同| 日本免费一二三区| 国产福利一区在线| 中文字幕不卡每日更新1区2区| 91精品影视| 日韩精品视频中文在线观看| 久久这里只有精品免费| 激情成人午夜视频| 亚洲三区四区| 国产精品66| 伊人一区二区三区久久精品| 国产一级免费视频| 91美女在线观看| 日韩少妇内射免费播放| 久久97精品| 欧美黑人视频一区| 国产精品人妻一区二区三区| 国产精品福利一区| 老司机午夜性大片| 影视一区二区| 亚洲a区在线视频| 国产精品va在线观看视色| 欧美日韩黄色影视| 蜜桃视频最新网址| 久久超级碰视频| 懂色av一区二区三区四区五区| 综合欧美精品| 欧美xxxx做受欧美| 亚洲精品喷潮一区二区三区| 亚洲永久免费视频| 欧美做受高潮中文字幕| 99精品视频免费观看视频| 国产精品二区二区三区| 波多野结衣在线播放| 精品国产3级a| 国产精品21p| 欧美国产亚洲另类动漫| 亚洲免费av一区| 欧美午夜影院| 麻豆av一区二区三区久久| 天堂а√在线最新版中文在线| 国产婷婷97碰碰久久人人蜜臀 | 蜜桃久久av| 亚洲mv在线看| 玖玖精品一区| 97久久精品国产| 爱久久·www| 制服丝袜亚洲精品中文字幕| 特级片在线观看| 91在线你懂得| 黄色在线视频网| 欧美日韩国产色综合一二三四| 黄色一区三区| 少妇精品视频一区二区免费看| 日韩在线不卡视频| 天堂av在线免费| 在线视频国内一区二区| 99鲁鲁精品一区二区三区| 成人免费高清视频| 亚洲视频在线观看一区二区三区| 午夜影院欧美| 蜜桃视频在线观看成人| 亚洲精品aaa| 97超级碰碰碰| 麻豆传媒在线观看| 日韩av影片在线观看| 中文字幕在线播放av| 亚洲综合丝袜美腿| 国产激情av在线| 粉嫩嫩av羞羞动漫久久久| 欧美丰满熟妇xxxxx| 91精品1区| 欧美婷婷久久| 国产91精品入| 国产免费成人av| 日本不良网站在线观看| 久久精品99久久香蕉国产色戒| 婷婷在线观看视频| 欧美高清精品3d| 中文字幕av影院| 亚洲精品日韩一| 日本精品久久久久中文| av在线综合网| 黄色三级视频在线播放| 日日欢夜夜爽一区| 免费看国产曰批40分钟| 婷婷中文字幕一区| 色之综合天天综合色天天棕色| jazzjazz国产精品麻豆| 91精品久久久久久久久| 久久久久久久| 91av视频在线播放| 蜜乳av一区| 久久精品小视频| 成人影视在线播放| 日韩国产欧美区| 亚洲精品国偷拍自产在线观看蜜桃 | 亚洲激情自拍图| 午夜精品一区二区三| 91精品国产麻豆| 影音先锋黄色网址| 欧亚洲嫩模精品一区三区| 久久青青草视频| 精品成人av一区| 中文字幕一区二区三区手机版 | 免费观看一区二区三区毛片| 亚洲另类色综合网站| 色偷偷www8888| 国产精品色在线观看| 亚洲一区二区自偷自拍| 久久免费视频色| 亚洲做受高潮无遮挡| 99re热这里只有精品视频| 男男做爰猛烈叫床爽爽小说| 成人永久aaa| 精品少妇人妻av一区二区三区| 国产精品一区二区久久精品爱涩| 国产大片一区二区三区| 国产精品综合网| 又黄又爽又色的视频| 国产一区二区三区综合| 美女被艹视频网站| 国产激情一区二区三区桃花岛亚洲| av中文字幕网址| 韩国精品一区二区| 日本55丰满熟妇厨房伦| 国产aⅴ综合色| 无码人妻精品一区二区三| 91在线视频观看| 偷拍夫妻性生活| 国产精品午夜春色av| 欧美激情精品久久久久久免费| 亚洲视频一二三区| 三级影片在线看| 亚洲一区在线观看免费观看电影高清| 国产一级特黄a高潮片| 婷婷夜色潮精品综合在线| 黄色大片网站在线观看| 91久久香蕉国产日韩欧美9色| 波多野结衣日韩| 777午夜精品视频在线播放| 国内精品久久久久久久久久 | 美女黄色一级视频| 亚洲综合国产| 男人天堂成人在线| 久久精品理论片| 中文字幕在线视频一区二区| 成人免费毛片片v| 好吊日免费视频| 国产精品黄色在线观看| 久久久久成人片免费观看蜜芽| 午夜精品在线视频一区| 午夜精品一区二| 欧美精品三级在线观看| 丁香六月天婷婷| 国产香蕉97碰碰久久人人| а√天堂官网中文在线| 97在线精品国自产拍中文| 欧美电影免费观看高清完整| 成人久久一区二区| 久久男人av| 亚洲午夜在线观看| 亚洲作爱视频| 粉色视频免费看| av网站一区二区三区| 成人免费视频入口| 亚洲成在人线免费| 亚洲天堂狠狠干| 亚洲成人在线视频播放| 成人在线免费视频| 97免费视频在线| 成人精品视频在线观看| 久久久久久国产精品免费免费| 欧美电影三区| av天堂永久资源网| 国产精品一区在线观看乱码| 日韩中文字幕有码| 香蕉影视欧美成人| av网站免费大全| 一本久久综合亚洲鲁鲁| 欧美13videosex性极品| 5566中文字幕一区二区| 操欧美老女人| 播放灌醉水嫩大学生国内精品| 国产另类ts人妖一区二区| 日韩一级视频在线观看| 亚洲韩国一区二区三区| av免费观看在线| 日韩在线观看成人| 秋霞国产精品| 欧美极品jizzhd欧美| 精品成人在线| 1314成人网| 亚洲欧美日韩中文字幕一区二区三区 | 九九久久成人| 免费看毛片的网址| 国产精品亚洲成人| 五月天激情丁香| 欧美久久久影院| 午夜视频在线看| 国产精品美女午夜av| 久久最新网址| 国产精品第12页| 97se亚洲国产综合自在线| 精品一区免费观看| 日韩欧美视频在线| 国产精品va在线观看视色 | 日韩在线一级片| 成人精品高清在线| 精品一级少妇久久久久久久| 日韩欧美视频在线| 手机在线免费av| 99久久精品免费看国产一区二区三区| 亚洲欧美色图| 在线播放黄色av| 亚洲欧美日韩精品久久久久| 国产又粗又长视频| 精品国产一区二区三区在线观看 | 日韩人妻无码一区二区三区| 香蕉影视欧美成人| 色综合久久网女同蕾丝边| 欧美一区深夜视频| 久久成人高清| 亚洲免费一级视频| 国产精品不卡视频| 99草在线视频| 久久久久久国产精品美女| av男人一区| 哪个网站能看毛片| 欧美激情综合五月色丁香 | 精品久久久久99| 丰满大乳少妇在线观看网站| 国产精品手机视频| 久久www成人_看片免费不卡| 亚洲精品国产熟女久久久| 欧美日韩黄色影视| h片在线播放| 国产欧美一区二区三区另类精品 | 欧美亚洲一级片| 欧美禁忌电影| 男女视频在线观看网站| 亚洲一区二区综合| 日韩av视屏| 国产一区二区丝袜| 在线精品福利| 日本乱子伦xxxx| 91精品欧美福利在线观看| 日本大片在线播放| 免费久久一级欧美特大黄| 美女视频免费一区| 国产成人精品av久久| 亚洲人成电影在线播放| 亚洲综合视频| 国产毛片视频网站| 中国av一区二区三区| 亚洲av无码专区在线| 国产成人91久久精品| 欧美1区免费| 极品粉嫩小仙女高潮喷水久久| 欧亚洲嫩模精品一区三区| 日韩123区| 日韩福利一区二区三区| 国产精品一二二区| 夜夜躁日日躁狠狠久久av| 久99久在线视频| 精品国产aⅴ| 麻豆av免费看| 欧美系列在线观看| а√天堂8资源中文在线| 亚洲电影免费| 91免费国产在线| av高清一区二区|