日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

spring bean属性scope

發布時間:2024/4/15 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 spring bean属性scope 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

??<bean id="role" class="spring.chapter2.maryGame.Role" scope="singleton"/>

?這里的scope就是用來配置spring bean的作用域,它標識bean的作用域。在spring2.0之前bean只有2種作用域即:singleton(單例)、non-singleton(也稱prototype), Spring2.0以后,增加了session、request、global session三種專用于Web應用程序上下文的Bean。因此,默認情況下Spring2.0現在有五種類型的Bean。當然,Spring2.0對Bean的類型的設計進行了重構,并設計出靈活的Bean類型支持,理論上可以有無數多種類型的Bean,用戶可以根據自己的需要,增加新的Bean類型,滿足實際應用需求。!

?1、singleton作用域

??當一個bean的作用域設置為singleton, 那么Spring IOC容器中只會存在一個共享的bean實例,并且所有對bean的請求,只要id與該bean定義相匹配,則只會返回bean的同一實例。換言之,當把一個bean定義設置為singleton作用域時,Spring IOC容器只會創建該bean定義的唯一實例。這個單一實例會被存儲到單例緩存(singleton cache)中,并且所有針對該bean的后續請求和引用都將返回被緩存的對象實例,這里要注意的是singleton作用域和GOF設計模式中的單例是完全不同的,單例設計模式表示一個ClassLoader中只有一個class存在,而這里的singleton則表示一個容器對應一個bean,也就是說當一個bean被標識為singleton時候,spring的IOC容器中只會存在一個該bean。

?配置實例:
?<bean id="role" class="spring.chapter2.maryGame.Role" scope="singleton"/>
?或者
<bean id="role" class="spring.chapter2.maryGame.Role" singleton="true"/>??

?2、prototype
?prototype作用域部署的bean,每一次請求(將其注入到另一個bean中,或者以程序的方式調用容器的getBean()方法)都會產生一個新的bean實例,相當與一個new的操作,對于prototype作用域的bean,有一點非常重要,那就是Spring不能對一個prototype bean的整個生命周期負責,容器在初始化、配置、裝飾或者是裝配完一個prototype實例后,將它交給客戶端,隨后就對該prototype實例不聞不問了。不管何種作用域,容器都會調用所有對象的初始化生命周期回調方法,而對prototype而言,任何配置好的析構生命周期回調方法都將不會被調用。清除prototype作用域的對象并釋放任何prototype bean所持有的昂貴資源,都是客戶端代碼的職責。(讓Spring容器釋放被singleton作用域bean占用資源的一種可行方式是,通過使用bean的后置處理器,該處理器持有要被清除的bean的引用。)

?3、request

?request表示該針對每一次HTTP請求都會產生一個新的bean,同時該bean僅在當前HTTP request內有效,配置實例: request、session、global session使用的時候首先要在初始化web的web.xml中做如下配置:如果你使用的是Servlet 2.4及以上的web容器,那么你僅需要在web應用的XML聲明文件web.xml中增加下述ContextListener即可:

?<listener>
?? <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>

?4、session

?session作用域表示該針對每一次HTTP請求都會產生一個新的bean,同時該bean僅在當前HTTP session內有效

?5、global session
?global session作用域類似于標準的HTTP Session作用域,不過它僅僅在基于portlet的web應用中才有意義。Portlet規范定義了全局Session的概念,它被所有構成某個portlet web應用的各種不同的portlet所共享。在global session作用域中定義的bean被限定于全局portlet Session的生命周期范圍內。如果你在web中使用global session作用域來標識bean,那么web會自動當成session類型來使用

?6、自定義bean裝配作用域在spring2.0中作用域是可以任意擴展的,你可以自定義作用域,甚至你也可以重新定義已有的作用域(但是你不能覆蓋singleton和prototype),spring的作用域由接口org.springframework.beans.factory.con**.Scope來定義,自定義自己的作用域只要實現該接口即可

?

再議singleton與prototype:

?scope="prototype"沒寫的問題,項目中對一個表的增刪該操作是用一個action,這個 actionadd,update,delete,save這些方法, 添加和修改是共用一個頁面,當頁面得到id時代表進行的修改操作,反之是添加操作。因為在配置spring的bean是忘了寫 scope="prototype" 所以每次添加時都顯示最后一次訪問過的記錄,scope="prototype" 會在該類型的對象被請求 時創建一個新的action對象。如果沒有配置scope=prototype則添加的時候不會新建一個action,他任然會保留上次訪問的過記錄的信息 webwork的Action不是線程安全的,要求在多線程環境下必須是一個線程對應一個獨立的實例,不能使用 singleton。所以,我們在Spring配置Webwork Action Bean時,需要加上屬性scope=”prototype”或singleton=”false”。?
????? singleton模式指的是對某個對象的完全共享,包括代碼空間和數據空間,說白了,如果一個類是singleton的,假如這個類有成員變量,那么這個成員變量的值是各個線程共享的(有點類似于static的樣子了),當線程A往給變量賦了一個值以后,線程B就能讀出這個值。因此,對于前臺Action,肯定不能使用singleton的模式,必須是一個線程請求對應一個獨立的實例。推而廣之,只要是帶數據成員變量的類,為了防止多個線程混用數據,就不能使用singleton。對于我們用到的Service、Dao,之所以用了singleton,就是因為他們沒有用到數據成員變量,如果誰的 Service需要數據成員變量,請設置singleton=false。 有狀態的bean都使用Prototype作用域,而對無狀態的bean則應該使用singleton作用域。

?????? 在 Spring2.0中除了以前的Singleton和Prototype外又加入了三個新的web作用域,分別為request、session和 global session。如果你希望容器里的某個bean擁有其中某種新的web作用域,除了在bean級上配置相應的scope屬性,還必須在容器級做一個額外的初始化配置。即在web應用的web.xml中增加這么一個ContextListener: org.springframework.web.context.request.RequestContextListener 以上是針對Servlet 2.4以后的版本。比如Request作用域。


如果在<bean>中指定Bean的作用范圍為scope="prototype",將Bean返回給調用者,調用者負責Bean

后續生命的管理,spring不再管理這些Bean的生命周期.如果作用范圍設置為scope="singleton",則將

Bean放入Spring IOC容器的緩存池中,并將Bean引用返回給調用者,spring繼續對這些Bean進行后續

的生命管理. 默認屬性是singleton

?

Bean以兩種形態存在:singletons形式和prototypes形式。當bean以singletons形態存在時,BeanFactory只管理一個共享的實例。所有對這個特定bean的實例請求,都導致返回這個唯一bean實例的引用。
當bean以prototype形態存在時,每次對這個bean的實例請求都會導致一個新的實例的創建。當用戶需要不受其他用戶對象影響的對象或有類似的需求時,這是一個較理想的解決辦法。
Bean默認是以singleton形態存在的,除非你另外顯式加以指定。留神,當把bean的設置改為prototype模式時,每次對這個bean的實例請求都會導致一個新的bean實例被創建,而這可能并不是你所期望的。所以,只應該在確實需要的情況下把bean設置為prototype模式。


3.4.?bean的作用域 - Spring Framework reference 2.0.5 參考手冊中文版

3.4.?bean的作用域

在創建一個bean定義(通常為XML配置文件)時,你可以簡單的將其理解為:用以創建由該bean定義所決定的實際對象實例的一張“處方(recipe)”或者模板。就如class一樣,根據一張“處方”你可以創建多個對象實例。

你不僅可以控制注入到對象(bean定義)中的各種依賴和配置值,還可以控制該對象的作用域。這樣你可以靈活選擇所建對象的作用域,而不必在Java Class級定義作用域。Spring Framework支持五種作用域(其中有三種只能用在基于web的Spring?ApplicationContext)。

內置支持的作用域分列如下:

表?3.4.?Bean作用域

作用域描述

singleton

在每個Spring IoC容器中一個bean定義對應一個對象實例。

prototype

一個bean定義對應多個對象實例。

request

在一次HTTP請求中,一個bean定義對應一個實例;即每次HTTP請求將會有各自的bean實例,它們依據某個bean定義創建而成。該作用域僅在基于web的Spring?ApplicationContext情形下有效。

session

在一個HTTP?Session中,一個bean定義對應一個實例。該作用域僅在基于web的Spring?ApplicationContext情形下有效。

global session

在一個全局的HTTP?Session中,一個bean定義對應一個實例。典型情況下,僅在使用portlet context的時候有效。該作用域僅在基于web的Spring?ApplicationContext情形下有效。


3.4.1.?Singleton作用域

