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

Spring 中的父子容器是咋回事?

開發 前端
Spring 容器中的父子容器現在大家應該明白了吧?可以給非 ListableBeanFactory 容器設置父容器,父容器不可以訪問子容器的 Bean,但是子容器可以訪問父容器的 Bean。

相信有小伙伴也聽說過,在 SSM 項目中,Spring 容器是父容器,SpringMVC 是子容器,子容器可以訪問父容器的 Bean,但是父容器不能訪問子容器的 Bean。

更近一步,有小伙伴可能也了解過,不用父子容器,單純就用一個 SpringMVC 容器似乎也可以,項目也能運行。

那么現在問題來了:既然單純一個 SpringMVC 容器就能使項目跑起來,那我們為什么還要用父子容器?父子容器的優勢是什么?

帶著這個問題,今天松哥來和小伙伴們聊一聊父子容器。

1. 父子容器

首先,其實父子這種設計很常見,松哥記得在之前的 Spring Security 的系列文章中,Spring Security 中的 AuthenticationManager 其實也是類似的設計,估計那里就是借鑒了 Spring 中的父子容器設計。

當使用了父子容器之后,如果去父容器中查找 Bean,那么就單純的在父容器中查找 Bean;如果是去子容器中查找 Bean,那么就會先在子容器中查找,找到了就返回,沒找到則繼續去父容器中查找,直到找到為止(把父容器都找完了還是沒有的話,那就只能拋異常出來了)。

2. 為什么需要父子容器

2.1 問題呈現

為什么需要父子容器?老老實實使用一個容器不行嗎?

既然 Spring 容器中有父子容器,那么這個玩意就必然有其使用場景。

松哥舉一個簡單的例子。

假設我有一個多模塊項目,其中有商家模塊和客戶模塊,商家模塊和客戶模塊中都有角色管理 RoleService,項目結構如下圖:

├── admin
│   ├── pom.xml
│   └── src
│       ├── main
│       │   ├── java
│       │   └── resources
├── consumer
│   ├── pom.xml
│   └── src
│       ├── main
│       │   ├── java
│       │   │   └── org
│       │   │       └── javaboy
│       │   │           └── consumer
│       │   │               └── RoleService.java
│       │   └── resources
│       │       └── consumer_beans.xml
├── merchant
│   ├── pom.xml
│   └── src
│       ├── main
│       │   ├── java
│       │   │   └── org
│       │   │       └── javaboy
│       │   │           └── merchant
│       │   │               └── RoleService.java
│       │   └── resources
│       │       └── merchant_beans.xml
└── pom.xml

現在 consumer 和 merchant 中都有一個 RoleService 類,然后在各自的配置文件中,都將該類注冊到 Spring 容器中。

org.javaboy.consumer.RoleService:

public class RoleService {
    public String hello() {
        return "hello consumer";
    }
}

org.javaboy.merchant.RoleService:

public class RoleService {
    public String hello() {
        return "hello merchant";
    }
}

consumer_beans.xml 如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean class="org.javaboy.consumer.RoleService" id="roleService"/>
</beans>

merchant_beans.xml 如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean class="org.javaboy.merchant.RoleService" id="roleService"/>
</beans>

大家注意,這兩個 Bean 同名。

現在,在 admin 模塊中,同時依賴 consumer 和 merchant,同時加載這兩個配置文件,那么能不能同時向 Spring 容器中注冊兩個來自不同模塊的同名 Bean 呢?

代碼如下:

ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext();
ctx.setConfigLocations("consumer_beans.xml", "merchant_beans.xml");
ctx.refresh();
org.javaboy.merchant.RoleService rs1 = ctx.getBean(org.javaboy.merchant.RoleService.class);
org.javaboy.consumer.RoleService rs2 = ctx.getBean(org.javaboy.consumer.RoleService.class);

這個執行之后會拋出如下問題:

圖片

