黄a在线观看-黄a在线-黄a大片-黄色片在线看-黄色毛片免费-黄色大片网站

您的位置:首頁技術文章
文章詳情頁

Spring Web零xml配置原理以及父子容器關系詳解

瀏覽:111日期:2023-08-18 14:55:12

前言

在使用Spring和SpringMVC的老版本進行開發時,我們需要配置很多的xml文件,非常的繁瑣,總是讓用戶自行選擇配置也是非常不好的?;诩s定大于配置的規定,Spring提供了很多注解幫助我們簡化了大量的xml配置;但是在使用SpringMVC時,我們還會使用到WEB-INF/web.xml,但實際上我們是完全可以使用Java類來取代xml配置的,這也是后來SpringBoott的實現原理。本篇就來看看Spring是如何實現完全的零XML配置。

正文

先來看一下原始的web.xml配置:

<!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'http://java.sun.com/dtd/web-app_2_3.dtd' ><web-app> <context-param> <param-name>contextConfigLocation</param-name> <param-value> <!--加載spring配置--> classpath:spring.xml </param-value> </context-param> <context-param> <param-name>webAppRootKey</param-name> <param-value>ServicePlatform.root</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> <!--<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>--> </listener> <servlet> <servlet-name>spring-dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <!--springmvc的配置文件--> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-dispatcher.xml</param-value> </init-param> <load-on-startup>0</load-on-startup> </servlet> <servlet-mapping> <servlet-name>spring-dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping></web-app>

這里各個配置的作用簡單說下,context-param是加載我們主的sping.xml配置,比如一些bean的配置和開啟注解掃描等;listener是配置監聽器,Tomcat啟動會觸發監聽器調用;servlet則是配置我們自定義的Servlet實現,比如DispatcherServlet。還有其它很多配置就不一一說明了,在這里主要看到記住context-param和servlet配置,這是SpringIOC父子容器的體現。

在之前的I文章中講過IOC容器是以父子關系組織的,但估計大部分人都不能理解,除了看到復雜的繼承體系,并沒有看到父容器作用的體現,稍后來分析。

了解了配置,我們就需要思考如何替換掉這些繁瑣的配置。實際上Tomcat提供了一個規范,有一個ServletContainerInitializer接口:

public interface ServletContainerInitializer { void onStartup(Set<Class<?>> var1, ServletContext var2) throws ServletException;}

Tomcat啟動時會調用該接口實現類的onStartup方法,這個方法有兩個參數,第二個不用說,主要是第一個參數什么?從哪里來?另外我們自定義的實現類又怎么讓Tomcat調用呢?

首先解答最后一個問題,這里也是利用SPI來實現的,因此我們實現了該接口后,還需要在META-INF.services下配置。其次,這里傳入的第一個參數也是我們自定義的擴展接口的實現類,我們可以通過我們自定義的接口實現很多需要在啟動時做的事,比如加載Servlet,但是Tomcat又是怎么知道我們自定義的接口是哪個呢?

這就需要用到@HandlesTypes注解,該注解就是標注在ServletContainerInitializer的實現類上,其值就是我們擴展的接口,這樣Tomcat就知道需要傳入哪個接口實現類到這個onStartup方法了。

來看一個簡單的實現:

@HandlesTypes(LoadServlet.class)public class MyServletContainerInitializer implements ServletContainerInitializer { @Override public void onStartup(Set<Class<?>> set, ServletContext servletContext) throws ServletException { Iterator var4; if (set != null) { var4 = set.iterator(); while (var4.hasNext()) {Class<?> clazz = (Class<?>) var4.next();if (!clazz.isInterface() && !Modifier.isAbstract(clazz.getModifiers()) && LoadServlet.class.isAssignableFrom(clazz)) { try { ((LoadServlet) clazz.newInstance()).loadOnstarp(servletContext); } catch (Exception e) { e.printStackTrace(); }} } } }}public interface LoadServlet { void loadOnstarp(ServletContext servletContext);}public class LoadServletImpl implements LoadServlet { @Override public void loadOnstarp(ServletContext servletContext) { ServletRegistration.Dynamic initServlet = servletContext.addServlet('initServlet', 'org.springframework.web.servlet.DispatcherServlet'); initServlet.setLoadOnStartup(1); initServlet.addMapping('/init'); }}

這就是Tomcat給我們提供的規范,通過這個規范我們就能實現Spring的零xml配置啟動,直接來看Spring是如何做的。根據上面所說我們可以在spring-web工程下找到META-INF/services/javax.servlet.ServletContainerInitializer配置:

@HandlesTypes(WebApplicationInitializer.class)public class SpringServletContainerInitializer implements ServletContainerInitializer { @Override public void onStartup(@Nullable Set<Class<?>> webAppInitializerClasses, ServletContext servletContext) throws ServletException { List<WebApplicationInitializer> initializers = new LinkedList<>(); if (webAppInitializerClasses != null) { for (Class<?> waiClass : webAppInitializerClasses) { // Be defensive: Some servlet containers provide us with invalid classes, // no matter what @HandlesTypes says... if (!waiClass.isInterface() && !Modifier.isAbstract(waiClass.getModifiers()) && WebApplicationInitializer.class.isAssignableFrom(waiClass)) { try { initializers.add((WebApplicationInitializer) ReflectionUtils.accessibleConstructor(waiClass).newInstance()); } catch (Throwable ex) { throw new ServletException('Failed to instantiate WebApplicationInitializer class', ex); } } } } if (initializers.isEmpty()) { servletContext.log('No Spring WebApplicationInitializer types detected on classpath'); return; } servletContext.log(initializers.size() + ' Spring WebApplicationInitializers detected on classpath'); AnnotationAwareOrderComparator.sort(initializers); for (WebApplicationInitializer initializer : initializers) { initializer.onStartup(servletContext); } }}

核心的實現就是WebApplicationInitializer,先看看其繼承體系

Spring Web零xml配置原理以及父子容器關系詳解

AbstractReactiveWebInitializer不用管,主要看另外一邊,但是都是抽象類,也就是說真的實例也是由我們自己實現,但需要我們實現什么呢?我們一般直接繼承AbstractAnnotationConfigDispatcherServletInitializer類,有四個抽象方法需要我們實現:

//父容器 @Override protected Class<?>[] getRootConfigClasses() { return new Class<?>[]{SpringContainer.class}; } //SpringMVC配置子容器 @Override protected Class<?>[] getServletConfigClasses() { return new Class<?>[]{MvcContainer.class}; } //獲取DispatcherServlet的映射信息 @Override protected String[] getServletMappings() { return new String[]{'/'}; } // filter配置 @Override protected Filter[] getServletFilters() { MyFilter myFilter = new MyFilter(); CorsFilter corsFilter = new CorsFilter(); return new Filter[]{myFilter,corsFilter}; }

這里主要注意getRootConfigClasses和getServletConfigClasses方法,分別加載父、子容器:

@ComponentScan(value = 'com.dark',excludeFilters = { @ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Controller.class})})public class SpringContainer {}@ComponentScan(value = 'com.dark',includeFilters = { @ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Controller.class})},useDefaultFilters = false)public class MvcContainer {}

看到這兩個類上的注解應該不陌生了吧,父容器掃描裝載了所有不帶@Controller注解的類,子容器則相反,但需要對象時首先從當前容器中找,如果沒有則從父容器中獲取,為什么要這么設計呢?

直接放到一個容器中不行么?先思考下, 稍后解答。回到onStartup方法中,直接回調用到AbstractDispatcherServletInitializer類:

public void onStartup(ServletContext servletContext) throws ServletException { super.onStartup(servletContext); //注冊DispatcherServlet registerDispatcherServlet(servletContext); }

先是調用父類:

public void onStartup(ServletContext servletContext) throws ServletException { registerContextLoaderListener(servletContext); } protected void registerContextLoaderListener(ServletContext servletContext) { //創建spring上下文,注冊了SpringContainer WebApplicationContext rootAppContext = createRootApplicationContext(); if (rootAppContext != null) { //創建監聽器 ContextLoaderListener listener = new ContextLoaderListener(rootAppContext); listener.setContextInitializers(getRootApplicationContextInitializers()); servletContext.addListener(listener); } }

然后調用createRootApplicationContext創建父容器:

protected WebApplicationContext createRootApplicationContext() { Class<?>[] configClasses = getRootConfigClasses(); if (!ObjectUtils.isEmpty(configClasses)) { AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); context.register(configClasses); return context; } else { return null; } }

可以看到就是創建了一個AnnotationConfigWebApplicationContext對象,并將我們的配置類SpringContainer注冊了進去。接著創建Tomcat啟動加載監聽器ContextLoaderListener,該監聽器有一個contextInitialized方法,會在Tomcat啟動時調用。

public void contextInitialized(ServletContextEvent event) { initWebApplicationContext(event.getServletContext()); } */ public WebApplicationContext initWebApplicationContext(ServletContext servletContext) { long startTime = System.currentTimeMillis(); try { // Store context in local instance variable, to guarantee that // it is available on ServletContext shutdown. if (this.context == null) { this.context = createWebApplicationContext(servletContext); } if (this.context instanceof ConfigurableWebApplicationContext) { ConfigurableWebApplicationContext cwac = (ConfigurableWebApplicationContext) this.context; if (!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 -> // determine parent for root web application context, if any. ApplicationContext parent = loadParentContext(servletContext); cwac.setParent(parent); } configureAndRefreshWebApplicationContext(cwac, servletContext); } } servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, this.context); ClassLoader ccl = Thread.currentThread().getContextClassLoader(); if (ccl == ContextLoader.class.getClassLoader()) { currentContext = this.context; } else if (ccl != null) { currentContextPerThread.put(ccl, this.context); } return this.context; } }

可以看到就是去初始化容器,這個和之前分析xml解析是一樣的,主要注意這里封裝了ServletContext對象,并將父容器設置到了該對象中。

父容器創建完成后自然就是子容器的創建,來到registerDispatcherServlet方法:

protected void registerDispatcherServlet(ServletContext servletContext) { String servletName = getServletName(); Assert.hasLength(servletName, 'getServletName() must not return null or empty'); //創建springmvc的上下文,注冊了MvcContainer類 WebApplicationContext servletAppContext = createServletApplicationContext(); Assert.notNull(servletAppContext, 'createServletApplicationContext() must not return null'); //創建DispatcherServlet FrameworkServlet dispatcherServlet = createDispatcherServlet(servletAppContext); Assert.notNull(dispatcherServlet, 'createDispatcherServlet(WebApplicationContext) must not return null'); dispatcherServlet.setContextInitializers(getServletApplicationContextInitializers()); ServletRegistration.Dynamic registration = servletContext.addServlet(servletName, dispatcherServlet); if (registration == null) { throw new IllegalStateException('Failed to register servlet with name ’' + servletName + '’. ' + 'Check if there is another servlet registered under the same name.'); } /* * 如果該元素的值為負數或者沒有設置,則容器會當Servlet被請求時再加載。 如果值為正整數或者0時,表示容器在應用啟動時就加載并初始化這個servlet, 值越小,servlet的優先級越高,就越先被加載 * */ registration.setLoadOnStartup(1); registration.addMapping(getServletMappings()); registration.setAsyncSupported(isAsyncSupported()); Filter[] filters = getServletFilters(); if (!ObjectUtils.isEmpty(filters)) { for (Filter filter : filters) { registerServletFilter(servletContext, filter); } } customizeRegistration(registration); } protected WebApplicationContext createServletApplicationContext() { AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); Class<?>[] configClasses = getServletConfigClasses(); if (!ObjectUtils.isEmpty(configClasses)) { context.register(configClasses); } return context; }

這里也是創建了一個AnnotationConfigWebApplicationContext對象,不同的只是這里注冊的配置類就是我們的Servlet配置了。然后創建了DispatcherServlet對象,并將上下文對象設置了進去。

看到這你可能會疑惑,既然父子容器創建的都是相同類的對象,何來的父子容器之說?

別急,這個在初始化該上文時就明白了。但是這里的初始化入口在哪呢?沒有看到任何監聽器的創建和調用。

實際上這里的上下文對象初始化是在Servlet初始化時實現的,即init方法,直接來到HttpServletBean的init方法(分析SpringMVC源碼時講過):

public final void init() throws ServletException { ...省略 // Let subclasses do whatever initialization they like. initServletBean(); } protected final void initServletBean() throws ServletException { try { this.webApplicationContext = initWebApplicationContext(); initFrameworkServlet(); } } protected WebApplicationContext initWebApplicationContext() { //這里會從servletContext中獲取到父容器,就是通過監聽器加載的容器 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) { ConfigurableWebApplicationContext cwac = (ConfigurableWebApplicationContext) wac; if (!cwac.isActive()) { if (cwac.getParent() == null) { cwac.setParent(rootContext); } //容器加載 configureAndRefreshWebApplicationContext(cwac); } } } if (wac == null) { wac = findWebApplicationContext(); } if (wac == null) { wac = createWebApplicationContext(rootContext); } if (!this.refreshEventReceived) { synchronized (this.onRefreshMonitor) { onRefresh(wac); } } if (this.publishContext) { // Publish the context as a servlet context attribute. String attrName = getServletContextAttributeName(); getServletContext().setAttribute(attrName, wac); } return wac; }

看到這里想你也應該明白了,首先從ServletContext中拿到父容器,然后設置到當前容器的parent中,實現了父子容器的組織,而這樣設計好處我想也是很清楚的,子容器目前裝載的都是MVC的配置和Bean,簡單點說就是Controller,父容器中都是Service,Controller是依賴于Service的,如果不構建這樣的層級關系并優先實例化父容器,你怎么實現Controller層的依賴注入成功呢?

總結

本篇結合之前的文章,分析了SpringMVC零XML配置的實現原理,也補充了之前未分析到父子容器關系,讓我們能從細節上更加全面的理解SpringIOC的實現原理,相信看完本篇對于SpringBoot的實現你也會有自己的想法。希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Spring
相關文章:
主站蜘蛛池模板: 女人18毛片aaa片水真多 | 撕开少妇裙子猛然进入 | 一级黄色大片视频 | 深夜成人福利视频 | www久久com| いいなり北条麻妃av101 | 亚洲综合在线视频 | 色婷婷精品国产一区二区三区 | 午夜精品久久久久久久男人的天堂 | 国产精品久久毛片av大全日韩 | 人妻被按摩到潮喷中文字幕 | 国产日韩精品一区二区 | 亚洲第一色图 | 琪琪色18| 国产综合日韩 | 99精品国产高清在线观看 | 亚洲免费在线观看视频 | 亚洲精品精品 | 精精国产xxxx视频在线野外 | 美女裸片| 99热网站| 中文字幕免费视频 | 两个人看的www在线观看 | 亚洲天堂h| 国产av新搬来的白领女邻居 | 国产精品黑色高跟鞋丝袜 | 91干| 乱码丰满人妻一二三区 | 免费在线看黄网址 | 久操视频网站 | 少妇激情av一区二区 | 自拍毛片| 丰满少妇av | 久久久久久久久久av | 精品久久久久久久久久久久久久久久 | 天堂av网手机版 | 精品久久久爽爽久久男人和男人 | 人人妻一区二区三区 | 成人国产精品久久久 | 婷婷久久综合九色综合88 | 黑人糟蹋人妻hd中文字幕 | 精品无码国产自产拍在线观看 | 亚洲精品日韩av | 国产精品日本一区二区在线播放 | 亚洲色图激情 | 精品欧美一区二区三区免费观看 | 海角社区在线视频播放观看 | 国产无套内谢普通话对白91 | 色欲综合视频天天天 | av片一区二区三区 | 国产真实野战在线视频 | 国产精品岛国久久久久久久久红粉 | 亚洲精品久久30p | 毛片久久久| 成人做爰69片免费看网站 | 国产午夜精品一区二区三区四区 | 五月天婷婷激情网 | 日韩亚洲制服丝袜中文字幕 | 青草成人免费视频 | 综合久久伊人 | 粉嫩av一区二区三区入口 | 一区二区在线看 | 激情六月天婷婷 | 依人久久 | 色综合久久天天 | 丰满少妇aaaaaa爰片毛片 | 精品人妻少妇一区二区三区在线 | 国产精品99久久久精品无码 | 快射视频在线观看 | 18分钟处破好疼哭视频在线观看 | 国产一级免费不卡 | av天堂午夜精品一区二区三区 | 欧美午夜在线视频 | 亚洲精品视频一二三区 | 美女野外找人搭讪啪啪 | 男女一进一出超猛烈的视频不遮挡在线观看 | 66亚洲一卡2卡新区成片发布 | 深夜视频在线观看免费 | 国产一区在线观看视频 | 久久av资源网 | 日日免费视频 | 3d动漫精品啪啪一区二区中 | 亚洲精品久久久久久久久久久久久久 | 日本美女一级片 | 精品国产黄色片 | 丁香花在线影院观看在线播放 | 一区二区三区久久久 | 国产亚洲真人做受在线观看 | 在线观看黄网站 | 国产免费福利 | 国产精品成人一区二区网站软件 | 自拍偷拍第一页 | 久久蜜桃av一区二区天堂 | 91精品视频在线播放 | 国产69精品久久久久99尤物 | 成人午夜又粗又硬又长 | 国产三级午夜理伦三级连载时间 | 国产无套护士在线观看 | 日韩国产高清在线 | 黄污视频在线免费观看 | 亚洲毛片网站 | 777精品视频| 亚洲欧美日韩一区二区三区四区 | 中文日韩视频 | 真实国产乱啪福利露脸 | 精品久久久无码中文字幕边打电话 | 亚洲天堂中文字幕 | 亚洲第一毛片18我少妇 | 国产喷水在线 | 久久99精品国产自在现线小黄鸭 | 青青av在线 | 人人射影院 | av网在线| 乱h高h女np群欢 | 性欧美xxxx | 亚洲区视频 | 一区二区在线看 | 日韩欧美猛交xxxxx无码 | 夜夜爽妓女8888888视频 | 毛片最新网址 | 国产成人欧美一区二区三区一色天 | 久久视频在线免费观看 | 国产黄色大片视频 | 日韩成人精品 | 91精品国产综合久久久久久 | 青青欧美| 国产极品粉嫩福利姬萌白酱 | 欧美性生活网站 | 久久中文精品视频 | 91大神视频在线播放 | 国产污污视频 | 蜜臀久久 | 国产aaaaa毛片 | av激情四射 | 制服丝袜一区 | 55夜色66夜色国产精品视频 | 久久久www成人免费无遮挡大片 | 国产精品毛片无码 | 成人无码www免费视频 | 青草久久久 | 国产亚洲精品aaaa片app | 久久成人高清 | 欧美一区二区三区久久综合 | 久久精品中文字幕一区 | 蜜桃av一区二区三区 | 亚洲精品偷拍 | 色妞ww精品视频7777 | 精品午夜福利在线观看 | 新婚夜第一次深深挺进 | 国产精品伦子伦免费视频 | 国产精品国产三级国产专区51区 | 强行挺进熟睡少妇av | 色版视频| 国产午夜精品一区二区 | 亚洲 欧美 影音先锋 | 四川一级毛毛片 | 日本少妇xxxx软件 | 国产痴汉av久久精品 | 亚洲欧美日韩另类 | 久久国产精品精品 | 青青草综合网 | 日韩影视一区 | 7788色淫视频观看日本人 | xxx性欧美| 国语对白一区二区 | 初高中福利视频网站 | 国产精品毛片无遮挡高清 | 亚洲男人的天堂在线视频 | 狠狠色噜噜狠狠狠狠奇米777 | 国产精品久久久久久亚瑟影院 | 777久久久精品一区二区三区 | 中文字幕日韩在线播放 | 欧美偷拍综合 | 国产成人无码18禁午夜福利p | 99热一区| 八戒八戒在线www视频中文 | 黄色国产视频网站 | 国产精品亚洲一区二区在线观看 | 久久久亚洲最大ⅹxxx | 第一福利av | 亚洲多毛妓女毛茸茸的 | 中文字幕 欧美日韩 | 日本天天黄网站 | 污网站在线看 | 先锋资源在线视频 | 91在线看片 | 久久国产夫妻 | 欧美乱大交做爰xxxⅹ小说 | 亚洲第一影视 | 亚洲欧美日韩精品久久亚洲区 | 欧美性猛交xxxx黑人 | 韩国三级免费 | 男女做爰全过程免费的软件 | 伊人黄| 福利小视频在线播放 | 午夜日本永久乱码免费播放片 | 国产一二三四在线视频 | 国模私拍大尺度裸体av | 亚洲欧洲日本综合aⅴ在线 国语自产偷拍精品视频偷 午夜无码区在线观看 | 亚洲国产精品无码久久98 | 免费簧片在线观看 | 国产亚洲精品久久久久四川人 | 黄色免费网站在线看 | 本站只有精品 | 丝袜 亚洲 另类 国产 制服 | 一本色道久久综合亚洲精品按摩 | yy111111少妇无码影院 | 丝袜捆绑调教午夜一区二区 | 最新国产视频 | 国产色婷婷精品综合在线手机播放 | 夜夜夜影院 | 色片在线播放 | 极品人妻videosss人妻 | 日本性网站 | 久久久精品网站 | 黄色av导航| 欧美视频一区二区在线观看 | 国产一区二区免费播放 | 米奇7777狠狠狠狠视频 | 黄色小视频免费观看 | 欧美精品日韩少妇 | 18精品久久久无码午夜福利 | 91精品国产麻豆国产自产影视 | 伊人蕉影院久亚洲高清 | 国产主播户外勾搭人xx | 丁香婷婷亚洲 | 国产性一乱一性一伧的解决方法 | 欧美性受xxx黑人xyx性爽 | 绿色地狱在线观看 | 黄色一及片| 色翁荡熄又大又硬又粗又动态图 | www.婷婷色 | 国产成人免费视频 | 一级片久久久久久久 | 成年在线观看免费视频 | 国内爆初菊对白视频 | 人人玩人人弄 | 香蕉视频黄在线观看 | 北京少妇宾馆露脸对白 | 亚洲在线精品 | 中国黄色一及片 | 国产精品视频第一页 | 免费观看成人www动漫视频 | 香蕉视频一区 | 亚洲精品国产精品国自产观看 | 亚洲精品乱码久久久久红杏 | 国产精品久久久久久久久久久久久 | 国产粉嫩尤物极品99综合精品 | 67194熟妇在线观看线路1 | 亚洲国产精品av | av影音先锋最大资源网 | 少妇啊灬啊别停灬用力啊房东 | 久草视频手机在线观看 | 欧美日韩一区二区三区四区在线观看 | 国产精品午夜小视频观看 | 午夜精品久久久久久 | 性xxxx摔跤视频 | 国产精品一区二区三区四区五区 | 亚洲国产精品久久久久婷婷老年 | 成 人 黄 色 视频播放165 | 久久思| 国产视频第一页 | 99久久久无码国产aaa精品 | 大肉大捧一进一出好爽视频mba | 清纯粉嫩极品夜夜嗨av | 日本一区二区欧美 | 国产精品a久久久久 | 欧美影院一区 | 久热中文字幕无码视频 | 精品国产乱码久久久久久郑州公司 | 亚洲美女一级片 | xxxxx在线观看 | 国产成人av手机在线观看 | 国产精品亚洲二区在线观看 | 美女黄视频大全 | 欧美亚洲综合网 | 国产乱人伦真实精品视频 | 国产91对白在线播放 | 亚洲欧洲美洲精品一区二区三区 | 骚妇毛片| 天天综合天天干 | 解开人妻的裙子猛烈进入 | 亚洲综合一二三 | 欧美做爰性生交视频 | 九色porny丨首页入口网页 | 国产精品99蜜臀久久不卡二区 | 欧美日韩视频在线观看一区 | 国产精品成色www | 很黄的网站在线观看 | 精品久久久爽爽久久男人和男人 | 婷婷五月六月激情综合色中文字幕 | 中文字幕日韩精品亚洲一区小树林 | 草久久久久 | 老女人激情视频 | 日本精品在线播放 | 久久久久久久9 | 中文字幕欧美日韩va免费视频 | 国产成人精品一区二三区四区五区 | 天堂视频免费 | 色人阁视频 | 天堂网www在线资源 少妇被多人c夜夜爽爽 | 亚洲成人一区在线观看 | 欧美在线xxxx | 精品国产一区二区三区四区四 | 亚洲精品乱码久久久久久金桔影视 | 色哟哟在线 | 国产精品入口福利 | 久久久久久国产精品三区 | 欧美乱大交做爰xxxⅹ | 538任你躁在线精品免费 | 亚洲色图偷窥自拍 | 色播综合网| 国产毛茸茸 | 日本少妇性生活 | 国产精品91久久 | 中出av在线| 亚洲v国产v欧美v久久久久久 | 日韩精品在线免费观看视频 | 国产亚洲成av人在线观看导航 | 婷婷久久av| 国产人妻人伦精品1国产丝袜 | 白嫩少妇喷水正在播放 | a天堂最新版中文在线地址 a天堂最新地址 | 500篇短篇超级乱淫的小说 | 久久久福利| 美女做爰久久久久久 | 波多野吉衣av无码 | 中文字幕在线网站 | 三上悠亚人妻中文字幕在线 | 在厨房拨开内裤进入在线视频 | 韩日视频在线 | 强壮公侵犯使我夜夜高潮 | 精品人妻伦一二三区久久 | 欧美丰满老妇性猛交 | 亚洲欧美日本韩国 | 毛片无码一区二区三区a片视频 | 国产精品午夜爆乳美女视频 | 好男人www社区在线视频夜恋 | 麻豆区1免费| 四虎影视免费 | 久久无码人妻热线精品 | 亚洲成av人综合在线观看 | 老汉色老汉首页a亚洲 | 欧美福利视频一区二区 | 欧美三级理论片 | 五月婷婷综合在线 | 狠狠色丁香婷婷综合欧美 | 天天射网站 | 久久伊人精品一区二区三区 | 五月婷婷深爱 | 亚洲国产成人av好男人在线观看 | 日韩免费看片 | 亚洲欧洲日产国产 最新 | 亚洲精品无码久久久久久 | 欧美熟妇丰满肥白大屁股免费视频 | 日本免费在线看 | 国产成人精品国内自产拍免费看 | 亚洲国产中文在线 | av在线免费观看网站 | 久久久国产精华特点 | 日韩在线视频网站 | 裸体歌舞表演一区二区 | 怡红院av亚洲一区二区三区h | 人妻少妇精品一区二区三区 | 免费看男女www网站入口在线 | 男人吃奶摸下挵进去好爽 | 亚洲人成人网站在线观看 | 日韩精品一区二区三区免费视频观看 | 特大黑人娇小亚洲女喉交 | 国产裸体无遮挡免费视频 | 午夜久久久 | 艳妇臀荡乳欲伦交换日本 | 麻豆国产一区二区三区四区 | av综合久久| 大肉大捧一进一出好爽视频mba | 欧美噜噜久久久xxx 久久精品一区二区免费播放 | 国产丝袜调教 | 久久久久久国产精品免费播放 | 亚洲精品网站在线观看你懂的 | 日韩黄色成人 | 久久久久久国产精品亚洲78 | 日日鲁鲁夜夜狼狼视频 | 亚洲综合国产成人丁香五月激情 | 国产91网址| 性xxxx视频| vvvv88亚洲精品欧美精品 | 婷婷激情综合网 | 亚洲美女操 | 欧美性插插 | 国内精品久久久久久久久电影网 | 亚洲码国产岛国毛片在线 | 日本一区二区三区免费播放 | 国产精品va | 成年人毛片视频 | 国产嘿咻视频 | 国产农村老头老太视频 | 古风h啪肉禁欲 | 欧美激情在线狂野欧美精品 | 在线观看毛片视频 | 国产乱淫精品一区二区三区毛片 | 天堂av资源| 中文国产成人精品久久不卡 | www.超碰在线.com | 亚洲欧美中文日韩v在线观看 | 2021国产精品视频 | 国产伦精品一区二区三区妓女下载 | 夜夜爽日日澡人人添 | 九色视频在线播放 | 亚洲国产精品久久精品怡红院 | 四虎精品影视 | 精品免费二区三区三区高中清不卡 | 国产成人av一区二区三区在线观看 | 色偷偷人人澡人人爽人人模 | 国产无av码在线观看 | 欧美精品第二页 | 欧美一区二区三区在线免费观看 | 黑人中文字幕一区二区三区 | 国产日韩欧美在线观看视频 | 男人深夜网站 | 午夜影院在线观看免费 | 午夜少妇一级福利 | 99精产国品一二三产品香蕉 | 麻豆影音先锋 | 91福利影院 | 亚洲成a人片77777kkkk | 日本久操视频 | 欧美乱妇日本无乱码特黄大片 | 日本一二三区视频在线 | 国产精品第108页 | 国产视频第二页 | 亚洲免费砖区 | 强奷乱码中文字幕 | 熟妇人妻中文字幕无码老熟妇 | 色亚洲天堂 | 日本久久久久久科技有限公司 | 久久久久久久亚洲精品 | 亚洲高清视频一区二区三区 | 青青草视频播放器 | 国产亚洲精品久久久久久无几年桃 | 成人18网站 | 国产精品亚洲专区无码牛牛 | 成人免费在线看片 | 国产a级精品毛片 | 国产伦精品一区二区三区视频网站 | 国产在线精品二区 | 中文字幕乱码人妻二区三区 | 日韩欧美中文字幕精品 | 午夜亚洲福利在线老司机 | 日韩欧美无 | 久久久噜噜噜www成人网 | 91tv国产成人福利 | 伊人久久大香线蕉亚洲五月天 | 欧美 在线 | 激情综合色综合久久综合 | 亚洲欧美成人一区 | 交100部在线观看 | 欧美色综合网站 | 最新中文字幕在线观看视频 | 国产乱码精品一区二区三区精东 | 中文在线а√在线8 | 国产成人精品亚洲一区 | 最新国产福利在线观看精品 | 中文亚洲欧美日韩无线码 | 亚洲精品视频一区二区三区 | 青青青在线视频人视频在线 | 成年人黄色片网站 | 国产页 | 成人午夜视频在线播放 | 国产精品一区一区三区 | 久久久av片 | 欧美videos最新极品 | 91污在线观看 | 亚洲精品网站在线 | 最近免费中文字幕中文高清百度 | 美女自卫慰免费视频www免费 | 今夜无人入睡在线观看 | 中文字幕亚洲欧美日韩在线不卡 | 99精品视频在线观看免费播放 | 亚洲午夜无码久久yy6080 | 男女啪啪进出阳道猛进 | 新国产视频 | 亚洲欧美中文字幕 | 手机成人免费视频 | 无码人妻精品一区二区三区下载 | 国产精品久久久久久久久免费樱桃 | 一本色综合亚洲精品 | 四虎av永久在线精品免费观看 | 亚洲a√ | 亚洲综合性网 | 国产偷伦视频 | 男女天堂av | 国产精品特级毛片一区二区三区 | 午夜av免费| 中文字幕人成无码人妻综合社区 | 日韩乱码在线 | 亚色图| 久久久免费精品视频 | 国产精品久久久久久久久久ktv | 忘忧草精品久久久久久久高清 | 国产乡下妇女做爰视频 | 999zyz玖玖资源站在线观看 | 大桥未久女教师在线观看bd22 | 欧美自拍三级 | av免费在线观看网站 | 国产午夜精品一区二区三区嫩草 | 东北农村老女人乱淫视频毛片 | 我们高清中文字幕mv的更新时间 | 日韩在线1 | 人妻另类 专区 欧美 制服 | 国产女人叫床高潮大片视频 | 成人午夜免费在线 | 国内揄拍国内精品少妇国语 | 天天射影院 | 无码av最新清无码专区吞精 | 九九九热| 99久久国| 无码av中文字幕免费放 | 国产无遮挡裸体免费直播 | 国产精品久久久久久久久久大牛 | 日本精品一区二区三区在线播放视频 | 欧美精品久久久久久久久大尺度 | 国产精品69久久久久水密桃 | 欧美福利视频网站 | 日韩精品久久久久久久电影蜜臀 | 性欧美牲交在线视频 | 91看片www| 欧美一级日韩 | 成人免费看片入口 | 九九av在线 | 欧美精品日韩 | 天堂在线www中文 | 一本色综合亚洲精品 | 国产三级做爰在线播放 | 国产又粗又硬又黄的视频 | 黄a在线 | 最近免费中文字幕中文高清百度 | 3d动漫啪啪精品一区二区中文字幕 | 亲嘴扒胸摸屁股激烈网站 | 手机av免费在线 | 九九久久精品视频 | 国产成人精品一区二三区 | 欧洲精品一区二区 | 恶虐女帝安卓汉化版最新版本 | 欧美少妇一区二区三区 | 日韩视频专区 | 日韩av片在线免费观看 | 屁屁影院国产第一页 | www8888久久爱站网 | 糖心av | 久久成人一区 | 欧美网站在线观看 | 久久久亚洲国产精品麻豆综合天堂 | 色噜噜狠狠一区 | а√最新版在线天堂 | 久久成人在线视频 | 亚洲国产一区二区在线观看 | 四虎国产精品成人永久免费影视 | 大rb狠狠地给你这y荡的视频 | 女人两腿打开让男人添野外视频 | 精品在线小视频 | 精品黄色在线观看 | 51色视频 | 91麻豆精品国产91久久久久久久久 | 五月婷婷狠狠干 | 日本高清熟妇老熟妇 | 亚洲国产欧美一区二区三区丁香婷 | 狠狠色老熟妇老熟女 | 超碰国产天天做天天爽 | 亚洲男人天堂网站 | 男女羞羞视频网站18 | 国产精品视频一区二区三区, | 国产在线不卡视频 | 91超薄肉色丝袜交足高跟凉鞋 | 在线亚洲色图 | 三极片黄色 | 亚洲超碰在线观看 | 少妇高潮av久久久久久 | 欧美色图亚洲色 | 夜夜撸网站| 午夜不卡av免费 | 日韩精品亚洲人成在线 | 精品亚洲一区二区三区四区五区 | 成人免费观看网站 | а√在线中文网新版地址在线 | 五月天精品一区二区三区 | 婷婷免费| 人人超人人超碰超国产97超碰 | 日本美女aⅴ免费视频 | 欧美视频一区二区三区在线观看 | 国产福利av| 午夜免费观看 | 99国产欧美另类久久久精品 | jizz自拍 | 亚洲加勒比无码一区二区 | 色噜噜亚洲 | 美女黄色片子 | www.色就是色 | 寂寞骚妇被后入式爆草抓爆 | 日本不卡1 | 天天摸天天看天天做天天爽 | 国产又色又爽又刺激在线播放 | 新天堂网 | 国产又白又嫩又紧又爽18p | 少妇精品久久久久久久久久 | 精品久久欧美熟妇www | 日韩精品高清在线 | 免费看黄色片视频 | 久久精品视 | 国产成人精品午夜福利在线观看 | 国产xxxxx在线观看 | 午夜不卡av免费 | 极品白嫩的小少妇 | 成人免费毛片明星色大师 | 蜜桃视频一区二区 | 国产精品无码一本二本三本色 |