當一個bean的作用域為singleton, 那么Spring IoC容器中只會存在一個共享的bean實例,并且所有對bean的請求,只要id與該bean定義相匹配,則只會返回bean的同一實例。

換言之,當把一個bean定義設置為singlton作用域時,Spring IoC容器只會創建該bean定義的唯一實例。這個單一實例會被存儲到單例緩存(singleton cache)中,并且所有針對該bean的后續請求和引用都將返回被緩存的對象實例。

下圖演示了Spring的singleton作用域。

請注意Spring的singleton bean概念與“四人幫”(GoF)模式一書中定義的Singleton模式是完全不同的。經典的GoF Singleton模式中所謂的對象范圍是指在每一個ClassLoader中指定class創建的實例有且僅有一個。把Spring的singleton作用域描述成一個container對應一個bean實例最為貼切。亦即,假如在單個Spring容器內定義了某個指定class的bean,那么Spring容器將會創建一個且僅有一個由該bean定義指定的類實例。

Singleton作用域是Spring中的缺省作用域。要在XML中將bean定義成singleton,可以這樣配置:

<bean id="accountService" class="com.foo.DefaultAccountService"/><!-- the following is equivalent, though redundant (singleton scope is the default) --> <bean id="accountService" class="com.foo.DefaultAccountService" scope="singleton"/><!-- the following is equivalent, though redundant (and preserved for backward compatibility) --> <bean id="accountService" class="com.foo.DefaultAccountService" singleton="true"/>

3.4.2.?Prototype作用域

Prototype作用域的bean會導致在每次對該bean請求(將其注入到另一個bean中,或者以程序的方式調用容器的getBean()方法)時都會創建一個新的bean實例。根據經驗,對所有有狀態的bean應該使用prototype作用域,而對無狀態的bean則應該使用singleton作用域。

下圖演示了Spring的prototype作用域。請注意,典型情況下,DAO不會被配置成prototype,因為一個典型的DAO不會持有任何會話狀態,因此應該使用singleton作用域。

要在XML中將bean定義成prototype,可以這樣配置:

<bean id="accountService" class="com.foo.DefaultAccountService" scope="prototype"/><!-- the following is equivalent too (and preserved for backward compatibility) --> <bean id="accountService" class="com.foo.DefaultAccountService" singleton="false"/>

對于prototype作用域的bean,有一點非常重要,那就是Spring不能對一個prototype bean的整個生命周期負責:容器在初始化、配置、裝飾或者是裝配完一個prototype實例后,將它交給客戶端,隨后就對該prototype實例不聞不問了。不管何種作用域,容器都會調用所有對象的初始化生命周期回調方法,而對prototype而言,任何配置好的析構生命周期回調方法都將不會被調用。清除prototype作用域的對象并釋放任何prototype bean所持有的昂貴資源,都是客戶端代碼的職責。(讓Spring容器釋放被singleton作用域bean占用資源的一種可行方式是,通過使用bean的后置處理器,該處理器持有要被清除的bean的引用。)

談及prototype作用域的bean時,在某些方面你可以將Spring容器的角色看作是Java?new操作符的替代者。任何遲于該時間點的生命周期事宜都得交由客戶端來處理。在第?3.5.1?節 “Lifecycle接口”一節中會進一步講述Spring IoC容器中的bean生命周期。

向后兼容性:在XML中指定生命周期作用域

如果你在bean定義文件中引用'spring-beans.dtd'?DTD,要顯式說明bean的生命周期作用域你必須使用"singleton"屬性(記住singleton生命周期作用域是默認的)。 如果引用的是'spring-beans-2.0.dtd'?DTD或者是Spring 2.0 XSD schema,那么需要使用"scope"屬性(因為"singleton"屬性被刪除了,新的DTD和XSD文件使用"scope"屬性)。

簡單地說,如果你用"singleton"屬性那么就必須在那個文件里引用'spring-beans.dtd'?DTD。 如果你用"scope"屬性那么必須?在那個文件里引用'spring-beans-2.0.dtd'?DTD 或'spring-beans-2.0.xsd'?XSD。

3.4.3.?其他作用域

其他作用域,即request、session以及global session僅在基于web的應用中使用(不必關心你所采用的是什么web應用框架)。

注意

下面介紹的作用域僅僅在使用基于web的Spring?ApplicationContext實現(如XmlWebApplicationContext)時有用。如果在普通的Spring IoC容器中,比如像XmlBeanFactory或ClassPathXmlApplicationContext,嘗試使用這些作用域,你將會得到一個IllegalStateException異常(未知的bean作用域)。

