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

@Configuration注解天天用,你真的了解它嗎?

開發 前端
通過CGLIB創建代理,這些不是我們關心的,我們主要關心的是它是如何攔截配置方法的。所以這里我們主要關注的上面createClass方法中設置的CALLBACKS。在這個數組中通過名稱也就清楚核心攔截器是BeanMethodInterceptor。

環境:Spring5.3.23

1. 簡介

@Configuration 是一個類級注解,表示一個對象是 Bean 定義的來源。@Configuration 類通過 @Bean 注解的方法聲明 Bean。對 @Configuration 類上 @Bean 方法的調用也可用于定義Bean之間的依賴關系。

使用@Configuration注解的主要作用是替代Spring的applicationContext.xml文件,使得配置更加靈活和方便。當某個類標注了@Configuration注解時,表示這個類是Spring的一個配置類,能夠自動注冊到IOC容器并進行實例化。

2. 應用示例

static class Person {}
@Configuration
static class AppConfig {
  @Bean
  public Person person() {
    return new Person() ;
  }
}

AppConfig是一個配置類,在該類中通過@Bean標注方法注冊Bean對象。示例非常的簡單,但是不是一定的用@Configuration呢?換成@Component試試

@Component
static class AppConfig {
  @Bean
  public Person person() {
    return new Person() ;
  }
}
// 測試是否能夠獲取Person bean對象
try (GenericApplicationContext context = new GenericApplicationContext()) {
  context.registerBean(AppConfig.class) ;
  // ...
  System.out.println(context.getBean(Person.class)) ;
}

上面的示例能夠正確的獲取Person bean對象,那這里的@Component與@Configuration有什么區別呢?接著看下面代碼示例:

@Configuration
static class AppConfig {
  @Bean
  public Person person() {
    return new Person() ;
  }
  @Bean
  public Date d1() {
    System.out.println(person()) ;
    return new Date() ;
  }
  @Bean
  public Date d2() {
    System.out.println(person()) ;
    return new Date() ;
  }
}

在上面的示例中,隨意定義了2個Date類型的Bean,這2個方法中都調用person()方法,執行結果:

com.pack.m.b.CMain$Person@55183b20
com.pack.m.b.CMain$Person@55183b20

控制臺輸出的一模一樣,是不是感覺好奇怪,調用2次應該是不同的Person對象才對是吧?先繼續往下看,吧@Configuration換成@Component(就是換注解,其它都沒有變化,代碼就不貼了),執行結果:

com.pack.m.b.CMain$Person@78aab498
com.pack.m.b.CMain$Person@5dd6264

這次輸出是2個不同的Person對象了,此時你是不是覺得這次符合你的預期?如果你這么認為那么就出大事了。

在 Spring 中,實例化的 Bean 默認具有單例作用域,但是如上執行情況,明顯成了多例,我們就應該確保容器中任何時候使用的都是同一個實例。如果這里是DataSource那問題就更加嚴重了。

所以,這里雖然可以使用@Component定義配置類,但是強烈不建議你這樣使用,既然是配置類你就的按規矩來使用@Configuration注解。那@Configuration是如何保證在內部方法調用返回的對象是同一個呢?

先給出答案:那是因為使用@Configuration注解的類被生成了代理類(通過CGLIB)。接下來我們來看看它的原理。

3. 實現原理

Spring提供了一個ConfigurationClassPostProcessor處理器來注冊@Configuration注解。該處理器是一個BeanFactoryPostProcessor。我們就從這里看起

3.1 給@Configuration注解的類打標記

這里所說的大標記其實就確定你當前這個配置類要不要生成代理,而這個標記模式是生成代理

// 這里的proxyBeanMethods值為true,意為會為當前的配置類生成代理
@Configuration(proxyBeanMethods = true)
static class AppConfig {}

處理配置類