小伙伴們看到,這個是找不到 org.javaboy.consumer.RoleService 服務,但是另外一個 RoleService 其實是找到了,因為默認情況下后面定義的同名 Bean 把前面的覆蓋了,所以有一個 Bean 就找不到了。

如果不允許 Bean 的覆蓋,那么可以進行如下配置:

ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext();
ctx.setConfigLocations("consumer_beans.xml", "merchant_beans.xml");
ctx.setAllowBeanDefinitionOverriding(false);
ctx.refresh();

此時一啟動就直接報錯了:

圖片圖片

意思也說的比較明確了,Bean 的定義沖突了,所以定義失敗。

那么有沒有辦法能夠優雅的解決上面這個問題呢?答案就是父子容器!

2.2 父子容器

對于上面的問題,我們可以將 consumer 和 merchant 配置成父子關系或者兄弟關系,就能很好的解決這個問題了。

2.2.1 兄弟關系

先來看兄弟關系,代碼如下:

ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext();
ClassPathXmlApplicationContext child1 = new ClassPathXmlApplicationContext("consumer_beans.xml");
ClassPathXmlApplicationContext child2 = new ClassPathXmlApplicationContext("merchant_beans.xml");
child1.setParent(ctx);
child2.setParent(ctx);
ctx.setAllowBeanDefinitionOverriding(false);
ctx.refresh();
org.javaboy.consumer.RoleService rs1 = child1.getBean(org.javaboy.consumer.RoleService.class);
org.javaboy.merchant.RoleService rs2 = child2.getBean(org.javaboy.merchant.RoleService.class);
System.out.println("rs1.hello() = " + rs1.hello());
System.out.println("rs2.hello() = " + rs2.hello());

小伙伴們看一下,這種針對 consumer 和 merchant 分別創建了容器,這種容器關系就是兄弟容器,這兩個兄弟有一個共同的 parent 就是 ctx,現在可以在各個容器中獲取到自己的 Bean 了。

需要注意的是,上面這種結構中,子容器可以獲取到 parent 的 Bean,但是無法獲取到兄弟容器的 Bean,即如果 consumer 中引用了 merchant 中的 Bean,那么上面這個配置就有問題了。

2.2.2 父子關系

現在假設用 consumer 做 parent 容器,merchant 做 child 容器,那么配置如下:

ClassPathXmlApplicationContext parent = new ClassPathXmlApplicationContext("consumer_beans.xml");
ClassPathXmlApplicationContext child = new ClassPathXmlApplicationContext("merchant_beans.xml");
child.setParent(parent);
child.refresh();
org.javaboy.consumer.RoleService rs1 = parent.getBean(org.javaboy.consumer.RoleService.class);
org.javaboy.merchant.RoleService rs2 = child.getBean(org.javaboy.merchant.RoleService.class);
org.javaboy.consumer.RoleService rs3 = child.getBean(org.javaboy.consumer.RoleService.class);
System.out.println("rs1.hello() = " + rs1.hello());
System.out.println("rs2.hello() = " + rs2.hello());
System.out.println("rs3.hello() = " + rs3.hello());

首先創建兩個容器,分別是 parent 和 child,然后為 child 容器設置 parent,設置完成后記得要刷新 child 容器。

現在我們就可以從 parent 容器中去獲取 parent 容器中原本就存在的 Bean,也可以從 child 容器中去獲取 child 容器原本的 Bean 或者是 parent 的 Bean 都可以。

這就是父子容器。

父容器和子容器本質上是相互隔離的兩個不同的容器,所以允許同名的 Bean 存在。當子容器調用 getBean 方法去獲取一個 Bean 的時候,如果當前容器沒找到,就會去父容器查找,一直往上找,找到為止。

核心就是 BeanFactory,這個松哥之前文章已經和小伙伴們介紹過了(BeanFactoryPostProcessor 和 BeanPostProcessor 有什么區別?),BeanFactory 有一個子類 HierarchicalBeanFactory,看名字就是帶有層級關系的 BeanFactory:

public interface HierarchicalBeanFactory extends BeanFactory {

 /**
  * Return the parent bean factory, or {@code null} if there is none.
  */
 @Nullable
 BeanFactory getParentBeanFactory();

 /**
  * Return whether the local bean factory contains a bean of the given name,
  * ignoring beans defined in ancestor contexts.
  * <p>This is an alternative to {@code containsBean}, ignoring a bean
  * of the given name from an ancestor bean factory.
  * @param name the name of the bean to query
  * @return whether a bean with the given name is defined in the local factory
  * @see BeanFactory#containsBean
  */
 boolean containsLocalBean(String name);

}

只要是 HierarchicalBeanFactory 的子類就能配置父子關系。父子關系圖如下:

圖片圖片

2.3 特殊情況

需要注意的是,并不是所有的獲取 Bean 的方法都支持父子關系查找,有的方法只能在當前容器中查找,并不會去父容器中查找:

ClassPathXmlApplicationContext parent = new ClassPathXmlApplicationContext("consumer_beans.xml");
ClassPathXmlApplicationContext child = new ClassPathXmlApplicationContext("merchant_beans.xml");
child.setParent(parent);
child.refresh();
String[] names1 = child.getBeanNamesForType(org.javaboy.merchant.RoleService.class);
String[] names2 = child.getBeanNamesForType(org.javaboy.consumer.RoleService.class);
System.out.println("names1 = " + Arrays.toString(names1));
System.out.println("names2 = " + Arrays.toString(names2));

如上,根據類型去查找 Bean 名稱的時候,我們所用的是 getBeanNamesForType 方法,這個方法是由 ListableBeanFactory 接口提供的,而該接口和 HierarchicalBeanFactory 接口并無繼承關系,所以 getBeanNamesForType 方法并不支持去父容器中查找 Bean,它只在當前容器中查找 Bean。

但是!如果你確實有需求,希望能夠根據類型查找 Bean 名稱,并且還能夠自動去父容器中查找,那么可以使用 Spring 給我們提供的工具類,如下:

ClassPathXmlApplicationContext parent = new ClassPathXmlApplicationContext("consumer_beans.xml");
ClassPathXmlApplicationContext child = new ClassPathXmlApplicationContext();
child.setParent(parent);
child.refresh();
String[] names = BeanFactoryUtils.beanNamesForTypeIncludingAncestors(child, org.javaboy.consumer.RoleService.class);
for (String name : names) {
    System.out.println("name = " + name);
}

不過這個查找,對于父子容器中同名的 Bean 是查找不出來名字的。

2.4 Spring 和 SpringMVC

上面的內容理解了,Spring 和 SpringMVC 之間的關系就好理解了,Spring 是父容器,SpringMVC 則是子容器。

在 SpringMVC 中,初始化 DispatcherServlet 的時候,會創建出 SpringMVC 容器,并且為 SpringMVC 容器設置 parent,相關代碼如下:

FrameworkServlet#initWebApplicationContext:

protected WebApplicationContext initWebApplicationContext() {
 WebApplicationContext rootContext =
   WebApplicationContextUtils.getWebApplicationContext(getServletContext());
 WebApplicationContext wac = null;
 if (this.webApplicationContext != null) {
  // A context instance was injected at construction time -> use it
  wac = this.webApplicationContext;
  if (wac instanceof ConfigurableWebApplicationContext cwac && !cwac.isActive()) {
   // The context has not yet been refreshed -> provide services such as
   // setting the parent context, setting the application context id, etc
   if (cwac.getParent() == null) {
    // The context instance was injected without an explicit parent -> set
    // the root application context (if any; may be null) as the parent
    cwac.setParent(rootContext);
   }
   configureAndRefreshWebApplicationContext(cwac);
  }
 }
 if (wac == null) {
  // No context instance was injected at construction time -> see if one
  // has been registered in the servlet context. If one exists, it is assumed
  // that the parent context (if any) has already been set and that the
  // user has performed any initialization such as setting the context id
  wac = findWebApplicationContext();
 }
 if (wac == null) {
  // No context instance is defined for this servlet -> create a local one
  wac = createWebApplicationContext(rootContext);
 }
 return wac;
}

