国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

最全總結SpringBean的作用域管理

發(fā)布時(shí)間:2021-07-05 18:40 來(lái)源:腳本之家 閱讀:0 作者:公眾號-JavaEdge 欄目: 開(kāi)發(fā)技術(shù)

目錄

              一、前言

              創(chuàng )建 BeanDefinition 時(shí),就等于創(chuàng )建了一個(gè)配方,用于創(chuàng )建由 BeanDefinition 所定義的類(lèi)實(shí)例。BeanDefinition 是配方的這種思想很重要,因為這意味著(zhù),與使用類(lèi)一樣,也可通過(guò)一個(gè)配方創(chuàng )建多個(gè)對象實(shí)例。

              有如下優(yōu)點(diǎn):

              • 可以控制要插入到從特定 BeanDefinition 創(chuàng )建的對象中的各種依賴(lài)項和配置值
              • 可以控制從特定 BeanDefinition 創(chuàng )建的對象的作用域。

              這種方式功能強大且靈活,因為開(kāi)發(fā)者可以選擇通過(guò)配置創(chuàng )建的對象的作用域,而不必在Java類(lèi)級別上考慮對象的范圍。

              當然了,作為靈活的框架,Spring 還允許開(kāi)發(fā)者創(chuàng )建自定義的作用域。

              1.1 詳細介紹下 singleton 作用域?

              僅管理一個(gè)singleton bean的一個(gè)共享實(shí)例,并且所有對具有ID或與該 BeanDefinition 相匹配的ID的bean的請求都將導致該特定的bean實(shí)例由Spring容器返回。

              換言之,當我們定義了一個(gè) BeanDefinition 并且其作用域為 singleton 時(shí),IoC容器將為該 BeanDefinition 所定義的對象創(chuàng )建一個(gè)實(shí)例。該單實(shí)例存儲在此類(lèi)單例bean的緩存中,并且對該命名bean的所有后續請求和引用都返回該緩存的對象。

              1.2 和單例模式有何聯(lián)系去區別呢?

              Spring的 singleton bean概念與傳說(shuō)中的四人幫創(chuàng )建的《Gang of Four (GoF) patterns》一書(shū)中定義的單例模式并不一樣。

              • GoF的單例模式會(huì )硬編碼對象的作用域,使得每個(gè)類(lèi)加載器只能創(chuàng )建一個(gè)特定類(lèi)的唯一實(shí)例
              • 因此,最恰當的應該將Spring單例的作用域描述為一個(gè)容器對應一個(gè)bean。若我們在單個(gè)Spring容器中為特定類(lèi)定義一個(gè)bean,則Spring容器將創(chuàng )建該 BeanDefinition 所定義的類(lèi)的一個(gè)且只有一個(gè)實(shí)例。

              單例作用域是Spring中的默認作用域。要將bean定義為XML中的單例,可以定義bean,如以下示例所示:

              1.3 Prototype作用域

              Bean部署的非單一原型作用域會(huì )在每次請求特定bean時(shí)創(chuàng )建一個(gè)新bean實(shí)例。也就是說(shuō),該Bean被注入到另一個(gè)Bean中,或者您可以通過(guò)容器上的getBean()方法調用來(lái)請求它。通常,應將原型作用域用于所有有狀態(tài)Bean,將單例作用域用于無(wú)狀態(tài)Bean。

              在 Spring 中,那些組成應用程序的主體及由 Spring IOC 容器所管理的對象,被稱(chēng)之為 bean。
              簡(jiǎn)單地講,bean 就是由 IOC 容器初始化、裝配及管理的對象,除此之外,bean 就與應用程序中的其他對象沒(méi)有什么區別了。
              而 bean 的定義以及 bean 相互間的依賴(lài)關(guān)系將通過(guò)配置元數據來(lái)描述。

              Spring中的bean默認都是單例的,這些單例Bean在多線(xiàn)程程序下如何保證線(xiàn)程安全呢?

              例如對于Web應用來(lái)說(shuō),Web容器對于每個(gè)用戶(hù)請求都創(chuàng )建一個(gè)單獨的Sevlet線(xiàn)程來(lái)處理請求,引入Spring框架之后,每個(gè)Action都是單例的,那么對于Spring托管的單例Service Bean,如何保證其安全呢?

              Spring的單例是基于BeanFactory也就是Spring容器的,單例Bean在此容器內只有一個(gè)Java的單例是基于 JVM,每個(gè) JVM 內只有一個(gè)實(shí)例

              二、bean的作用域

              創(chuàng )建一個(gè)bean定義,其實(shí)質(zhì)是用該bean定義對應的類(lèi)來(lái)創(chuàng )建真正實(shí)例的“配方”。
              把bean定義看成一個(gè)配方很有意義,它與class很類(lèi)似,只根據一張“處方”就可以創(chuàng )建多個(gè)實(shí)例。
              不僅可以控制注入到對象中的各種依賴(lài)和配置值,還可以控制該對象的作用域。
              這樣可以靈活選擇所建對象的作用域,而不必在Java Class級定義作用域。

              Spring Framework支持五種作用域,分別闡述如下表。

              五種作用域中,request、sessionglobal session 三種作用域僅在基于web的應用中使用(不必關(guān)心你所采用的是什么web應用框架),只能用在基于 web 的 Spring ApplicationContext 環(huán)境。

              三、singleton —— 唯一 bean 實(shí)例

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

              singleton 是單例類(lèi)型(對應于單例模式),就是在創(chuàng )建起容器時(shí)就同時(shí)自動(dòng)創(chuàng )建了一個(gè)bean的對象,不管你是否使用,但我們可以指定Bean節點(diǎn)的 lazy-init=”true” 來(lái)延遲初始化bean,這時(shí)候,只有在第一次獲取bean時(shí)才會(huì )初始化bean,即第一次請求該bean時(shí)才初始化。

              每次獲取到的對象都是同一個(gè)對象。注意,singleton 作用域是Spring中的缺省作用域。要在XML中將 bean 定義成 singleton ,可以這樣配置:

              <bean id="ServiceImpl" class="cn.csdn.service.ServiceImpl" scope="singleton">

              也可以通過(guò) @Scope 注解(它可以顯示指定bean的作用范圍。)的方式

              @Service
              @Scope("singleton")
              public class ServiceImpl{
              
              }

              四、prototype——每次請求都會(huì )創(chuàng )建一個(gè)新的 bean 實(shí)例

              當一個(gè)bean的作用域為 prototype,表示一個(gè) bean 定義對應多個(gè)對象實(shí)例。

              prototype 作用域的 bean 會(huì )導致在每次對該 bean 請求(將其注入到另一個(gè) bean 中,或者以程序的方式調用容器的 getBean() 方法)時(shí)都會(huì )創(chuàng )建一個(gè)新的 bean 實(shí)例。prototype 是原型類(lèi)型,它在我們創(chuàng )建容器的時(shí)候并沒(méi)有實(shí)例化,而是當我們獲取bean的時(shí)候才會(huì )去創(chuàng )建一個(gè)對象,而且我們每次獲取到的對象都不是同一個(gè)對象。

              對有狀態(tài)的 bean 應該使用 prototype 作用域,而對無(wú)狀態(tài)的 bean 則應該使用 singleton 作用域。

              在 XML 中將 bean 定義成 prototype

              <bean id="account" class="com.foo.DefaultAccount" scope="prototype"/>  
               或者
              <bean id="account" class="com.foo.DefaultAccount" singleton="false"/> 
              

              通過(guò) @Scope 注解的方式實(shí)現就不做演示了。

              五、request——每一次HTTP請求都會(huì )產(chǎn)生一個(gè)新的bean

              該bean僅在當前HTTP request內有效

              request只適用于Web程序,每一次 HTTP 請求都會(huì )產(chǎn)生一個(gè)新的bean,同時(shí)該bean僅在當前HTTP request內有效,當請求結束后,該對象的生命周期即告結束。
              在 XML 中將 bean 定義成 request ,可以這樣配置:

              <bean id="loginAction" class=cn.csdn.LoginAction" scope="request"/>

              六、session——每一次HTTP請求都會(huì )產(chǎn)生一個(gè)新的 bean

              該bean僅在當前 HTTP session 內有效。

              session只適用于Web程序,session 作用域表示該針對每一次 HTTP 請求都會(huì )產(chǎn)生一個(gè)新的 bean,同時(shí)該 bean 僅在當前 HTTP session 內有效.與request作用域一樣,可以根據需要放心的更改所創(chuàng )建實(shí)例的內部狀態(tài),而別的 HTTP session 中根據 userPreferences 創(chuàng )建的實(shí)例,將不會(huì )看到這些特定于某個(gè) HTTP session 的狀態(tài)變化。當HTTP session最終被廢棄的時(shí)候,在該HTTP session作用域內的bean也會(huì )被廢棄掉。

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

              七、globalSession

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

              <bean id="user" class="com.foo.Preferences "scope="globalSession"/>

              Spring框架支持5種作用域,有三種作用域是當開(kāi)發(fā)者使用基于web的ApplicationContext的時(shí)候才生效的

              下面就是Spring內置支持的作用域

              在Spring 3.0中,線(xiàn)程作用域是可用的,但不是默認注冊的

              7.1 singleton

              全局只有一個(gè)共享的實(shí)例,所有將單例Bean作為依賴(lài)的情況下,容器返回將是同一個(gè)實(shí)例

              換言之,當開(kāi)發(fā)者定義一個(gè)Bean的作用域為單例時(shí),Spring IoC容器只會(huì )根據Bean定義來(lái)創(chuàng )建該Bean的唯一實(shí)例。這些唯一的實(shí)例會(huì )緩存到容器中,后續針對單例Bean的請求和引用,都會(huì )從這個(gè)緩存中拿到這個(gè)唯一的實(shí)例

              7.2 單例Bean和單例模式

              • 單例模式是將一個(gè)對象的作用域硬編碼,一個(gè)ClassLoader只有唯一的一個(gè)實(shí)例
              • 而Spring的單例作用域,是基于每個(gè)容器,每個(gè)Bean只有一個(gè)實(shí)例
                這意味著(zhù),如果開(kāi)發(fā)者根據一個(gè)類(lèi)定義了一個(gè)Bean在單個(gè)的Spring容器中,那么Spring容器會(huì )根據Bean定義創(chuàng )建一個(gè)唯一的Bean實(shí)例。默認情況下,它們?yōu)槊總€(gè)給定的org.springframework.context.ApplicationContext實(shí)例存在唯一的一個(gè)bean (有點(diǎn)別扭,也就是可以有多個(gè)Spring容器,每一個(gè)容器內存在唯一bean實(shí)例).這意味著(zhù)如果你有兩個(gè)或更多上下文,所有這些上下文都由同一Java的類(lèi)加載器管理(因為在同一個(gè)jvm環(huán)境中),則可能會(huì )有多個(gè)給定bean的實(shí)例。唯一需要做到的是必須在每個(gè)上下文中定義此bean.

              所以你可以看到,bean只是一個(gè)上下文的單例
              你不應該將Spring的單例概念與設計模式中的的單例混淆

              單例作用域是Spring的默認作用域,下面的例子是在基于XML的配置中配置單例模式的Bean。

              <bean id="accountService" class="com.sss.DefaultAccountService"/>
              
              <!-- the following is equivalent, though redundant (singleton scope is the default) -->
              <bean id="accountService" class="com.sss.DefaultAccountService" scope="singleton"/>
              

              八、prototype

              每次請求Bean實(shí)例時(shí),返回的都是新實(shí)例的Bean對象
              也就是說(shuō),每次注入到另外的Bean或者通過(guò)調用getBean()來(lái)獲得的Bean都將是全新的實(shí)例。
              這是基于線(xiàn)程安全性

              • 有狀態(tài)的Bean對象用prototype作用域
              • 無(wú)狀態(tài)的Bean對象用singleton 作用域

              下面的例子說(shuō)明了Spring的原型作用域。DAO通常不會(huì )配置為原型對象,因為典型的DAO是不會(huì )有任何的狀態(tài)的。

              下面的例子展示了XML中如何定義一個(gè)原型的Bean:

              <bean id="accountService" 
              	class="com.javaedge.DefaultAccountService" scope="prototype"/>

              與其他的作用域相比,Spring不會(huì )完全管理原型Bean的生命周期:
              Spring容器只會(huì )初始化配置以及裝載這些Bean,傳遞給Client。
              但是之后就不會(huì )再去管原型Bean之后的動(dòng)作了。

              也就是說(shuō),初始化生命周期回調方法在所有作用域的Bean是都會(huì )調用的,但是銷(xiāo)毀生命周期回調方法在原型Bean是不會(huì )調用的

              所以,客戶(hù)端代碼必須注意清理原型Bean以及釋放原型Bean所持有的一些資源。
              可以通過(guò)使用自定義的bean post-processor來(lái)讓Spring釋放掉原型Bean所持有的資源。

              在某些方面來(lái)說(shuō),Spring容器的角色就是取代了Java的new操作符,所有的生命周期的控制需要由客戶(hù)端來(lái)處理。

              Singleton beans with prototype-bean dependencies 在原型bean中放置單例

              如果注入的單例對象真的是一個(gè)單例的bean(沒(méi)有狀態(tài)),這個(gè)真的沒(méi)一點(diǎn)問(wèn)題
              想象一下,對于我們的購物車(chē),我們需要注入產(chǎn)品服務(wù)。此服務(wù)只會(huì )檢查添加到購物車(chē)的產(chǎn)品是否庫存。由于服務(wù)沒(méi)有狀態(tài),并且會(huì )基于在方法簽名中所傳遞的對象進(jìn)行驗證,因此不存在風(fēng)險

              當使用單例Bean的時(shí)候,而該單例Bean的依賴(lài)是原型Bean時(shí),需要注意的是依賴(lài)的解析都是在初始化的階段
              因此,如果將原型Bean注入到單例的Bean之中,只會(huì )請求一次原型Bean,然后注入到單例Bean中。這個(gè)依賴(lài)的原型Bean仍然屬于只有一個(gè)實(shí)例的。

              然而,假設你需要單例Bean對原型的Bean的依賴(lài)
              需要每次在運行時(shí)都請求一個(gè)新的實(shí)例,那么你就不能夠將一個(gè)原型的Bean來(lái)注入到一個(gè)單例的Bean當中了,因為依賴(lài)注入只會(huì )進(jìn)行一次
              當Spring容器在實(shí)例化單例Bean的時(shí)候,就會(huì )解析以及注入它所需的依賴(lài)
              如果實(shí)在需要每次都請求一個(gè)新的實(shí)例,可以通過(guò)bean工廠(chǎng)手動(dòng)獲取實(shí)例,也可以參考Dependencies中的方法注入部分。

              ##使用單例還是原型?

              Singleton適用于無(wú)狀態(tài)的bean,比如一個(gè)service,DAO或者controller
              他們都沒(méi)有自己的狀態(tài)(舉個(gè)簡(jiǎn)單的例子,一個(gè)函數sin(x),這個(gè)函數本身就是無(wú)狀態(tài)的,所以我們現在喜歡的函數式編程也遵循這個(gè)理念)。而是根據傳輸的參數執行一些操作(作為HTTP請求參數)。

              另一方面,我們可以通過(guò)狀態(tài)bean管理一些狀態(tài)。比如購物車(chē)bean,假如它是一個(gè)單例,那么兩個(gè)不同消費者購買(mǎi)的產(chǎn)品將被放置在同一個(gè)對象上。而如果其中一個(gè)消費者想要刪除一個(gè)產(chǎn)品,另一個(gè)消費者就鐵定不高興。這也就是狀態(tài)類(lèi)對象應該是原型
              #3. Request
              Spring容器會(huì )在每次用到loginAction來(lái)處理每個(gè)HTTP請求的時(shí)候都會(huì )創(chuàng )建一個(gè)新的LoginAction實(shí)例。也就是說(shuō),loginActionBean的作用域是HTTPRequest級別的。 開(kāi)發(fā)者可以隨意改變實(shí)例的狀態(tài),因為其他通過(guò)loginAction請求來(lái)創(chuàng )建的實(shí)例根本看不到開(kāi)發(fā)者改變的實(shí)例狀態(tài),所有創(chuàng )建的Bean實(shí)例都是根據獨立的請求來(lái)的。當請求處理完畢,這個(gè)Bean也會(huì )銷(xiāo)毀。

              每個(gè)請求初始化具有此作用域的Bean注解。這聽(tīng)起來(lái)像是原型作用域的描述,但它們有一些差異。

              • 原型作用域在Spring的上下文中可用。而請求作用域僅適用于Web應用程序
              • 原型bean根據需求進(jìn)行初始化,而請求bean是在每個(gè)請求下構建的

              需要說(shuō)的是,request作用域bean在其作用域內有且僅有一個(gè)實(shí)例。而你可以擁有一個(gè)或多個(gè)原型作用域bean實(shí)例

              在以下代碼中,你可以看到請求作用域bean的示例:

              <bean id="shoppingCartRequest" class="com.sss.scope.ShoppingCartRequest" scope="request">
                  <aop:scoped-proxy/> 
              </bean>

              當使用注解驅動(dòng)組件或Java Config時(shí),@RequestScope注解可以用于將一個(gè)組件分配給request作用域。

              @RequestScope
              @Component
              public class ShoppingCartRequest {
              	// ...
              }
              // request bean
               
              // injection sample
              @Controller
              public class TestController {
                  @Autowired
                  private ShoppingCartRequest shoppingCartRequest;
                   
                  @RequestMapping(value = "/test", method = RequestMethod.GET)
                  public String test(HttpServletRequest request) {
                      LOGGER.debug("shoppingCartRequest is :"+shoppingCartRequest);
                      // ...
                  }
              }
              

              請注意定義內存在的<aop: scoped-proxy />標簽。這代表著(zhù)使用代理對象。所以實(shí)際上,TestController持有的是代理對象的引用。我們所有的調用該對象都會(huì )轉發(fā)到真正的ShoppingCartRequest對象。

              有時(shí)我們需要使用DispatcherServlet的另一個(gè)servlet來(lái)處理請求。在這種情況下,我們必須確保Spring中所有請求都可用(否則可以?huà)伋雠c下面類(lèi)似的異常)。為此,我們需要在web.xml中定義一個(gè)監聽(tīng)器:

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

              調用/測試URL后,你應該能在日志中的發(fā)現以下信息:

              shoppingCartRequest is :com.migo.scope.ShoppingCartRequest@2586b11c
              shoppingCartRequest is :com.migo.scope.ShoppingCartRequest@3bd5b945

              如果我們嘗試在單例bean中使用request作用域的bean,則會(huì )在應用程序上下文加載階段拋出一個(gè)BeanCreationException
              #4. session
              參考如下的Bean定義:

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

              Spring容器會(huì )在每次調用到userPreferences在一個(gè)單獨的HTTP會(huì )話(huà)周期來(lái)創(chuàng )建一個(gè)新的UserPreferences實(shí)例。換言之,userPreferencesBean的作用域是HTTPSession級別的。 在request-scoped作用域的Bean上,開(kāi)發(fā)者可以隨意的更改實(shí)例的狀態(tài),同樣,其他的HTTPSession基本的實(shí)例在每個(gè)Session都會(huì )請求userPreferences來(lái)創(chuàng )建新的實(shí)例,所以開(kāi)發(fā)者更改Bean的狀態(tài),對于其他的Bean仍然是不可見(jiàn)的。當HTTPSession銷(xiāo)毀了,那么根據這個(gè)Session來(lái)創(chuàng )建的Bean也就銷(xiāo)毀了。

              Session作用域的bean與request 作用域的bean沒(méi)有太大不同。它們也與純Web應用程序上下文相關(guān)聯(lián)。注解為Session作用域的Bean對于每個(gè)用戶(hù)的會(huì )話(huà)僅創(chuàng )建一次。他們在會(huì )話(huà)結束時(shí)被破壞銷(xiāo)毀掉。

              由Session作用域限制的Bean可以被認為是面向Web的單例,因為給定環(huán)境(用戶(hù)會(huì )話(huà))僅存在一個(gè)實(shí)例。但請記住,你無(wú)法在Web應用程序上下文中使用它們(說(shuō)個(gè)好理解點(diǎn)的,就是一個(gè)函數內部自定義變量所在的作用域,函數執行完就銷(xiāo)毀了,沒(méi)有什么逃逸)。

              想知道Session作用域bean在Spring中的操作,我們需要在配置文件中定義一個(gè)bean:

              <bean id="shoppingCartRequest" class="com.migo.scope.ShoppingCartSession" scope="session">
              
                  <aop:scoped-proxy/> 
              
              </bean>

              通過(guò)@Autowired注解,查找這個(gè)bean的方式與request 作用域的bean相同??梢钥吹揭韵陆Y果:
              你可以看到,前5個(gè)打印輸出代表相同的對象。最后一個(gè)是不同的。這是什么意思 ?簡(jiǎn)單來(lái)說(shuō),這代表 著(zhù)一個(gè)新的用戶(hù)使用自動(dòng)注入的Session作用域訪(fǎng)問(wèn)該頁(yè)面。我們可以通過(guò)打開(kāi)兩個(gè)瀏覽器的測試頁(yè)(/test)來(lái)觀(guān)察它。每個(gè)都將初始化一個(gè)新的會(huì )話(huà)Session,因此也就創(chuàng )建新的ShoppingCartSession bean實(shí)例。
              #5. global session

              該部分主要是描述portlet的,詳情可以Google更多關(guān)于portlet的相關(guān)信息。

              參考如下的Bean定義:

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

              global session作用域比較類(lèi)似之前提到的標準的HTTPSession,這種作用域是只應用于基于門(mén)戶(hù)(portlet-based)的web應用的上下之中的。門(mén)戶(hù)的Spec中定義的global session的意義:global session被所有構成門(mén)戶(hù)的web應用所共享。定義為global session作用域的Bean是作用在全局門(mén)戶(hù)Session的聲明周期的。

              如果在使用標準的基于Servlet的Web應用,而且定義了global session作用域的Bean,那么只是會(huì )使用標準的HTTPSession作用域,不會(huì )報錯。

              關(guān)于全局會(huì )話(huà)作用域(Global session scope)屬于4.3x的范疇了,Spring5已經(jīng)沒(méi)有了,Spring5文檔是去掉了因為4的存在所以還是說(shuō)兩句,它保留給portlet應用程序。 是不是一臉懵逼,so,來(lái)解釋一下portlet是什么。Portlet是能夠生成語(yǔ)義代碼(例如:HTML)片段的小型Java Web插件。它們基于portlet容器,可以像servlet一樣處理HTTP請求。但是,與servlet不同,每個(gè)portlet都有不同的會(huì )話(huà)。在這種情況下,Spring提供了一個(gè)名為global-session的作用域。通過(guò)它,一個(gè)bean可以通過(guò)應用程序中的多個(gè)portlet共享。

              至此,我們解釋了請求和面向會(huì )話(huà)的作用域。第一個(gè)的作用是在每個(gè)request請求上創(chuàng )建新的bean。第二個(gè)在Session會(huì )話(huà)開(kāi)始的時(shí)候初始化bean。

              到此這篇關(guān)于最全總結SpringBean的作用域管理的文章就介紹到這了,更多相關(guān)SpringBean的作用域管理內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

              免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系QQ:712375056 進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。

              sp
              亚洲AV无码一区二区三区DV| 国产女人乱子对白AV片| 国产精品久久久久久久免费看| 欧美亚洲日本国产黑白配| 第一亚洲中文久久精品无码| 亚洲 欧美精品SUV|