public class ConfigurationClassPostProcessor implements BeanDefinitionRegistryPostProcessor {
  public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) {
    // ...
    // 處理配置類bean
    processConfigBeanDefinitions(registry);
  }
  public void processConfigBeanDefinitions(BeanDefinitionRegistry registry) {
    // 獲取所有的bean
    String[] candidateNames = registry.getBeanDefinitionNames();
    // 遍歷
    for (String beanName : candidateNames) {
      BeanDefinition beanDef = registry.getBeanDefinition(beanName) ;
      // 判斷當前的bean是否有ConfigurationClassUtils.CONFIGURATION_CLASS_ATTRIBUTE屬性
      // 默認都是沒有的,所以這里進入到else if 中
      if (beanDef.getAttribute(ConfigurationClassUtils.CONFIGURATION_CLASS_ATTRIBUTE) != null) {
        // 打印日志
      } 
      // 在checkConfigurationClassCandidate會處理配置類的相應屬性
      else if (ConfigurationClassUtils.checkConfigurationClassCandidate(beanDef, this.metadataReaderFactory)) {
        configCandidates.add(new BeanDefinitionHolder(beanDef, beanName));
      }
    }
    // ...
  }
}

ConfigurationClassUtils

abstract class ConfigurationClassUtils {
  public static final String CONFIGURATION_CLASS_FULL = "full";
  public static final String CONFIGURATION_CLASS_LITE = "lite";
  public static boolean checkConfigurationClassCandidate(
      BeanDefinition beanDef, MetadataReaderFactory metadataReaderFactory) {
    // 省去無關代碼
    // 獲取到當前配置類的所有注解信息
    AnnotationMetadata metadata = AnnotationMetadata.introspect(beanClass) ;
    // 獲取注解類@Configuration信息
    Map<String, Object> config = metadata.getAnnotationAttributes(Configuration.class.getName());
    if (config != null && !Boolean.FALSE.equals(config.get("proxyBeanMethods"))) {
      // 如果@Configuration中的proxyBeanMethods屬性為true,那么就將當前配置類對應的BeanDefinition設置屬性
      // 標記為true,其實這里的目的就是要不要創建代理,如果為true創建代理
      beanDef.setAttribute(CONFIGURATION_CLASS_ATTRIBUTE, CONFIGURATION_CLASS_FULL);
    }
    // 不創建代理
    else if (config != null || isConfigurationCandidate(metadata)) {
      beanDef.setAttribute(CONFIGURATION_CLASS_ATTRIBUTE, CONFIGURATION_CLASS_LITE);
    }
    else {
      return false;
    }
  }
}

上面對配置類進行了標記要不要創建代理,下面就是創建代理了。

3.2 為配置類生成代理

上面對配置類要不要創建代理是通過BeanDefinition 設置屬性的方式來標記,標記完后會在postProcessBeanFactory中創建代理。

public class ConfigurationClassPostProcessor implements BeanDefinitionRegistryPostProcessor {
  public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
    // ...
    // 增強配置類,創建代理
    enhanceConfigurationClasses(beanFactory);
  }
  public void enhanceConfigurationClasses(ConfigurableListableBeanFactory beanFactory) {
    Map<String, AbstractBeanDefinition> configBeanDefs = new LinkedHashMap<>();
    for (String beanName : beanFactory.getBeanDefinitionNames()) {
      BeanDefinition beanDef = beanFactory.getBeanDefinition(beanName);
      // 獲取設置的標記屬性,要么是full,要么是lite
      Object configClassAttr = beanDef.getAttribute(ConfigurationClassUtils.CONFIGURATION_CLASS_ATTRIBUTE);
      if (ConfigurationClassUtils.CONFIGURATION_CLASS_FULL.equals(configClassAttr)) {
        // 先保存到集合匯總
        configBeanDefs.put(beanName, (AbstractBeanDefinition) beanDef);
      }
    }
    ConfigurationClassEnhancer enhancer = new ConfigurationClassEnhancer();
    for (Map.Entry<String, AbstractBeanDefinition> entry : configBeanDefs.entrySet()) {
      AbstractBeanDefinition beanDef = entry.getValue();
      // 確定配置類的class
      Class<?> configClass = beanDef.getBeanClass();
      // 創建代理
      Class<?> enhancedClass = enhancer.enhance(configClass, this.beanClassLoader);
      if (configClass != enhancedClass) {
        beanDef.setBeanClass(enhancedClass);
      }
    }
  }
}

接下來是核心通過ConfigurationClassEnhancer#enhance創建目標配置類的代理對象。