這里的 rootContext 就是父容器,wac 就是子容器,無論哪種方式得到的子容器,都會嘗試給其設置一個父容器。

如果我們在一個 Web 項目中,不單獨配置 Spring 容器,直接配置 SpringMVC 容器,然后將所有的 Bean 全部都掃描到 SpringMVC 容器中,這樣做是沒有問題的,項目是可以正常運行的。但是一般項目中我們還是會把這兩個容器分開,分開有如下幾個好處:

  1. 方便管理,SpringMVC 主要處理控制層相關的 Bean,如 Controller、視圖解析器、參數處理器等等,而 Spring 層則主要控制業務層相關的 Bean,如 Service、Mapper、數據源、事務、權限等等相關的 Bean。
  2. 對于新手而言,兩個容器分開配置,可以更好的理解 Controller、Service 以及 Dao 層的關系,也可以避免寫出來在 Service 層注入 Controller 這種荒唐代碼。

另外再額外說一句,有的小伙伴可能會問,如果全部 Bean 都掃描到 Spring 容器中不用 SpringMVC 容器行不行?這其實也可以!但是需要一些額外的配置,這個松哥下篇文章再來和小伙伴們細述。

3. 小結

好啦,Spring 容器中的父子容器現在大家應該明白了吧?可以給非 ListableBeanFactory 容器設置父容器,父容器不可以訪問子容器的 Bean,但是子容器可以訪問父容器的 Bean。


責任編輯:武曉燕 來源: 江南一點雨
相關推薦

2022-01-25 20:23:21

聯邦通信委員會聯邦航空管理局5G

2023-03-29 08:24:30

2021-01-19 05:48:11

QQ瀏覽器App

2022-02-06 00:02:43

Windows 11虛擬機微軟

2020-01-16 08:00:04

工具代碼開發

2021-06-04 11:10:04

JavaScript開發代碼

2021-04-24 08:17:25

比特幣區塊鏈加密貨幣

2021-04-26 10:13:04

顯卡硬盤加密

2023-10-12 08:54:20

Spring事務設置

2021-03-13 06:56:56

M1版SSDMacBook

2022-04-15 08:54:39

PythonAsync代碼

2021-07-31 19:21:34

Python下劃線數值

2021-07-11 06:36:10

Windows 10操作系統微軟

2025-08-12 05:00:00

2023-09-05 09:42:18

if分支源碼

2023-09-21 07:24:52

2020-02-18 11:19:36

物聯網病毒物聯網IOT

2022-06-23 10:47:57

Spring容器工具

2024-01-08 08:35:28

閉包陷阱ReactHooks

2022-02-16 20:04:08

容器KubernetesShim
點贊
收藏

51CTO技術棧公眾號