3.4.3.1.?初始化web配置

要使用request、session和?global session作用域的bean(即具有web作用域的bean),在開始設置bean定義之前,還要做少量的初始配置。請注意,假如你只想要“常規的”作用域,也就是singleton和prototype,就不需要這一額外的設置。

在目前的情況下,根據你的特定servlet環境,有多種方法來完成這一初始設置。如果你使用的是Servlet 2.4及以上的web容器,那么你僅需要在web應用的XML聲明文件web.xml中增加下述ContextListener即可

<web-app>...<listener><listener-class>org.springframework.web.context.request.RequestContextListener</listener-class></listener>... </web-app>

如果你用的是早期版本的web容器(Servlet 2.4以前),那么你要使用一個javax.servlet.Filter的實現。請看下面的web.xml配置片段:

<web-app>..<filter> <filter-name>requestContextFilter</filter-name> <filter-class>org.springframework.web.filter.RequestContextFilter</filter-class></filter> <filter-mapping> <filter-name>requestContextFilter</filter-name> <url-pattern>/*</url-pattern></filter-mapping>... </web-app>

RequestContextListener和RequestContextFilter兩個類做的都是同樣的工作:將HTTP request對象綁定到為該請求提供服務的Thread。這使得具有request和session作用域的bean能夠在后面的調用鏈中被訪問到。

3.4.3.2.?Request作用域

考慮下面bean定義:

<bean id="loginAction" class="com.foo.LoginAction" scope="request"/>

針對每次HTTP請求,Spring容器會根據loginAction?bean定義創建一個全新的LoginAction?bean實例,且該loginAction?bean實例僅在當前HTTP request內有效,因此可以根據需要放心的更改所建實例的內部狀態,而其他請求中根據loginAction?bean定義創建的實例,將不會看到這些特定于某個請求的狀態變化。當處理請求結束,request作用域的bean實例將被銷毀。

3.4.3.3.?Session作用域

考慮下面bean定義:

<bean id="userPreferences" class="com.foo.UserPreferences" scope="session"/>

針對某個HTTP?Session,Spring容器會根據userPreferences?bean定義創建一個全新的userPreferences?bean實例,且該userPreferences?bean僅在當前HTTP?Session內有效。與request作用域一樣,你可以根據需要放心的更改所創建實例的內部狀態,而別的HTTP?Session中根據userPreferences創建的實例,將不會看到這些特定于某個HTTP?Session的狀態變化。當HTTP?Session最終被廢棄的時候,在該HTTP?Session作用域內的bean也會被廢棄掉。

3.4.3.4.?global session作用域

考慮下面bean定義:

<bean id="userPreferences" class="com.foo.UserPreferences" scope="globalSession"/>

global session作用域類似于標準的HTTP?Session作用域,不過它僅僅在基于portlet的web應用中才有意義。Portlet規范定義了全局Session的概念,它被所有構成某個portlet web應用的各種不同的portlet所共享。在global session作用域中定義的bean被限定于全局portlet?Session的生命周期范圍內。

請注意,假如你在編寫一個標準的基于Servlet的web應用,并且定義了一個或多個具有global session作用域的bean,系統會使用標準的HTTP?Session作用域,并且不會引起任何錯誤。

3.4.3.5.?作用域bean與依賴

能夠在HTTP request或者Session(甚至自定義)作用域中定義bean固然很好,但是Spring IoC容器除了管理對象(bean)的實例化,同時還負責協作者(或者叫依賴)的實例化。如果你打算將一個Http request范圍的bean注入到另一個bean中,那么需要注入一個AOP代理來替代被注入的作用域bean。也就是說,你需要注入一個代理對象,該對象具有與被代理對象一樣的公共接口,而容器則可以足夠智能的從相關作用域中(比如一個HTTP request)獲取到真實的目標對象,并把方法調用委派給實際的對象。

注意

<aop:scoped-proxy/>不能和作用域為singleton或prototype的bean一起使用。為singleton bean創建一個scoped proxy將拋出BeanCreationException異常。

讓我們看一下將相關作用域bean作為依賴的配置,配置并不復雜(只有一行),但是理解“為何這么做”以及“如何做”是很重要的。

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd"><!-- a HTTP Session-scoped bean exposed as a proxy --><bean id="userPreferences" class="com.foo.UserPreferences" scope="session"><!-- this next element effects the proxying of the surrounding bean --><aop:scoped-proxy/></bean><!-- a singleton-scoped bean injected with a proxy to the above bean --><bean id="userService" class="com.foo.SimpleUserService"><!-- a reference to the proxied 'userPreferences' bean --><property name="userPreferences" ref="userPreferences"/></bean> </beans>

在XML配置文件中,要創建一個作用域bean的代理,只需要在作用域bean定義里插入一個<aop:scoped-proxy/>子元素即可(你可能還需要在classpath里包含CGLIB庫,這樣容器就能夠實現基于class的代理;還可能要使用基于XSD的配置)。上述XML配置展示了“如何做”,現在討論“為何這么做”。在作用域為request、session以及globalSession的bean定義里,為什么需要這個<aop:scoped-proxy/>元素呢?下面我們從去掉<aop:scoped-proxy/>元素的XML配置開始說起:

<bean id="userPreferences" class="com.foo.UserPreferences" scope="session"/><bean id="userManager" class="com.foo.UserManager"><property name="userPreferences" ref="userPreferences"/> </bean>

從上述配置中可以很明顯的看到singleton bean?userManager被注入了一個指向HTTP?Session作用域bean?userPreferences的引用。singleton?userManager?bean會被容器僅實例化一次,并且其依賴(userPreferences?bean)也僅被注入一次。這意味著,userManager在理論上只會操作同一個userPreferences對象,即原先被注入的那個bean。而注入一個HTTP?Session作用域的bean作為依賴,有違我們的初衷。因為我們想要的只是一個userManager對象,在它進入一個HTTP?Session生命周期時,我們希望去使用一個HTTPSession的userPreferences對象。

當注入某種類型對象時,該對象實現了和UserPreferences類一樣的公共接口(即UserPreferences實例)。并且不論我們底層選擇了何種作用域機制(HTTP request、Session等等),容器都會足夠智能的獲取到真正的UserPreferences對象,因此我們需要將該對象的代理注入到userManager?bean中, 而userManager?bean并不會意識到它所持有的是一個指向UserPreferences引用的代理。在本例中,當UserManager實例調用了一個使用UserPreferences對象的方法時,實際調用的是代理對象的方法。隨后代理對象會從HTTP?Session獲取真正的UserPreferences對象,并將方法調用委派給獲取到的實際的UserPreferences對象。

這就是為什么當你將request、session以及globalSession作用域bean注入到協作對象中時需要如下正確而完整的配置:

<bean id="userPreferences" class="com.foo.UserPreferences" scope="session"><aop:scoped-proxy/> </bean><bean id="userManager" class="com.foo.UserManager"><property name="userPreferences" ref="userPreferences"/> </bean>

3.4.4.?自定義作用域

在Spring 2.0中,Spring的bean作用域機制是可以擴展的。這意味著,你不僅可以使用Spring提供的預定義bean作用域; 還可以定義自己的作用域,甚至重新定義現有的作用域(不提倡這么做,而且你不能覆蓋內置的singleton和prototype作用域)。

作用域由接口org.springframework.beans.factory.config.Scope定義。要將你自己的自定義作用域集成到Spring容器中,需要實現該接口。它本身非常簡單,只有兩個方法,分別用于底層存儲機制獲取和刪除對象。自定義作用域可能超出了本參考手冊的討論范圍,但你可以參考一下Spring提供的Scope實現,以便于去如何著手編寫自己的Scope實現。

在實現一個或多個自定義Scope并測試通過之后,接下來就是如何讓Spring容器識別你的新作用域。ConfigurableBeanFactory接口聲明了給Spring容器注冊新Scope的主要方法。(大部分隨Spring一起發布的BeanFactory具體實現類都實現了該接口);該接口的主要方法如下所示:

void registerScope(String scopeName, Scope scope);

registerScope(..)方法的第一個參數是與作用域相關的全局唯一名稱;Spring容器中該名稱的范例有singleton和prototype。registerScope(..)方法的第二個參數是你打算注冊和使用的自定義Scope實現的一個實例。

假設你已經寫好了自己的自定義Scope實現,并且已經將其進行了注冊:

// note: the ThreadScope class does not exist; I made it up for the sake of this example Scope customScope = new ThreadScope(); beanFactory.registerScope("thread", scope);

然后你就可以像下面這樣創建與自定義Scope的作用域規則相吻合的bean定義了:

<bean id="..." class="..." scope="thread"/>

如果你有自己的自定義Scope實現,你不僅可以采用編程的方式注冊自定義作用域,還可以使用BeanFactoryPostProcessor實現:CustomScopeConfigurer類,以聲明的方式注冊Scope。BeanFactoryPostProcessor接口是擴展Spring IoC容器的基本方法之一,在本章的BeanFactoryPostProcessor中將會介紹。

使用CustomScopeConfigurer,以聲明方式注冊自定義Scope的方法如下所示:

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd"><bean class="org.springframework.beans.factory.config.CustomScopeConfigurer"><property name="scopes"><map><entry key="thread" value="com.foo.ThreadScope"/></map></property></bean><bean id="bar" class="x.y.Bar" scope="thread"><property name="name" value="Rick"/><aop:scoped-proxy/></bean><bean id="foo" class="x.y.Foo"><property name="bar" ref="bar"/></bean></beans>


與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的spring bean属性scope的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 成人一级生活片 | 女人一区二区 | 麻豆乱码国产一区二区三区 | 自拍偷拍亚洲精品 | 亚洲免费影院 | 一本一本久久a久久精品综合麻豆 | 日本色视 | 操日本老太太 | 人妻精品一区二区三区 | 精品国产乱码久久久久久1区2区 | 6996电视影片免费看 | 曰韩av| 日韩精品在线免费观看 | 日本国产三级xxxxxx | 亚洲精品国产手机 | 丁香激情网 | 精品国产va久久久久久久 | 久久国产中文字幕 | 91麻豆精品在线观看 | 色一情一乱一伦一区二区三区 | 农村妇女av| 日韩黄色一级视频 | 直接看毛片 | 国产亚洲视频一区 | 少妇荡乳情欲办公室456视频 | 吃奶摸下的激烈视频 | 天堂a√在线 | 欧美在线va | 伊人精品在线视频 | 亚洲午夜视频在线 | 魔女鞋交玉足榨精调教 | 双性娇喘浑圆奶水h男男漫画 | 岛国av在线免费 | 超碰免费观看 | 91黄色小视频 | 久久亚洲一区二区三区四区五区 | 欧美1区2区3区4区 | 毛片毛片毛片毛片毛片毛片毛片毛片毛片毛片 | 亚洲精品国产成人久久av盗摄 | 免费黄色激情视频 | 美女一级视频 | 精品国产视频在线 | 嫩草视频在线观看视频 | 国产免费一区二区三区在线播放 | 在线视频三区 | 精品无码人妻一区二区免费蜜桃 | 免费日本黄色网址 | 人人免费操 | 男女午夜影院 | 四虎国产精品免费 | 一边摸内裤一边吻胸 | 在线视频天堂 | 国产亚洲精品久久久久四川人 | 欧美性色黄 | 日韩一级视频 | 精品人妻一区二区三区四区不卡 | 久久99国产精品久久99 | 亚洲欧美综合另类自拍 | 国产欧美综合一区二区三区 | 欧美精品一区二区成人 | 好吊妞在线观看 | 亚洲av色区一区二区三区 | 中文字幕日韩欧美 | 亚洲8888 | 国产精品美女高潮无套 | 成人一区三区 | 欧美亚洲在线 | 91免费进入| 超碰网站在线 | 综合色小说 | 久在线 | 国产精品999在线观看 | 97视频一区二区三区 | 亚洲天堂中文字幕在线观看 | 国产免费久久 | 日本女人一级片 | 国产黄a三级 | 国产女主播喷水高潮网红在线 | 日韩美女视频一区 | 亚洲色图13p| 特级西西444www大胆免费看 | 中文字幕乱码人妻二区三区 | 美女脱了裤子让男人桶 | 国产美女一区二区三区 | 蜜乳av中文字幕 | 男女野外做受全过程 | 狠狠躁夜夜躁人爽 | 香蕉人人精品 | 日本精品视频一区二区三区 | 免费在线国产精品 | 99热热久久| 男人用嘴添女人下身免费视频 | 97在线视频免费 | 久久久久久久久久网 | 日韩欧美中文在线观看 | 欧美国产成人精品一区二区三区 | 91小视频在线观看 | 精品美女一区二区三区 | 青青青视频在线播放 |