class ConfigurationClassEnhancer {
  private static final Callback[] CALLBACKS = new Callback[] {
      new BeanMethodInterceptor(),
      new BeanFactoryAwareMethodInterceptor(),
      NoOp.INSTANCE
  }
  public Class<?> enhance(Class<?> configClass, @Nullable ClassLoader classLoader) {
    Class<?> enhancedClass = createClass(newEnhancer(configClass, classLoader));
    return enhancedClass;
  }
  private Enhancer newEnhancer(Class<?> configSuperClass, @Nullable ClassLoader classLoader) {
    Enhancer enhancer = new Enhancer();
    enhancer.setSuperclass(configSuperClass);
    // 設置生成的子類要實現的接口,該接口實現了BeanFactoryAware,
    // 所以容器在實例化初始化該代理對象的時候會自動注入當前容器的BeanFactory對象。
    enhancer.setInterfaces(new Class<?>[] {EnhancedConfiguration.class});
    enhancer.setUseFactory(false);
    enhancer.setNamingPolicy(SpringNamingPolicy.INSTANCE);
    // 這里有個作用就是為當前的代理bean添加BeanFactory類型的字段。
    enhancer.setStrategy(new BeanFactoryAwareGeneratorStrategy(classLoader));
    enhancer.setCallbackFilter(CALLBACK_FILTER);
    enhancer.setCallbackTypes(CALLBACK_FILTER.getCallbackTypes());
    return enhancer;
  } 
  private Class<?> createClass(Enhancer enhancer) {
    Class<?> subclass = enhancer.createClass();
    Enhancer.registerStaticCallbacks(subclass, CALLBACKS);
    return subclass;
  }
}

上面的代碼就是通過CGLIB創建代理,這些不是我們關心的,我們主要關心的是它是如何攔截配置方法的。所以這里我們主要關注的上面createClass方法中設置的CALLBACKS。在這個數組中通過名稱也就清楚核心攔截器是BeanMethodInterceptor。

private static class BeanMethodInterceptor implements MethodInterceptor {
  public Object intercept(Object enhancedConfigInstance, Method beanMethod, Object[] beanMethodArgs,
          MethodProxy cglibMethodProxy) throws Throwable {
    ConfigurableBeanFactory beanFactory = getBeanFactory(enhancedConfigInstance);
    // 獲取當前@Bean注解的方法名(也就是對應的BeanName)
    String beanName = BeanAnnotationHelper.determineBeanNameFor(beanMethod);
    // ...
    // 從容器中查找對應的bean(也就是你調用的那個方法創建的bean對象)
    return resolveBeanReference(beanMethod, beanMethodArgs, beanFactory, beanName);
  }
  private Object resolveBeanReference(Method beanMethod, Object[] beanMethodArgs,
        ConfigurableBeanFactory beanFactory, String beanName) {
    // 獲取bean實例
    Object beanInstance = (useArgs ? beanFactory.getBean(beanName, beanMethodArgs) :
            beanFactory.getBean(beanName));
    // ...
    return beanInstance;
  }
}

以上就是@Configuration注解創建代理及方法調用時的執行原理。

你學到了嗎?

責任編輯:武曉燕 來源: Spring全家桶實戰案例源碼
相關推薦

2020-11-20 07:58:04

Java

2023-06-08 11:57:15

Matter協議家庭智能

2017-12-07 15:00:00

筆記本OLED屏幕

2024-08-22 08:17:55

C#工具循環

2023-05-29 08:11:42

@Value注解Bean

2014-04-17 16:42:03

DevOps

2022-07-26 00:00:22

HTAP系統數據庫

2019-09-02 08:39:02

路由器RAM內存

2021-11-09 09:48:13

Logging python模塊

2021-01-15 07:44:21

SQL注入攻擊黑客

2023-03-16 10:49:55

2014-11-28 10:31:07

Hybrid APP

2020-02-27 10:49:26

HTTPS網絡協議TCP

2019-09-16 08:40:42

2012-05-31 09:56:54

云安全

2022-12-12 08:46:11

2022-03-14 07:53:27

ELTETL大數據

2015-07-31 10:35:18

實時計算

2019-11-06 09:52:01

JavaScript單線程非阻塞

2017-10-18 22:01:12

點贊
收藏

51CTO技術棧公眾號