天天色综合色| 国产成人免费视频网站视频社区| 久久综合一区二区| 国产精品久久久久久久久久免费| 亚洲AV成人无码网站天堂久久| 涩爱av色老久久精品偷偷鲁| 色综合一区二区| 中文字幕日韩精品一区二区| 可以免费观看的毛片| 日韩电影在线观看一区| 欧美日韩国产成人| 天堂av网手机版| 成人台湾亚洲精品一区二区 | 欧美一级视频免费观看| 精品国产99| 亚洲国产精品女人久久久| 性欧美极品xxxx欧美一区二区| www.欧美日本韩国| 国产欧美日韩综合| 狠狠色噜噜狠狠色综合久| 国产精品久久免费| 日韩不卡手机在线v区| 久久噜噜噜精品国产亚洲综合| 久久久精品成人| 色综合久久中文| 欧美mv和日韩mv的网站| www.久久91| 欧美大片高清| 精品毛片三在线观看| 国产精品久久成人免费观看| 黄视频在线播放| 99re6这里只有精品视频在线观看| 国产中文欧美精品| 欧美一级黄视频| 亚洲永久免费| 午夜精品一区二区三区视频免费看| 国产麻豆a毛片| 成人黄色小视频| 亚洲三级av在线| 国产精品第七页| 国产精品香蕉| 日韩欧美黄色影院| 亚洲图色中文字幕| 国产美女久久| 欧美少妇bbb| 欧美激情精品久久久久久小说| 高清在线视频不卡| 亚洲成人一区二区| aa视频在线播放| av丝袜在线| 午夜精品久久久久久久99水蜜桃| 国产精品三级一区二区| av黄在线观看| 亚洲精品精品亚洲| 成人手机在线播放| 国产精品剧情| 亚洲午夜久久久久| 精品少妇在线视频| 性国裸体高清亚洲| 在线国产电影不卡| 自拍偷拍一区二区三区四区| 欧美一区二区三区婷婷| 欧美精品成人一区二区三区四区| 在线免费黄色网| 亚洲午夜免费| 日韩av影视综合网| 欧美大波大乳巨大乳| 成人精品影视| 欧美日本黄视频| 免费毛片在线播放免费| 一本一本久久| 国产成人在线播放| 亚洲无码久久久久久久| 国产精品18久久久久久久久久久久 | 亚洲欧美日韩天堂| 东京热无码av男人的天堂| 日韩欧美午夜| 欧美高清视频在线| 国产精品男女视频| 蜜臀a∨国产成人精品| 91精品国产综合久久香蕉| va视频在线观看| www国产精品av| 中国一区二区三区| 国产精品电影| 欧美日韩三级一区| 精人妻一区二区三区| 亚洲毛片免费看| 日韩中文在线中文网在线观看 | av在线电影免费观看| 亚洲欧美激情小说另类| 午夜精品久久久久久久无码| 国产精品.xx视频.xxtv| 欧美精品一区二区久久久| 久久久久亚洲AV成人无在| 欧美日本在线| 国产精品日韩在线观看| 成人午夜精品福利免费| 国产精品亲子乱子伦xxxx裸| 国产精品入口芒果| 国内欧美日韩| 日韩av网站在线| 久久免费看少妇高潮v片特黄| 伊人久久亚洲美女图片| 国产日产欧美a一级在线| www.国产黄色| xnxx国产精品| 久久久天堂国产精品| 国产精品成人国产| 亚洲精品自产拍| 久久久精品视频在线| 蜜臀99久久精品久久久久久软件| 国产主播一区二区三区四区| 成人在线影视| 欧美日本乱大交xxxxx| 亚洲天堂成人av| 国产精品激情| 5g国产欧美日韩视频| h视频在线播放| 色综合色综合色综合色综合色综合 | 最近中文字幕日韩精品| 久久精品一二区| 国产精品一品视频| 欧美日韩一区二区三区电影| 嫩草伊人久久精品少妇av杨幂| 亚洲成人动漫在线播放| 深夜福利影院在线观看| 精品无人区卡一卡二卡三乱码免费卡| 欧洲高清一区二区| 日韩成人av电影| 精品视频偷偷看在线观看| 国产一级特黄毛片| 国产成人精品网址| 99热都是精品| 国产95亚洲| 久久精品电影网| 伊人网中文字幕| 国产精品白丝在线| 日本黄大片一区二区三区| 欧美日韩老妇| 国产精品扒开腿爽爽爽视频 | 91视频91自| 国产午夜大地久久| 日韩av三区| 欧美在线视频免费播放| 人操人视频在线观看| 狠狠色狠狠色综合日日五| 色噜噜在线观看| 久久婷婷久久| 日本一区二区在线视频观看| 日韩欧美精品电影| 中文字幕在线国产精品| 中文字幕视频二区| 亚洲日本韩国一区| 337p日本欧洲亚洲大胆张筱雨| 狠狠噜噜久久| 国产伦精品一区二区三区高清| 1024在线看片你懂得| 日韩成人激情视频| 成年人av网站| 中文字幕日韩一区| 亚洲制服在线观看| 亚洲黄页一区| 国产欧美自拍视频| 国产在线视频网址| 欧美视频一区二区三区在线观看| 摸摸摸bbb毛毛毛片| 日本不卡视频一二三区| 亚洲午夜在线观看| 亚洲91在线| 九九久久精品一区| 亚洲av毛片成人精品| 色综合天天做天天爱| 人妻无码一区二区三区免费| 韩国视频一区二区| 久久这里只有精品23| 要久久电视剧全集免费| 国产精品毛片a∨一区二区三区|国| 麻豆av在线免费看| 亚洲国产精品一区二区久| 91porny九色| 亚洲欧美日韩综合aⅴ视频| 国产精品手机在线观看| 日韩福利电影在线观看| 欧美日韩中文字幕在线播放| 奇米影视777在线欧美电影观看 | 最近免费观看高清韩国日本大全| 国产96在线亚洲| 国产精品久久久久久五月尺| 亚洲电影视频在线| 亚洲三级黄色在线观看| 精品国产av鲁一鲁一区| 一本大道久久a久久综合| 艳妇荡乳欲伦69影片| wwwwxxxxx欧美| 四虎1515hh.com| 日韩电影在线一区| 国产69精品久久久久久久| 97精品一区二区| 久久五月天婷婷| 视频在线观看免费影院欧美meiju| 欧洲永久精品大片ww免费漫画| 成人影欧美片| 一区二区在线免费视频| 男人天堂综合网| 欧美日韩国产高清一区二区三区 | 亚洲激情视频在线观看| 一级做a爰片久久毛片16| 欧美日韩午夜剧场| 久久成人国产精品入口| 国产精品久久久久精k8| 精品无码一区二区三区 | 国产精品免费一区二区三区在线观看 | 九色porny91| 日韩午夜在线| 国产黄色激情视频| 国产精品国产一区| 色综合电影网| 日韩一级电影| 好吊色欧美一区二区三区| 国产精品毛片aⅴ一区二区三区| 日本国产精品视频| 亚洲天堂资源| 91精品国产91久久久久福利| 免费看电影在线| 色综合天天狠天天透天天伊人| 欧美激情二区| 色综合伊人色综合网站| 国产h视频在线观看| 亚洲日本欧美日韩高观看| 四虎影视精品成人| 日韩欧美国产不卡| jlzzjlzz亚洲女人18| 91精品国产手机| 国产美女永久免费| 制服丝袜av成人在线看| 亚洲中文一区二区三区| 欧美三级三级三级| 91精品国产乱码久久久久| 欧美午夜宅男影院| 亚洲天堂中文在线| 91精品啪在线观看国产60岁| 国产又粗又黄视频| 91精品国产综合久久久久久漫画| 国产影视一区二区| 日韩一区二区三区在线观看| 精品人妻aV中文字幕乱码色欲| 日韩一区二区免费在线电影| 国产黄a三级三级三级| 日韩精品专区在线影院观看| 成人毛片在线免费观看| 亚洲国产精品一区二区久| 亚洲人视频在线观看| 亚洲欧美国产另类| 国产69久久| 久久天天躁狠狠躁夜夜av| 99在线视频观看| 亚洲3p在线观看| 在线成人av观看| 国产美女扒开尿口久久久| 婷婷激情成人| 91丝袜脚交足在线播放| 动漫视频在线一区| 欧美日韩亚洲一区二区三区在线观看| 国产精品欧美日韩一区| 在线视频不卡一区二区| 欧美三级视频| 黄色免费观看视频网站| 免费成人在线观看视频| 台湾佬美性中文| xfplay精品久久| 三级影片在线观看| 亚洲成人自拍网| 最近国语视频在线观看免费播放| 欧美精品 国产精品| 成人免费一级视频| 亚洲图片欧美日产| 国产cdts系列另类在线观看| 97精品久久久| 曰本一区二区| 女人一区二区三区| 亚洲欧美网站在线观看| 国模无码视频一区二区三区| 免费高清视频精品| 免费不卡的av| 国产精品久久二区二区| 国产一级特黄aaa大片| 欧美视频一区二区在线观看| 亚洲狼人综合网| 一区二区三欧美| 操喷在线视频| 91人人爽人人爽人人精88v| 噜噜噜天天躁狠狠躁夜夜精品| 性欧美大战久久久久久久免费观看| 欧美freesex交免费视频| 一本大道熟女人妻中文字幕在线| 国内国产精品久久| 亚洲а∨天堂久久精品2021| 亚洲一区电影777| 91精东传媒理伦片在线观看| 日韩精品免费在线视频| 26uuu亚洲电影在线观看| 国产成人亚洲精品| 国产人妖ts一区二区| 青春草在线视频免费观看| 免费视频一区| 深田咏美中文字幕| 成人欧美一区二区三区视频网页| yjizz国产| 精品国产91乱码一区二区三区| 91社区在线观看| 日本一区二区在线播放| 国产精品15p| 黄色网在线视频| 韩国av一区二区三区| jizz中文字幕| 日韩欧美在线播放| 亚洲AV成人无码一二三区在线| 欧美国产精品va在线观看| 亚洲三级电影| 亚洲欧洲一区二区在线观看| 另类av一区二区| 一级做a爰片毛片| 亚洲成人激情综合网| 丰满岳乱妇国产精品一区| 美女999久久久精品视频 | 精品国产乱码久久久久久久软件| 欧美理论在线| 国产在线a视频| 亚洲欧洲制服丝袜| 国产模特av私拍大尺度| 久久精品99久久久香蕉| 色综合久久久| 综合视频免费看| 精品一区二区国语对白| 99成人在线观看| 88在线观看91蜜桃国自产| 免费在线观看av片| 国产在线精品一区免费香蕉 | 国产精品色综合| 日韩中文字幕在线视频播放| 国产综合色在线观看| 无码免费一区二区三区免费播放 | 免费在线播放第一区高清av| 日批在线观看视频| 狠狠色香婷婷久久亚洲精品| 亚洲人视频在线观看| 国产精品96久久久久久| 成人一二三区| 日本特黄a级片| 亚洲欧美激情在线| 亚洲成a人片77777精品| 久久久亚洲精品视频| 精品亚洲免a| 玩弄japan白嫩少妇hd| 国产精品久久久久久久久图文区| 国产精品综合在线| 欧美激情奇米色| 亚洲最好看的视频| 黄色手机在线视频| 亚洲男人的天堂在线aⅴ视频| www.热久久| 欧美综合在线第二页| 成人一二三区| 岛国精品一区二区三区| 欧美午夜性色大片在线观看| 二区三区在线| 91久色国产| 香蕉国产精品偷在线观看不卡| 日本乱子伦xxxx| 日韩视频国产视频| 一区二区精品伦理...| 一本一道久久久a久久久精品91| 国产一区二区免费在线| 国产午夜视频在线| 亚洲午夜性刺激影院| 九九99久久精品在免费线bt| 国产精品国产亚洲精品看不卡| 国产亚洲精久久久久久| 国产成人精品av在线观| 欧美亚洲成人精品| 91精品国产乱码久久久久久久 | 欧洲在线一区| 日本中文字幕二区| 欧美日韩国产一区二区三区| 最新av网站在线观看 | 国产美女视频免费看| 亚洲一区二区美女| 亚洲免费视频一区二区三区| 懂色av一区二区三区在线播放| 日本免费新一区视频| 久久久久亚洲av片无码下载蜜桃| 亚洲欧洲成视频免费观看| 成人在线啊v| 99免费视频观看| 亚洲国产日韩av| 黄网站视频在线观看| 蜜桃成人在线| 成人av高清在线| 国产精品久久久久久免费 |