国产精品高清在线| 日韩精品在线视频观看| 国产一二三四区在线观看| 国产特黄一级片| 亚洲日本国产| 一区二区三区视频观看| 亚洲日本黄色片| 黄色在线观看www| 国产人成亚洲第一网站在线播放| 91在线观看免费| 亚洲天堂视频网站| 国产精品99在线观看| 亚洲大胆人体在线| 潘金莲激情呻吟欲求不满视频| 欧美家庭影院| 国产精品另类一区| 九九热久久66| 精品人妻一区二区三区蜜桃| 免费日韩av| 久久91精品国产| 手机av在线不卡| 免费观看成人www动漫视频| 欧美日韩视频在线观看一区二区三区 | 无码人妻精品一区二区蜜桃网站| 免费播放片a高清在线观看| 国产精品中文有码| 国产精品美女www爽爽爽视频| 精品一区在线视频| 亚洲激情中文| www.欧美免费| 九一在线免费观看| 亚洲瘦老头同性70tv| 日韩欧美综合在线| 99热一区二区| 国产极品久久久久久久久波多结野| 亚洲成人你懂的| 最近免费观看高清韩国日本大全| 成人三级黄色免费网站| 91一区二区三区在线观看| 91丨九色丨国产| 97人妻精品一区二区三区软件 | 亚洲精品乱码久久久久久日本蜜臀| 日本婷婷久久久久久久久一区二区 | 久久中文免费视频| 色综合久久网| 中文字幕精品在线视频| 国产精品815.cc红桃| 秋霞影视一区二区三区| 亚洲国产高清自拍| 中文在线观看免费视频| 国产精品15p| 欧美mv日韩mv亚洲| 国产伦精品一区二区三区88av| 精品国产一区二区三区性色av| 欧美日本在线看| 亚洲激情在线看| 国产精品亚洲四区在线观看| 911精品国产一区二区在线| 红桃视频 国产| 国语精品视频| 精品欧美一区二区三区精品久久| 尤物网站在线看| 亚洲高清在线一区| 精品久久久久久久一区二区蜜臀| 一区二区三区人妻| 凹凸av导航大全精品| 欧美一区二区成人6969| 亚洲欧洲日韩综合| y111111国产精品久久久| 亚洲激情免费观看| 91网站免费视频| 日韩精品午夜| 久久福利视频导航| 国产福利久久久| 免费一区视频| 国产欧美一区二区三区久久| 国产福利第一页| 波多野结衣在线aⅴ中文字幕不卡| 狠狠色综合欧美激情| 免费看男男www网站入口在线| 日本一区二区三区久久久久久久久不 | 91久久精品网| 日韩欧美亚洲另类| 精品国产一区二区三区成人影院 | 亚洲免费网站| 国产精品无码专区在线观看| 国产精品久久久久久久久久久久久久久久久久 | 国产盗摄在线观看| 性感美女久久精品| 免费一级特黄录像| 国产精品777777在线播放| 欧美xxx久久| a天堂中文字幕| 欧美日韩18| 国产91色在线|免| 精品国产乱码一区二区三| av亚洲产国偷v产偷v自拍| 日韩一级二级三级精品视频| 在线观看一区二区三区视频| 一本久久青青| 欧美成人在线网站| 国产嫩bbwbbw高潮| 国产精品一区二区x88av| 欧美日韩在线不卡一区| av在线免费播放| 在线观看亚洲a| 亚洲欧美高清在线| 久久国产成人精品| 欧美在线视频在线播放完整版免费观看| 中文字幕在线观看第二页| youjizz久久| 日韩视频在线观看视频| 日本不卡一二三| 欧美精品一区二区在线观看| 99热99这里只有精品| 国产亚洲欧洲| 成人av免费在线看| 欧美私人网站| 在线观看国产91| 影音先锋人妻啪啪av资源网站| 久久精品青草| 国产精品日韩在线| 飘雪影院手机免费高清版在线观看 | 日韩精品久久一区二区三区| 欧美人与性动交α欧美精品济南到 | 卡一精品卡二卡三网站乱码| 精品国产一区av| 国产成人a v| 久久你懂得1024| 国产成人a亚洲精v品无码| 视频一区中文字幕精品| 久久精品这里热有精品| 中文字幕一级片| 欧美国产日本韩| 国产精品无码专区av在线播放| aaa国产精品视频| 九九热精品在线| 国产日韩欧美一区二区东京热| 国产精品乱码久久久久久| 男女爽爽爽视频| 在线日韩网站| 日本一本a高清免费不卡| 天堂中文在线8| 亚洲综合无码一区二区| 自拍视频第一页| 中国成人一区| 18成人免费观看网站下载| 久草免费在线| 日韩网站在线看片你懂的| 亚洲国产美女视频| 国产精品99久久久久| 男女裸体影院高潮| 亚洲午夜免费| 久久久久久久久久久91| 欧美熟妇交换久久久久久分类| 亚洲综合自拍偷拍| jizz日本免费| 日韩国产在线一| 亚洲一区在线免费| www一区二区三区| 不卡中文字幕av| 亚洲欧美黄色片| 偷拍日韩校园综合在线| 一级性生活毛片| 日韩精品高清不卡| 中文字幕在线亚洲三区| 日韩在线网址| 欧美一级视频一区二区| 国产美女视频一区二区三区| 欧美日韩亚洲综合一区 | 大乳在线免费观看| 欧美日韩高清不卡| 国产亚洲精品久久久久久无几年桃 | 91久久精品www人人做人人爽| 毛片网站在线看| 国产视频精品一区二区三区| 艳妇乳肉豪妇荡乳av无码福利 | 国产亚洲欧洲黄色| 亚洲系列第一页| 一区二区三区不卡在线观看 | av中文字幕第一页| 岛国av一区二区在线在线观看| 国产精品国产三级国产专业不| 激情五月激情综合网| 久久艹国产精品| 免费久久久久久久久| 国产美女直播视频一区| 欧美黑人xx片| 伊是香蕉大人久久| 午夜久久久久久久久久| 色婷婷激情久久| 国产精品 欧美激情| 91麻豆成人久久精品二区三区| 91精品无人成人www| 国产综合色产| 亚洲国产欧洲综合997久久 | 狠狠色综合日日| 欧美 日韩 亚洲 一区| 99久久婷婷| 久久青青草原| 2021年精品国产福利在线| 国产精品精品视频| 成年人在线网站| 综合国产在线视频| 四虎精品成人影院观看地址| 制服丝袜亚洲色图| 欧产日产国产69| 亚洲高清不卡在线| 中文字幕求饶的少妇| 91视频.com| 4438x全国最大成人| 久久精品国产999大香线蕉| 亚洲熟妇av一区二区三区漫画| 久久久9色精品国产一区二区三区| 久久国产精品亚洲va麻豆| 久久av偷拍| 91精品国产自产在线老师啪| 345成人影院| 97精品国产97久久久久久免费| 麻豆传媒在线观看| 国产午夜精品视频| 免费成人av电影| 日韩电视剧在线观看免费网站 | 国产毛片精品久久| 国产精品r级在线| 九九色在线视频| 久久成人18免费网站| av电影在线观看| 亚洲偷熟乱区亚洲香蕉av| 天天干天天干天天干| 日韩免费一区二区| av资源免费看| 欧美日韩dvd在线观看| 在线免费观看av片| 欧美吞精做爰啪啪高潮| 中文字幕免费高清网站| 欧美日韩中国免费专区在线看| 香蕉视频一区二区| 亚洲国产精品久久人人爱| 欧美日韩精品亚洲精品| 一区二区三区中文字幕在线观看| 娇小11一12╳yⅹ╳毛片| 国产精品丝袜久久久久久app| 在线免费观看麻豆| 久久蜜桃av一区精品变态类天堂| 麻豆国产精品一区| 2014亚洲片线观看视频免费| 亚洲欧美视频在线播放| 久久综合资源网| 男人舔女人下部高潮全视频| 日本一区二区三区国色天香 | 欧美日韩国产综合网| 无码人妻精品一区二区蜜桃百度| 综合久久婷婷| 成年人网站国产| 亚洲大胆视频| 亚洲熟妇av一区二区三区| 久久午夜激情| 污网站免费在线| 国产一区在线视频| 91porn在线| 91一区在线观看| 国产一区二区三区精品在线| 中文一区二区在线观看| 免费成人深夜夜行网站| 一区二区三区四区av| 日本熟女一区二区| 色噜噜狠狠成人网p站| 美女黄页在线观看| 日韩一区二区三区电影在线观看| 亚洲爱情岛论坛永久| 亚洲精品电影在线观看| 国产精品一区二区婷婷| 久久天天躁狠狠躁老女人| 黄色在线看片| 日韩av男人的天堂| 婷婷久久免费视频| 成人自拍视频网站| 久操成人av| 在线视频一二三区| 国产亚洲毛片在线| 亚洲精品成人在线播放| 成人v精品蜜桃久久一区| 手机免费看av| 亚洲精品视频在线看| 老熟妇仑乱一区二区av| 欧美一区二区在线免费观看| 亚洲av成人精品一区二区三区在线播放| 亚洲女人天堂视频| av网站在线免费看推荐| 欧美诱惑福利视频| 午夜精品久久久久久毛片| 国产精品一区二区不卡视频| 日本电影一区二区| 日韩视频免费播放| 久久福利视频一区二区| 国产一级二级视频| 亚洲日本va午夜在线影院| 91视频免费网址| 欧美一区三区四区| a视频网址在线观看| 国外色69视频在线观看| 伊人久久综合网另类网站| 欧美日本国产精品| 亚洲特级毛片| 伊人国产精品视频| 国产亚洲自拍一区| 男人的天堂一区二区| 欧美一区二视频| 日本中文字幕视频在线| 欧美影院在线播放| 久久综合社区| 免费人成自慰网站| 九九久久精品视频| 国产一级久久久久毛片精品| 午夜精品一区二区三区三上悠亚| 97人妻精品一区二区三区视频| 夜夜嗨av一区二区三区四区| 极品在线视频| 国产精品视频一区二区三区经| 久久神马影院| 国模吧无码一区二区三区| 高清成人免费视频| 欧洲第一无人区观看| 欧美日韩精品综合在线| 免费成人av电影| 日本一区二区不卡| 九九在线高清精品视频| 69堂免费视频| 91免费看视频| 日韩成人高清视频| 亚洲电影中文字幕| av老司机免费在线| 99视频日韩| 激情久久一区| 蜜臀av粉嫩av懂色av| 亚洲一区二区三区四区中文字幕 | 亚洲精品美女在线| 嗯啊主人调教在线播放视频| 国产精品日韩一区二区免费视频| 欧美精品99| 国产免费无码一区二区| 亚洲国产三级在线| 天天操天天干天天操| 国内自拍欧美激情| 香蕉久久夜色精品国产更新时间| 日日碰狠狠添天天爽超碰97| av在线不卡观看免费观看| 日韩成人av毛片| 亚洲精品自产拍| 欧美日韩五码| 一本一本a久久| 免费在线成人网| 国产极品美女在线| 欧美一区二区不卡视频| 久久av色综合| 久久精品人人做人人爽电影| 亚久久调教视频| 91麻豆制片厂| 日韩美女一区二区三区| 国产福利电影在线播放| 免费看成人片| 乱一区二区av| 久草视频免费在线| 日韩成人在线网站| 激情中国色综合| 91网站在线观看免费| 99久久免费视频.com| 91丨九色丨海角社区| 久久精品成人欧美大片| 97视频一区| 男人亚洲天堂网| 亚洲日韩欧美一区二区在线| 亚洲精品久久久久avwww潮水 | 男女啊啊啊视频| 中文字幕欧美精品在线| 蜜桃精品一区二区三区| 国产精品无码一区二区在线| 国产日韩精品一区| 99久久国产免费| 日本成人激情视频| 综合激情一区| 男人舔女人下部高潮全视频| 56国语精品自产拍在线观看| 大黄网站在线观看| 色涩成人影视在线播放| 日韩欧美三级| 又色又爽又黄视频| 欧美日韩精品中文字幕| 免费日本一区二区三区视频| 国产高清在线一区| 久久精品国产亚洲aⅴ| 黄色激情视频在线观看| 中文字幕亚洲综合久久| 精品国产午夜肉伦伦影院| www.国产视频.com| 精品久久久久久久中文字幕 | 亚洲精品视频一区二区| 牛牛澡牛牛爽一区二区| 亚洲xxxx视频|