久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Spring - Java/J2EE Application Framework 应用框架 第 3 章 Beans, BeanFactory和ApplicationContext

發布時間:2025/3/21 java 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring - Java/J2EE Application Framework 应用框架 第 3 章 Beans, BeanFactory和ApplicationContext 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

第?3?章?Beans, BeanFactory和ApplicationContext

3.1.?簡介

在Spring中,兩個最基本最重要的包是?org.springframework.beans?和?org.springframework.context. 這兩個包中的代碼為Spring的反向控制?特性(也叫作依賴注射)提供了基礎。?BeanFactory提供了一種先進的配置機制來管理任何種類bean(對象),這種配置機制考慮到任何一種可能的存儲方式。?ApplicationContext建立在BeanFactory之上,并增加了其他的功能,比如更容易同Spring AOP特性整合, 消息資源處理(用于國際化),事件傳遞,以聲明的方式創建ApplicationContext, 可選的父上下文和與應用層相關的上下文(比如WebApplicationContext),以及其他方面的增強。

簡而言之,BeanFactory提供了配置框架和基本的功能, 而?ApplicationContext為它增加了更強的功能,這些功能中的一些或許更加接近J2EE并且圍繞企業級應用。一般來說,ApplicationContext是BeanFactory的完全超集, 任何BeanFactory功能和行為的描述也同樣被認為適用于ApplicationContext

用戶有時不能確定BeanFactory和ApplicationContext中哪一個在特定場合下更適合。 通常大部分在J2EE環境的應用中,最好選擇使用ApplicationContext, 因為它不僅提供了BeanFactory所有的特性以及它自己附加的特性,而且還提供以聲明的方式使用一些功能, 這通常是令人滿意的。BeanFactory主要是在非常關注內存使用的情況下 (比如在一個每kb都要計算的applet中)使用,而且你也不需要用到ApplicationContext的所有特性。

這一章粗略地分為兩部分,第一部分包括對BeanFactory和ApplicationContext都適用的一些基本原則。第二部分包括僅僅適用于ApplicationContext的一些特性

3.2.?BeanFactory 和 BeanDefinitions - 基礎

3.2.1.?BeanFactory

BeanFactory實際上是實例化,配置和管理眾多bean的容器。 這些bean通常會彼此合作,因而它們之間會產生依賴。 BeanFactory使用的配置數據可以反映這些依賴關系中 (一些依賴可能不像配置數據一樣可見,而是在運行期作為bean之間程序交互的函數)。

一個BeanFactory可以用接口org.springframework.beans.factory.BeanFactory表示, 這個接口有多個實現。 最常使用的的簡單的eanFactory實現是org.springframework.beans.factory.xml.XmlBeanFactory。 (這里提醒一下:ApplicationContext是BeanFactory的子類, 所以大多數的用戶更喜歡使用ApplicationContext的XML形式)。

雖然大多數情況下,幾乎所有被BeanFactory管理的用戶代碼都不需要知道BeanFactory, 但是BeanFactory還是以某種方式實例化。可以使用下面的代碼實例化BeanFactory:

InputStream is = new FileInputStream("beans.xml"); XmlBeanFactory factory = new XmlBeanFactory(is);

或者

ClassPathResource res = new ClassPathResource("beans.xml"); XmlBeanFactory factory = new XmlBeanFactory(res);

或者

ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext(new String[] {"applicationContext.xml", "applicationContext-part2.xml"}); // of course, an ApplicationContext is just a BeanFactory BeanFactory factory = (BeanFactory) appContext;

很多情況下,用戶代碼不需要實例化BeanFactory, 因為Spring框架代碼會做這件事。例如,web層提供支持代碼,在J2EE web應用啟動過程中自動載入一個Spring ApplicationContext。這個聲明過程在這里描述:

編程操作BeanFactory將會在后面提到,下面部分將集中描述BeanFactory的配置.

一個最基本的BeanFactory配置由一個或多個它所管理的Bean定義組成。在一個XmlBeanFactory中,根節點beans中包含一個或多個bean元素。

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"><beans><bean id="..." class="...">...</bean><bean id="..." class="...">...</bean>...</beans>

3.2.2.?BeanDefinition

一個XmlBeanFactory中的Bean定義包括的內容有:

  • classname:這通常是bean的真正的實現類。但是如果一個bean使用一個靜態工廠方法所創建而不是被普通的構造函數創建,那么這實際上就是工廠類的classname

  • bean行為配置元素:它聲明這個bean在容器的行為方式(比如prototype或singleton,自動裝配模式,依賴檢查模式,初始化和析構方法)

  • 構造函數的參數和新創建bean需要的屬性:舉一個例子,一個管理連接池的bean使用的連接數目(即可以指定為一個屬性,也可以作為一個構造函數參數),或者池的大小限制

  • 和這個bean工作相關的其他bean:比如它的合作者(同樣可以作為屬性或者構造函數的參數)。這個也被叫做依賴。

上面列出的概念直接轉化為組成bean定義的一組元素。這些元素在下面的表格中列出,它們每一個都有更詳細的說明的鏈接。

表?3.1.?Bean定義的解釋

特性詳細說明
class第?3.2.3?節 “bean的類”
id和name第?3.2.4?節 “Bean的標志符 (id與name)”
singleton或prototype第?3.2.5?節 “Singleton的使用與否”
構造函數參數第?3.3.1?節 “設置bean的屬性和合作者”
bean的屬性第?3.3.1?節 “設置bean的屬性和合作者”
自動裝配模式第?3.3.5?節 “自動裝配協作對象”
依賴檢查模式第?3.3.6?節 “依賴檢查”
初始化模式第?3.4.1?節 “生命周期接口”
析構方法第?3.4.1?節 “生命周期接口”

注意bean定義可以表示為真正的接口org.springframework.beans.factory.config.BeanDefinition以及它的各種子接口和實現。然而,絕大多數的用戶代碼不需要與BeanDefination直接接觸。

3.2.3.?bean的類

class屬性通常是強制性的(參考第?3.2.3.3?節 “通過實例工廠方法創建bean”和第?3.5?節 “子bean定義”),有兩種用法。在絕大多數情況下,BeanFactory直接調用bean的構造函數來"new"一個bean(相當于調用new的Java代碼),class屬性指定了需要創建的bean的類。 在比較少的情況下,BeanFactory調用某個類的靜態的工廠方法來創建bean, class屬性指定了實際包含靜態工廠方法的那個類。 (至于靜態工廠方法返回的bean的類型是同一個類還是完全不同的另一個類,這并不重要)。

3.2.3.1.?通過構造函數創建bean

當使用構造函數創建bean時,所有普通的類都可以被Spring使用并且和Spring兼容。 這就是說,被創建的類不需要實現任何特定的接口或者按照特定的樣式進行編寫。僅僅指定bean的類就足夠了。 然而,根據bean使用的IoC類型,你可能需要一個默認的(空的)構造函數。

另外,BeanFactory并不局限于管理真正的JavaBean,它也能管理任何你想讓它管理的類。 雖然很多使用Spring的人喜歡在BeanFactory中用真正的JavaBean (僅包含一個默認的(無參數的)構造函數,在屬性后面定義相對應的setter和getter方法),但是在你的BeanFactory中也可以使用特殊的非bean樣式的類。 舉例來說,如果你需要使用一個遺留下來的完全沒有遵守JavaBean規范的連接池, 不要擔心,Spring同樣能夠管理它。

使用XmlBeanFactory你可以像下面這樣定義你的bean class:

<bean id="exampleBean"class="examples.ExampleBean"/> <bean name="anotherExample"class="examples.ExampleBeanTwo"/>

至于為構造函數提供(可選的)參數,以及對象實例創建后設置實例屬性,將會在后面敘述

3.2.3.2.?通過靜態工廠方法創建Bean

當你定義一個使用靜態工廠方法創建的bean,同時使用class屬性指定包含靜態工廠方法的類,這個時候需要factory-method屬性來指定工廠方法名。Spring調用這個方法(包含一組可選的參數)并返回一個有效的對象,之后這個對象就完全和構造方法創建的對象一樣。用戶可以使用這樣的bean定義在遺留代碼中調用靜態工廠。

下面是一個bean定義的例子,聲明這個bean要通過factory-method指定的方法創建。注意這個bean定義并沒有指定返回對象的類型,只指定包含工廠方法的類。在這個例子中,createInstance?必須是static方法 .

<bean id="exampleBean"class="examples.ExampleBean2"factory-method="createInstance"/>

至于為工廠方法提供(可選的)參數,以及對象實例被工廠方法創建后設置實例屬性,將會在后面敘述.

3.2.3.3.?通過實例工廠方法創建bean

使用一個實例工廠方法(非靜態的)創建bean和使用靜態工廠方法非常類似,調用一個已存在的bean(這個bean應該是工廠類型)的工廠方法來創建新的bean。

使用這種機制,class屬性必須為空,而且factory-bean屬性必須指定一個bean的名字,這個bean一定要在當前的bean工廠或者父bean工廠中,并包含工廠方法。 而工廠方法本身仍然要通過factory-method屬性設置。

下面是一個例子:

<!-- The factory bean, which contains a method calledcreateInstance --> <bean id="myFactoryBean"class="...">... </bean> <!-- The bean to be created via the factory bean --> <bean id="exampleBean"factory-bean="myFactoryBean"factory-method="createInstance"/>

雖然我們要在后面討論設置bean的屬性,但是這個方法意味著工廠bean本身能夠被容器通過依賴注射來管理和配置

3.2.4.?Bean的標志符 (id與name)

每一個bean都有一個或多個id(也叫作標志符,或名字;這些名詞說的是一回事)。這些id在管理bean的BeanFactory或ApplicationContext中必須是唯一的。 一個bean差不多總是只有一個id,但是如果一個bean有超過一個的id,那么另外的那些本質上可以認為是別名。

在一個XmlBeanFactory中(包括ApplicationContext的形式), 你可以用id或者name屬性來指定bean的id(s),并且在這兩個或其中一個屬性中至少指定一個id。 id屬性允許你指定一個id,并且它在XML DTD(定義文檔)中作為一個真正的XML元素的ID屬性被標記, 所以XML解析器能夠在其他元素指回向它的時候做一些額外的校驗。正因如此,用id屬性指定bean的id是一個比較好的方式。 然而,XML規范嚴格限定了在XML ID中合法的字符。通常這并不是真正限制你, 但是如果你有必要使用這些字符(在ID中的非法字符),或者你想給bean增加其他的別名, 那么你可以通過name屬性指定一個或多個id(用逗號,或者分號;分隔)。

3.2.5.?Singleton的使用與否

Beans被定義為兩種部署模式中的一種:singleton或non-singleton。 (后一種也別叫作prototype,盡管這個名詞用的不精確因為它并不是非常適合)。 如果一個bean是singleton形態的,那么就只有一個共享的實例存在, 所有和這個bean定義的id符合的bean請求都會返回這個唯一的、特定的實例。

如果bean以non-singleton,prototype模式部署的話,對這個bean的每次請求都會創建一個新的bean實例。這對于例如每個user需要一個獨立的user對象這樣的情況是非常理想的。

Beans默認被部署為singleton模式,除非你指定。要記住把部署模式變為non-singletion(prototype)后,每一次對這個bean的請求都會導致一個新創建的bean,而這可能并不是你真正想要的。所以僅僅在絕對需要的時候才把模式改成prototype。

在下面這個例子中,兩個bean一個被定義為singleton,而另一個被定義為non-singleton(prototype)。客戶端每次向BeanFactory請求都會創建新的exampleBean,而AnotherExample僅僅被創建一次;在每次對它請求都會返回這個實例的引用。

<bean id="exampleBean"class="examples.ExampleBean" singleton="false"/> <bean name="yetAnotherExample"class="examples.ExampleBeanTwo" singleton="true"/>

注意:當部署一個bean為prototype模式,這個bean的生命周期就會有稍許改變。 通過定義,Spring無法管理一個non-singleton/prototype bean的整個生命周期, 因為當它創建之后,它被交給客戶端而且容器根本不再跟蹤它了。當說起non-singleton/prototype bean的時候, 你可以把Spring的角色想象成“new”操作符的替代品。從那之后的任何生命周期方面的事情都由客戶端來處理 。BeanFactory中bean的生命周期將會在?第?3.4.1?節 “生命周期接口”一節中有更詳細的敘述。

3.3.?屬性,合作者,自動裝配和依賴檢查

3.3.1.?設置bean的屬性和合作者

反向控制通常與依賴注入同時提及。基本的規則是bean通過以下方式來定義它們的依賴(比如它們與之合作的其他對象):構造函數的參數,工廠方法的參數; 當對象實例被構造出來或從一個工廠方法返回后設置在這個實例上的屬性。容器的工作就是創建完bean之后,真正地注入這些依賴。這完全是和一般控制方式相反的(因此稱為反向控制),比如bean實例化,或者直接使用構造函數定位依賴關系,或者類似Service Locator模式的東西。我們不會詳細闡述依賴注射的優點,很顯然通過使用它:代碼變得非常清晰;當bean不再自己查找他們依賴的類而是由容器提供,甚至不需要知道這些類在哪里以及它們實際上是什么類型,這時高層次的解耦也變得很容易了。

正如上面提到的那樣,反向控制/依賴注射存在兩種主要的形式:

  • 基于setter的依賴注射,是在調用無參的構造函數或無參的靜態工廠方法實例化你的bean之后, 通過調用你的bean上的setter方法實現的。 在BeanFactory中定義的使用基于setter方法的注射依賴的bean是真正的JavaBean。 Spring一般提倡使用基于setter方法的依賴注射,因為很多的構造函數參數將會是笨重的, 尤其在有些屬性是可選的情況下。

  • 基于構造函數的依賴注射,它是通過調用帶有許多參數的構造方法實現的, 每個參數表示一個合作者或者屬性。 另外,調用帶有特定參數的靜態工廠方法來構造bean可以被認為差不多等同的, 接下來的文字會把構造函數的參數看成和靜態工廠方法的參數類似。 雖然Spring一般提倡在大多數情況下使用基于setter的依賴注射, 但是Spring還是完全支持基于構造函數的依賴注射, 因為你可能想要在那些只提供多參數構造函數并且沒有setter方法的遺留的bean上使用Spring。 另外對于一些比較簡單的bean,一些人更喜歡使用構造函數方法以確保bean不會處于錯誤的狀態。

BeanFactory同時支持這兩種方式將依賴注射到被管理bean中。(實際上它還支持在一些依賴已經通過構造函數方法注射后再使用setter方法注射依賴)。依賴的配置是以BeanDefinition的形式出現,它和JavaBeans的PropertyEditors一起使用從而知道如何把屬性從一個格式轉變為另一個。真正傳送的值被封裝為PropertyValue對象。然而,大多數Spring的使用者并不要直接(比如編程的方式)處理這些類,而更多地使用一個XML定義文件,這個文件會在內部被轉變為這些類的實例,用來讀取整個BeanFactory或ApplicationContext。

Bean依賴的決定通常取決于下面這些內容:

  • BeanFactory通過使用一個描述所有bean的配置被創建和實例化。大多數的Spring用戶使用一個支持XML格式配置文件的BeanFactory或ApplicationContext實現。

  • 每一個bean的依賴表現為屬性,構造函數參數,或者當用靜態工廠方法代替普通構造函數時工廠方法的參數。這些依賴將會在bean真正被創建出來后提供給bean。

  • 每一個屬性或者構造函數參數要么是一個要被設置的值的定義,要么是一個指向BeanFactory中其他bean的引用。在ApplicationContext的情況下,這個引用可以指向一個父親ApplicationContext中bean。

  • 每一個屬性或構造函數參數的值,必須能夠從(配置文件中)被指定的格式轉變為真實類型。缺省情況下,Spring能夠把一個字符串格式的值轉變為所有內建的類型,比如int,?long,String,?boolean等等。另外當說到基于XML的BeanFactory實現的時候(包括ApplicationContext實現),它們已經為定義Lists, Maps, Sets和Properties集合類型提供了內在的支持。另外,Spring通過使用JavaBeans的?PropertyEditor定義,能夠將字符串值轉變為其他任意的類型。(你可以為PropertyEditor提供你自己的PropertyEditor定義從而能夠轉變你自定義的類型;更多關于PropertyEditors的信息以及如何手工增加自定義的PropertyEditors請參看第?3.9?節 “注冊附加的定制PropertyEditor”)。當一個bean屬性是一個Java Class類型,Spring允許你用這個類的名字的字符串作為這個屬性的值,ClassEditor?這個內建的PropertyEditor會幫你把類的名字轉變成真實的Class實例。

  • 很重要的一點就是:Spring在BeanFactory創建的時候要校驗BeanFactory中每一個Bean的配置。這些校驗包括作為Bean引用的屬性必須實際引用一個合法的bean(比如被引用的bean也定義在BeanFactory中,或者當ApplicationContext時,在父親ApplicationContext中)。但是,bean屬性本身直到bean被真實建立的的時候才被設置。對于那些是singleton并且被設置為pre-instantiated的bean來說(比如一個ApplicationContext中的singletonbean),bean在創建BeanFactory的時候創建,但是對于其他情況,發生在bean被請求的時候。當一個bean必須被創建時,它會潛在地導致一系列的其他bean被創建,像它的依賴以及它的依賴的依賴(如此下去)被創建和賦值。

  • 通常你可以信任Spring做了正確的事情。它會在BeanFactory裝載的時候檢查出錯誤,包括對不存在bean的引用和循環引用。它會盡可能晚地設置屬性和解決依賴(比如創建那些需要的依賴),也就是在bean真正被創建的時候。這就意味著:就算一個BeanFactory被正確地裝載,稍后當你請求一個bean的時候,如果創建那個bean或者它的依賴的時候出現了錯誤,這個BeanFactory也會拋出一個異常。比如,如果一個bean拋出一個異常作為缺少或非法屬性的結果,這樣的情況就會發生。這種潛在地推遲一些配置錯誤可見性的行為正是ApplicationContext默認預實例化singleton bean的原因。以前期的時間和內存為代價在beans真正需要之前創建它們,你就可以在ApplicationContext創建的時候找出配置錯誤,而不是在后來。如果你愿意,你也可以覆蓋這種默認的行為,設置這些singleton bean為lazy-load(不是預實例化的)。

  • 幾個例子:

    首先,一個使用BeanFactory以及基于setter方法的依賴注射。下面是一個定義了一些bean的XmlBeanFactory?配置文件的一小部分。接下去是正式的bean的代碼,演示了正確的setter方法聲明。

    <bean id="exampleBean" class="examples.ExampleBean"><property name="beanOne"><ref bean="anotherExampleBean"/></property><property name="beanTwo"><ref bean="yetAnotherBean"/></property><property name="integerProperty"><value>1</value></property> </bean><bean id="anotherExampleBean" class="examples.AnotherBean"/> <bean id="yetAnotherBean" class="examples.YetAnotherBean"/>

    public class ExampleBean {private AnotherBean beanOne;private YetAnotherBean beanTwo;private int i;public void setBeanOne(AnotherBean beanOne) {this.beanOne = beanOne;}public void setBeanTwo(YetAnotherBean beanTwo) {this.beanTwo = beanTwo;}public void setIntegerProperty(int i) {this.i = i;} }

    正如你所看到的一樣,setter方法被聲明以符合XML文件中指定的屬性。(XML文件中的屬性,直接對應著RootBeanDefinition中的PropertyValues對象)

    接著是一個使用IoC type3(基于構造函數的依賴注射)的BeanFactory。下面是XML配置中的一段,指定了構造函數參數以及展示構造函數的代碼:

    <bean id="exampleBean" class="examples.ExampleBean"><constructor-arg><ref bean="anotherExampleBean"/></constructor-arg><constructor-arg><ref bean="yetAnotherBean"/></constructor-arg><constructor-arg><value>1</value></constructor-arg> </bean><bean id="anotherExampleBean" class="examples.AnotherBean"/> <bean id="yetAnotherBean" class="examples.YetAnotherBean"/>

    public class ExampleBean {private AnotherBean beanOne;private YetAnotherBean beanTwo;private int i;public ExampleBean(AnotherBean anotherBean, YetAnotherBean yetAnotherBean, int i) {this.beanOne = anotherBean;this.beanTwo = yetAnotherBean;this.i = i;} }

    正如你所看到的,bean定義中指定的構造函數參數將會作為ExampleBean的構造函數參數被傳入。

    現在考慮一下不用構造函數,而是調用一個靜態工廠方法來返回一個對象的實例:

    <bean id="exampleBean" class="examples.ExampleBean"factory-method="createInstance"><constructor-arg><ref bean="anotherExampleBean"/></constructor-arg><constructor-arg><ref bean="yetAnotherBean"/></constructor-arg><constructor-arg><value>1</value></constructor-arg> </bean><bean id="anotherExampleBean" class="examples.AnotherBean"/> <bean id="yetAnotherBean" class="examples.YetAnotherBean"/>

    public class ExampleBean {...// a private constructorprivate ExampleBean(...) {...}// a static factory method// the arguments to this method can be considered the dependencies of the bean that// is returned, regardless of how those arguments are actually used.public static ExampleBean ExampleBean(AnotherBean anotherBean,YetAnotherBean yetAnotherBean, int i) {ExampleBean eb = new ExampleBean(...);// some other operations...return eb;} }

    需要注意的是:靜態工廠方法的參數由?constructor-arg元素提供,這和構造函數的用法是一樣的。這些參數是可選的。重要的一點是工廠方法所返回的對象類型不一定和包含這個靜態工廠方法的類一致,雖然上面這個例子中是一樣的。前面所提到的實例工廠方法(non-static)用法基本上是一樣的(除了使用factory-bean屬性代替class屬性),在這里就不再詳細敘述了。 .

    3.3.2.?深入Bean屬性和構造函數參數

    正如前面提到的那樣,bean的屬性和構造函數參數可以被定義為其他bean的引用(合作者),或者內聯定義的值。為了達到這個目的,XmlBeanFactory在property和constructor-arg元素中支持許多子元素類型。

    value元素用適合人讀的字符串形式指定屬性或構造函數參數。正如前面提到的那樣,JavaBeans的PropertyEditors被用來將這些字符串從java.lang.String類型轉變為真實的屬性類型或參數類型。

    <beans><bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"><!-- results in a setDriverClassName(String) call --><property name="driverClassName"><value>com.mysql.jdbc.Driver</value></property><property name="url"><value>jdbc:mysql://localhost:3306/mydb</value></property><property name="username"><value>root</value></property></bean> </beans>

    null元素被用來處理null值。Spring將porperties等的空參數視為空的字符串。下面這個XmlBeanFactory配置:

    <bean class="ExampleBean"><property name="email"><value></value></property> </bean>

    導致email屬性被設置為””,同java代碼:exampleBean.setEmail("")等價。 而專門的<null>元素則可以用來指定一個null值,所以

    <bean class="ExampleBean"><property name="email"><null/></property> </bean>

    同代碼:exampleBean.setEmail(null)是等價的.

    list,?set,?map, 以及?props?元素可以用來定義和設置類型 為Java的List,Set,?Map, 和?Properties?.

    <beans>...<bean id="moreComplexObject" class="example.ComplexObject"><!-- results in a setPeople(java.util.Properties) call --><property name="people"><props><prop key="HarryPotter">The magic property</prop><prop key="JerrySeinfeld">The funny property</prop></props></property><!-- results in a setSomeList(java.util.List) call --><property name="someList"><list><value>a list element followed by a reference</value><ref bean="myDataSource"/></list></property><!-- results in a setSomeMap(java.util.Map) call --><property name="someMap"><map><entry key="yup an entry"><value>just some string</value></entry><entry key="yup a ref"><ref bean="myDataSource"/></entry></map></property><!-- results in a setSomeSet(java.util.Set) call --><property name="someSet"><set><value>just some string</value><ref bean="myDataSource"/></set></property></bean> </beans>

    注意:Map的entry或set的value,它們的值又可以是下面元素中的任何一個:

    (bean | ref | idref | list | set | map | props | value | null)

    在property?元素中定義的bean元素用來定義一個內聯的bean,而不是引用BeanFactory其他地方定義的bean。內聯bean定義不需要任何id定義

    <bean id="outer" class="..."><!-- Instead of using a reference to target, just use an inner bean --><property name="target"><bean class="com.mycompany.PersonImpl"><property name="name"><value>Tony</value></property><property name="age"><value>51</value></property></bean></property> </bean>

    idref元素完全是一種簡寫和防止錯誤的方式,用來設置屬性值為容器中其他bean的id?或name

    <bean id="theTargetBean" class="..."> </bean> <bean id="theClientBean" class="..."><property name="targetName"><idref bean="theTargetBean"/></property> </bean>

    這個在運行時同下面的片段等價:

    <bean id="theTargetBean" class="..."> </bean> <bean id="theClientBean" class="..."><property name="targetName"><value>theTargetBean</value></property> </bean>

    第一種形式比第二種形式更好的原因是:使用idref標記將會使Spring在部署的時候就驗證其他的bean是否真正存在; 在第二種形式中,targetName屬性的類僅僅在Spring實例化這個類的時候做它自己的驗證,這很可能在容器真正部署完很久之后。

    另外,如果被引用的bean在同一個xml文件中而且bean的名稱是bean的?id,那么就可以使用local屬性。它會讓XML解析器更早,在XML文檔解析的時候,驗證bean的名稱。

    <property name="targetName"><idref local="theTargetBean"/></property>

    ref元素是最后一個能在property元素中使用的元素。它是用來設置屬性值引用容器管理的其他bean(可以叫做合作者)。正如前一節提到的,擁有這些屬性的bean依賴被引用的bean,被引用的bean將會在屬性設置前,必要的時候需要時初始化(如果是一個singleton bean可能已經被容器初始化)。所有的引用根本上是一個指向其他對象的引用,不過有3種形式指定被引用對象的id/name,這3種不同形式決定作用域和如何處理驗證。

    用ref元素的bean屬性指定目標bean是最常見的形式,它允許指向的bean可以在同一個BeanFactory/ApplicationContext(無論是否在同一個XML文件中)中,也可以在父BeanFactory/ApplicationContext中。bean屬性的值可以同目標bean的id屬性相同,也可以同目標bean的name屬性中任何一個值相同。

    <ref bean="someBean"/>

    用local屬性指定目標bean可以利用XML解析器的能力在同一個文件中驗證XML id引用。local屬性的值必須與目標bean的id屬性一致。如果在同一個文件中沒有匹配的元素,XML解析器將會產生一個錯誤。因此,如果目標bean在同一個XML文件中,那么使用local形式將是最好的選擇(為了能夠盡可能早的發現錯誤)。

    <ref local="someBean"/>

    用parent屬性指定目標bean允許引用當前BeanFactory(ApplicationContext)的父BeanFactory(ApplicationContext)中的bean。parent屬性的值可以同目標bean的id屬性相同,也可以同目標bean的name屬性中的一個值相同,而且目標bean必須在當前BeanFactory(ApplicationContext)的父BeanFactory(ApplicationContext)中。當需要用某種proxy包裝一個父上下文中存在的bean(可能和父上下文中的有同樣的name),所以需要原始的對象用來包裝它。

    <ref parent="someBean"/>

    3.3.3.?方法注入

    對于大部分的用戶來說,容器中多數的bean是singleton的。當一個singleton的bean需要同另一個singleton的 bean合作(使用)時,或者一個非singleton的bean需要同另一個非singleton的bean合作的時候,通過定義一個bean為另一個bean的屬性來處理這種依賴的關系就足夠了。然而當bean的生命周期不同的時候就有一個問題。想想一下一個singleton bean A, 或許在每次方法調用的時候都需要使用一個non-singleton bean B。容器僅僅會創建這個singleton bean A一次,因此僅僅有一次的機會去設置它的屬性。因此容器沒有機會每次去為bean A提供新的bean B的實例。

    一個解決這個問題的方法是放棄一些反向控制。Bean A可以通過實現?BeanFactoryAware知道容器的存在(參見這里)),使用編程的手段(參見這里)在需要的時候通過調用getBean("B")來向容器請求新的bean B實例。 因為bean的代碼知道Spring并且耦合于Spring,所以這通常不是一個好的方案。

    方法注入,BeanFactory的高級特性之一,可以以清潔的方式處理這種情況以及其他一些情況。

    3.3.3.1.?Lookup方法注入

    Lookup方法注射指容器能夠重寫容器中bean的抽象或具體方法,返回查找容器中其他bean的結果。 被查找的bean在上面描述的場景中通常是一個non-singleton bean (盡管也可以是一個singleton的)。Spring通過使用CGLIB庫在客戶端的類之上修改二進制碼, 從而實現上述的場景要求。

    包含方法注入的客戶端類,必須按下面的形式的抽象(具體)定義方法:

    protected abstract SingleShotHelper createSingleShotHelper();

    如果方法不是抽象的,Spring就會直接重寫已有的實現。在XmlBeanFactory的情況下,你可以使用bean定義中的lookup-method?屬性來指示Spring去注入/重寫這個方法,以便從容器返回一個特定的bean。舉個例子說明:

    <!-- a stateful bean deployed as a protype (non-singleton) --> <bean id="singleShotHelper class="..." singleton="false"> </bean><!-- myBean uses singleShotHelper --> <bean id="myBean" class="..."><lookup-method name="createSingleShotHelper"bean="singleShotHelper"/><property>...</property> </bean>

    myBean需要一個新的singleShotHelper的實例的時候, 它就會調用它自己的createSingleShotHelper?方法。 值得注意的是:部署beans的人員必須小心地將singleShotHelper作為一個non-singleton部署 (如果確實需要這么做)。如果它作為一個singleton(除非明確說明,否則缺省就是singletion)而部署, 同一個singleShotHelper實例將會每次被返回。

    注意Lookup方法注射能夠同構造函數注射結合(對創建的bean提供可選的構造函數參數), 也可以同setter方法注射結合(在創建的bean之上設置屬性)。

    3.3.3.2.?任意方法的替換

    另一種方法注射沒有lookup方法注入用的多,它用另一個方法實現替換被管理bean的任意一個方法。用戶可以放心跳過這一節(這是個有點高級的特性),除非這個功能確實需要。

    在一個XmlBeanFactory中,對于一個被部署的bean,?replaced-method元素可以用來把已存在的方法實現替換為其他的實現。 考慮如下的類,有一個我們想要重寫的computeValue方法:

    ... public class MyValueCalculator {public String computeValue(String input) {... some real code}... some other methods }

    需要為新方法定義提供實現?org.springframework.beans.factory.support.MethodReplacer接口的類。

    /** meant to be used to override the existing computeValueimplementation in MyValueCalculator */ public class ReplacementComputeValue implements MethodReplacer {public Object reimplement(Object o, Method m, Object[] args) throws Throwable {// get the input value, work with it, and return a computed resultString input = (String) args[0];... return ...; }

    部署原始的類和指定方法重寫的BeanFactory部署定義象下面所示的 :

    <bean id="myValueCalculator class="x.y.z.MyValueCalculator"><!-- arbitrary method replacement --><replaced-method name="computeValue" replacer="replacementComputeValue"><arg-type>String</arg-type></replaced-method> </bean><bean id="replacementComputeValue" class="a.b.c.ReplaceMentComputeValue"> </bean>

    replaced-method元素中的一個或多個arg-type?元素用來表示, 這個被重載方法的方法簽名。 注意,參數的簽名只有在方法被重載并且該方法有多個不同的形式的時候才真正需要。 為了方便,參數的類型字符串可以使全限定名的子字符串。比如,以下的都匹配java.lang.String

    java.lang.StringStringStr

    因為參數的個數通常就足夠區別不同的可能,所以僅僅使用匹配參數的最短的字符串能夠節省很多鍵入工作。

    3.3.4.?使用?depends-on

    對于大多數的情況,一個bean被另一個bean依賴,是由這個bean是否被當作其他bean的屬性來表達的。 在XmlBeanFactory中,它是通過ref元素來完成的。 與這種方式不同的是,有時一個知道容器的bean僅僅會被給與它所的依賴的id (使用一個字符串值或等價的idref元素)。接著第一個bean就以編程的方式地向容器請求它的依賴。 在兩種情況下,被依賴的bean都會在依賴它的bean之前被恰當地初始化。

    對于相對罕見的情況,beans之間的依賴不夠直接(舉例,當一個類中的靜態初始塊需要被觸發,比如數據庫驅動的注冊) ,depends-on?元素可以用來在初始化使用這個元素的bean之前,強制一個或多個beans初始化。

    下面是一個配置的例子:

    <bean id="beanOne" class="ExampleBean" depends-on="manager"><property name="manager"><ref local="manager"/></property> </bean><bean id="manager" class="ManagerBean"/>

    3.3.5.?自動裝配協作對象

    BeanFactory能夠自動裝配合作bean之間的關系。這就意味著,讓Spring通過檢查BeanFactory的內容來自動裝配你的bean的合作者(也就是其他的bean)。自動裝配功能有5種模式。自動裝配可以指定給每一個bean,因此可以給一些bean使用而其他的bean不自動裝配。通過使用自動裝配,可以 減少(或消除)指定屬性(或構造函數參數)的需要,顯著節省鍵入工作。?[1]?在XmlBeanFactory中,使用bean元素的autowire屬性來指定bean定義的自動裝配模式。以下是允許的值.

    表?3.2.?自動裝配模式

    模式解釋
    no不使用自動裝配。Bean的引用必須通過ref元素定義。這是默認的配置,在較大的部署環境中不鼓勵改變這個配置,因為明確的指定合作者能夠得到更多的控制和清晰性。從某種程度上說,這也是系統結構的文檔形式。
    byName通過屬性名字進行自動裝配。這個選項會會檢查BeanFactory,查找一個與將要裝配的屬性同樣名字的bean 。比如,你有一個bean的定義被設置為通過名字自動裝配,它包含一個master屬性(也就是說,它有一個setMaster(...)方法),Spring就會查找一個叫做master的bean定義,然后用它來設置master屬性。
    byType如果BeanFactory中正好有一個同屬性類型一樣的bean,就自動裝配這個屬性。如果有多于一個這樣的bean,就拋出一個致命異常,它指出你可能不能對那個bean使用byType的自動裝配。如果沒有匹配的bean,則什么都不會發生,屬性不會被設置。如果這是你不想要的情況(什么都不發生),通過設置dependency-check="objects"屬性值來指定在這種情況下應該拋出錯誤。
    constructor這個同byType類似,不過是應用于構造函數的參數。如果在BeanFactory中不是恰好有一個bean與構造函數參數相同類型,則一個致命的錯誤會產生。
    autodetect通過對bean 檢查類的內部來選擇constructorbyType。如果找到一個缺省的構造函數,那么就會應用byType。

    注意:顯式的指定依賴,比如property和constructor-arg元素,總會覆蓋自動裝配。自動裝配的行為可以和依賴檢查結合使用,依賴檢查會在自動裝配完成后發生。

    注意:正如我們已經提到過的,對于大型的應用,自動裝配不鼓勵使用,因為它去除了你的合作類的透明性和結構。

    3.3.6.?依賴檢查

    對于部署在BeanFactory的bean的未解決的依賴,Spring有能力去檢查它們的存在性。 這些依賴要么是bean的JavaBean式的屬性,在bean的定義中并沒有為它們設置真實的值, 要么是通過自動裝配特性被提供。

    當你想確保所有的屬性(或者某一特定類型的所有屬性)都被設置到bean上面的時候, 這項特性就很有用了。當然,在很多情況下一個bean類的很多屬性都會有缺省的值, 或者一些屬性并不會應用到所有的應用場景,那么這個特性的作用就有限了 。 依賴檢查能夠分別對每一個bean應用或取消應用,就像自動裝配功能一樣。缺省的是?檢查依賴關系。 依賴檢查可以以幾種不同的模式處理。在XmlBeanFactory中, 通過bean定義中的?dependency-check?屬性來指定依賴檢查,這個屬性有以下的值。

    表?3.3.?依賴檢查模式

    模式解釋
    none不進行依賴檢查。沒有指定值的bean屬性僅僅是沒有設值。
    simple對基本類型和集合(除了合作者外,比如其他的bean,所有東西)進行依賴檢查。
    object對合作者進行依賴檢查。
    all對合作者,基本類型和集合都進行依賴檢查。

    3.4.?自定義bean的本質特征

    3.4.1.?生命周期接口

    Spring提供了一些標志接口,用來改變BeanFactory中的bean的行為。 它們包括InitializingBean和DisposableBean。 實現這些接口將會導致BeanFactory調用前一個接口的afterPropertiesSet()方法, 調用后一個接口destroy()方法,從而使得bean可以在初始化和析構后做一些特定的動作。

    在內部,Spring使用BeanPostProcessors?來處理它能找到的標志接口以及調用適當的方法。 如果你需要自定義的特性或者其他的Spring沒有提供的生命周期行為, 你可以實現自己的?BeanPostProcessor。關于這方面更多的內容可以看這里:?第?3.7?節 “使用BeanPostprocessors定制bean”。

    所有的生命周期的標志接口都在下面敘述。在附錄的一節中,你可以找到相應的圖, 展示了Spring如何管理bean;那些生命周期的特性如何改變你的bean的本質特征以及它們如何被管理。

    3.4.1.1.?InitializingBean /?init-method

    實現org.springframework.beans.factory.InitializingBean?接口允許一個bean在它的所有必須的屬性被BeanFactory設置后, 來執行初始化的工作。InitializingBean接口僅僅制定了一個方法:

    * Invoked by a BeanFactory after it has set all bean properties supplied* (and satisfied BeanFactoryAware and ApplicationContextAware).* <p>This method allows the bean instance to perform initialization only* possible when all bean properties have been set and to throw an* exception in the event of misconfiguration.* @throws Exception in the event of misconfiguration (such* as failure to set an essential property) or if initialization fails.*/void afterPropertiesSet() throws Exception;

    注意:通常InitializingBean接口的使用是能夠避免的(而且不鼓勵,因為沒有必要把代碼同Spring耦合起來)。Bean的定義支持指定一個普通的初始化方法。在使用XmlBeanFactory的情況下,可以通過指定init-method屬性來完成。 舉例來說,下面的定義:

    <bean id="exampleInitBean" class="examples.ExampleBean" init-method="init"/>public class ExampleBean {public void init() {// do some initialization work} }

    同下面的完全一樣:

    <bean id="exampleInitBean" class="examples.AnotherExampleBean"/>public class AnotherExampleBean implements InitializingBean {public void afterPropertiesSet() {// do some initialization work} }

    但卻不把代碼耦合于Spring。

    3.4.1.2.?DisposableBean /?destroy-method

    實現org.springframework.beans.factory.DisposableBean接口允許一個bean, 可以在包含它的BeanFactory銷毀的時候得到一個回調。DisposableBean也只指定了一個方法:

    /*** Invoked by a BeanFactory on destruction of a singleton.* @throws Exception in case of shutdown errors.* Exceptions will get logged but not rethrown to allow* other beans to release their resources too.*/void destroy() throws Exception;

    注意:通常DisposableBean接口的使用能夠避免的(而且是不鼓勵的,因為它不必要地將代碼耦合于Spring)。 Bean的定義支持指定一個普通的析構方法。在使用XmlBeanFactory使用的情況下,它是通過?destroy-method屬性完成。 舉例來說,下面的定義:

    <bean id="exampleInitBean" class="examples.ExampleBean" destroy-method="destroy"/>public class ExampleBean {public void cleanup() {// do some destruction work (like closing connection)} }

    同下面的完全一樣:

    <bean id="exampleInitBean" class="examples.AnotherExampleBean"/>public class AnotherExampleBean implements DisposableBean {public void destroy() {// do some destruction work} }

    但卻不把代碼耦合于Spring。

    重要的提示:當以portotype模式部署一個bean的時候,bean的生命周期將會有少許的變化。 通過定義,Spring無法管理一個non-singleton/prototype bean的整個生命周期, 因為當它創建之后,它被交給客戶端而且容器根本不再留意它了。 當說起non-singleton/prototype bean的時候,你可以把Spring的角色想象成“new”操作符的替代品。 從那之后的任何生命周期方面的事情都由客戶端來處理。BeanFactory中bean的生命周期將會在第?3.4.1?節 “生命周期接口”?一節中有更詳細的敘述?.

    3.4.2.?了解自己

    3.4.2.1.?BeanFactoryAware

    對于實現了org.springframework.beans.factory.BeanFactoryAware接口的類, 當它被BeanFactory創建后,它會擁有一個指向創建它的BeanFactory的引用。

    public interface BeanFactoryAware {/*** Callback that supplies the owning factory to a bean instance.* <p>Invoked after population of normal bean properties but before an init* callback like InitializingBean's afterPropertiesSet or a custom init-method.* @param beanFactory owning BeanFactory (may not be null).* The bean can immediately call methods on the factory.* @throws BeansException in case of initialization errors* @see BeanInitializationException*/void setBeanFactory(BeanFactory beanFactory) throws BeansException; }

    這允許bean可以以編程的方式操控創建它們的BeanFactory, 既可以直接使用?org.springframework.beans.factory.BeanFactory接口, 也可以將引用強制將類型轉換為已知的子類型從而獲得更多的功能。這個特性主要用于編程式地取得其他bean。 雖然在一些場景下這個功能是有用的,但是一般來說它應該避免使用,因為它使代碼與Spring耦合在一起, 而且也不遵循反向控制的風格(合作者應當作屬性提供給bean)。

    3.4.2.2.?BeanNameAware

    如果一個bean實現了org.springframework.beans.factory.BeanNameAware接口, 并且被部署到一個 BeanFactory中,那么BeanFactory就會通過這個接口來調用bean,以便通知這個bean它被部署的id?。 這個回調發生在普通的bean屬性設置之后,在初始化回調之前,比如InitializingBean的afterPropertiesSet方法(或者自定義的init- method)。

    3.4.3.?FactoryBean

    接口org.springframework.beans.factory.FactoryBean?一般由本身是工廠類的對象實現。BeanFactory接口提供了三個方法:

    • Object getObject(): 必須返回一個這個工廠類創建的對象實例。這個實例可以是共享的(取決于這個工廠返回的是singleton還是prototype)。

    • boolean isSingleton(): 如果Factory返回的對象是singleton,返回true,否則返回false

    • Class getObjectType(): 返回getObject()方法返回的對象的類型,如果類型不是預先知道的,則返回null。

    3.5.?子bean定義

    一個bean定義可能會包含大量的配置信息,包括容器相關的信息(比如初始化方法,靜態工廠方法名等等)以及構造函數參數和屬性的值。一個子bean定義是一個能夠從父bean定義繼承配置數據的bean定義。 它可以覆蓋一些值,或者添加一些其他需要的值。使用父和子的bean定義可以節省很多的輸入工作。實際上,這就是一種模版形式。

    當以編程的方式使用一個BeanFactory,子bean定義用ChildBeanDefinition類表示。 大多數的用戶從來不需要以這個方式使用它們,而是在類似XmlBeanFactory的BeanFactory 中以聲明的方式配置bean定義。在一個XmlBeanFactory的bean定義中,使用parent屬性指出一個子bean定義,而父bean則作為這個屬性的值。

    <bean id="inheritedTestBean" class="org.springframework.beans.TestBean"><property name="name"><value>parent</value></property><property name="age"><value>1</value></property> </bean><bean id="inheritsWithDifferentClass" class="org.springframework.beans.DerivedTestBean"parent="inheritedTestBean" init-method="initialize"><property name="name"><value>override</value></property><!-- age should inherit value of 1 from parent --></bean>

    如果子bean定義沒有指定class屬性,將使用父定義的class屬性,當然也可以覆蓋它。 在后面一種情況中,子bean的class屬性值必須同父bean的兼容,也就是它必須能夠接受父親的屬性值。

    一個子bean定義可以從父親處繼承構造函數參數,屬性值以及方法,并且可以選擇增加新的值。 如果init-method,destroy-method和/或靜態factory-method被指定了,它們就會覆蓋父親相應的設置。

    剩余的設置將?總是?從子定義處得到:?依賴,?自動裝配模式,?依賴檢查,?singleton,?延遲初始化

    在下面的例子中父定義并沒有指定class屬性:

    <bean id="inheritedTestBeanWithoutClass"><property name="name"><value>parent</value></property><property name="age"><value>1</value></property> </bean><bean id="inheritsWithClass" class="org.springframework.beans.DerivedTestBean"parent="inheritedTestBeanWithoutClass" init-method="initialize"><property name="name"><value>override</value></property><!-- age should inherit value of 1 from parent --> </bean>

    這個父bean就無法自己實例化;它實際上僅僅是一個純模版或抽象bean,充當子定義的父定義。 若要嘗試單獨使用這樣的父bean(比如將它作為其他bean的ref屬性而引用,或者直接使用這個父 bean的id調用getBean()方法),將會導致一個錯誤。同樣地,容器內部的preInstantiateSingletons方法會完全忽略這種既沒有parent屬性也沒有class屬性的bean定義,因為它們是不完整的。

    特別注意:這里并沒有辦法顯式地聲明一個bean定義為抽象的。 如果一個bean確實有一個class屬性定義,那么它就能夠被實例化。而且要注意 XmlBeanFactory默認地將會預實例化所有的singleton的bean。 因此很重要的一點是:如果你有一個(父)bean定義指定了class屬性,而你又想僅僅把它當作模板使用, 那么你必須保證將lazy-init屬性設置為true(或者將bean標記為non-singleton),否則 XmlBeanFactory(以及其他可能的容器)將會預實例化它。

    3.6.?BeanFactory之間的交互

    BeanFactory本質上不過是高級工廠的接口,它維護不同bean和它們所依賴的bean的注冊。 BeanFactory使得你可以利用 bean工廠讀取和訪問bean定義。 當你使用BeanFactory的時候,你可以象下面一樣創建并且讀入一些XML格式的bean定義:

    InputStream is = new FileInputStream("beans.xml"); XmlBeanFactory factory = new XmlBeanFactory(is);

    基本上這就足夠了。使用getBean(String)你可以取得你的bean的實例。 如果你將它定義為一個singleton(缺省的)你將會得到同一個bean的引用, 如果你將singleton設置為false,那么你將會每次得到一個新的實例。 在客戶端的眼里BeanFactory是驚人的簡單。BeanFactory接口僅僅為客戶端調用提供了5個方法:

    • boolean containsBean(String): 如果BeanFactory包含一個與所給名稱匹配的bean定義,則返回true

    • Object getBean(String): 返回一個以所給名字注冊的bean的實例。返回一個singleton的共享的實例還是一個新創建的實例, 這取決于bean在BeanFactory配置中如何被配置的。一個BeansException將會在下面兩種情況中拋出:bean沒有被找到(在這種情況下,拋出的是NoSuchBeanDefinitionException),或者在實例化和準備bean的時候發生異常

    • Object getBean(String,Class): 返回一個以給定名字注冊的bean。返回的bean將會被強制類型轉換成給定的Class。 如果bean不能被類型轉換,相應的異常將會被拋出(BeanNotOfRequiredTypeException)。 此外getBean(String)的所有規則也同樣適用這個方法(同上)

    • boolean isSingleton(String): 判斷以給定名字注冊的bean定義是一個singleton還是一個prototype。 如果與給定名字相應的bean定義沒有被找到,將會拋出一個異常(NoSuchBeanDefinitionException)

    • String[] getAliases(String):如果給定的bean名字在bean定義中有別名,則返回這些別名

    3.6.1.?獲得一個FactoryBean而不是它生成的bean

    有些時候我們需要向BeanFactory請求實際的FactoryBean實例本身, 而不是它生產出來的bean。在調用BeanFactory (包括ApplicationContext)的getBean方法的時候, 在傳入的參數bean id前面加一個“&”符號,就可以做到這一點。所以,對于一個id為getBean的FactoryBean, 在BeanFactory上調用getBean("myBean")將會返回FactoryBean的產品,而調用getBean("&myBean")將會返回這個FactoryBean實例本身。

    3.7.?使用BeanPostprocessors定制bean

    一個bean post-processor是一個實現了org.springframework.beans.factory.config.BeanPostProcessor的類,它包含兩個回調方法。當這樣的一個類作為BeanFactory的post-processor注冊時,對于這個BeanFactory創建的每一個bean實例,在任何初始化方法(afterPropertiesSet和用init-method屬性聲明的方法)被調用之前和之后,post-processor將會從BeanFactory分別得到一個回調。post-processor可以對這個bean做任何操作事情,包括完全忽略這個回調。一個bean post-processor通常用來檢查標記接口,或者做一些諸如將一個bean包裝成一個proxy的事情。一些Spring的助手類就是作為bean post-processor而實現的。

    有一點很重要,BeanFactory和ApplicationContext對待bean post-processor有少許不同。 一個ApplicationContext會自動監測到任何部署在它之上的實現了?BeanPostProcessor接口的bean, 并且把它們作為post-processor注冊,然后factory就會在bean創建的時候恰當地調用它們。 部署一個post-processor同部屬一個其他的bean并沒有什么區別。而另一方面,當使用普通的BeanFactory的時候, 作為post-processor的bean必須通過類似下面的代碼來手動地顯式地注冊:

    ConfigurableBeanFactory bf = new .....; // create BeanFactory... // now register some beans // now register any needed BeanPostProcessors MyBeanPostProcessor pp = new MyBeanPostProcessor(); bf.addBeanPostProcessor(pp);// now start using the factory...

    因為手工的注冊不是很方便,而且ApplicationContext是BeanFactory功能上擴展,所以通常建議當需要post-processor的時候最好使用ApplicationContext。

    3.8.?使用BeanFactoryPostprocessors定制bean工廠

    一個bean factory post-processor是一個實現了org.springframework.beans.factory.config.BeanFactoryPostProcessor接口的類。它將會被手動執行(BeanFactory的時候)或自動執行(ApplicationContext的時候),在BeanFactory構造出來后, 對整個BeanFactory做某種修改。Spring包含很多已存在的bean factory post-processor, 比如PropertyResourceConfigurer和PropertyPlaceHolderConfigurer(這兩個將在下面介紹),以及BeanNameAutoProxyCreator對其他bean進行事務包裝或者用其他的proxy進行包裝,將會在后面敘述。BeanFactoryPostProcessor也能用來添加自定義的editor(可參見第?4.3.2?節 “內建的(PropertyEditors)和類型轉換 ”)。

    在BeanFactory中,使用BeanFactoryPostProcessor是手動的,將類似于下面:

    XmlBeanFactory factory = new XmlBeanFactory(new FileSystemResource("beans.xml")); // create placeholderconfigurer to bring in some property // values from a Properties file PropertyPlaceholderConfigurer cfg = new PropertyPlaceholderConfigurer(); cfg.setLocation(new FileSystemResource("jdbc.properties")); // now actually do the replacement cfg.postProcessBeanFactory(factory);

    ApplicationContext將會檢測它所部署的實現了BeanFactoryPostProcessor?接口的bean,然后在適當的時候將它們作為bean factory post-processor而使用。部署這些post-processor與部署其他的bean并沒有什么區別。

    因為這個手動的步驟并不方便,而且ApplicationContext是BeanFactory的功能擴展,所以當需要使用bean factory post-processor的時候通常建議使用ApplicationContext

    3.8.1.?PropertyPlaceholderConfigurer

    PropertyPlaceholderConfigurer作為一個bean factory post-processor實現,可以用來將BeanFactory定義中的屬性值放置到另一個單獨的Java Properties格式的文件中。 這使得用戶不用對BeanFactory的主XML定義文件進行復雜和危險的修改,就可以定制一些基本的屬性(比如說數據庫的urls,用戶名和密碼)。

    考慮一個BeanFactory定義的片斷,里面用占位符定義了DataSource:

    在下面這個例子中,定義了一個datasource,并且我們會在一個外部Porperties文件中配置一些相關屬性。 在運行時,我們為BeanFactory提供一個PropertyPlaceholderConfigurer,它將用Properties文件中的值替換掉這個datasource的屬性值:

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"><property name="driverClassName"><value>${jdbc.driverClassName}</value></property><property name="url"><value>${jdbc.url}</value></property><property name="username"><value>${jdbc.username}</value></property><property name="password"><value>${jdbc.password}</value></property> </bean>

    真正的值來自于另一個Properties格式的文件:

    jdbc.driverClassName=org.hsqldb.jdbcDriver jdbc.url=jdbc:hsqldb:hsql://production:9002 jdbc.username=sa jdbc.password=root

    如果要在BeanFactory中使用,bean factory post-processor必須手動運行:

    XmlBeanFactory factory = new XmlBeanFactory(new FileSystemResource("beans.xml")); PropertyPlaceholderConfigurer cfg = new PropertyPlaceholderConfigurer(); cfg.setLocation(new FileSystemResource("jdbc.properties")); cfg.postProcessBeanFactory(factory);

    注意,ApplicationContext能夠自動辨認和應用在其上部署的實現了BeanFactoryPostProcessor的bean。這就意味著,當使用ApplicationContext的時候應用PropertyPlaceholderConfigurer會非常的方便。由于這個原因,建議想要使用這個或者其他bean factory postprocessor的用戶使用ApplicationContext代替BeanFactroy。

    PropertyPlaceHolderConfigurer不僅僅在你指定的Porperties文件中查找屬性, 如果它在其中沒有找到你想使用的屬性,它還會在Java的系統properties中查找。 這個行為能夠通過設置配置中的systemPropertiesMode?屬性來定制。這個屬性有三個值, 一個讓配置總是覆蓋,一個讓它永不覆蓋,一個讓它僅在properties文件中找不到的時候覆蓋。 請參考 PropertiesPlaceholderConfigurer的JavaDoc獲得更多信息。

    3.8.2.??PropertyOverrideConfigurer

    另一個bean factory post-processor,PropertyOverrideConfigurer,類似于PropertyPlaceholderConfigurer,但是與后者相比,前者對于bean屬性可以有缺省值或者根本沒有值。如果起覆蓋作用的 Properties文件沒有某個bean屬性的內容,那么缺省的上下文定義將被使用。

    注意:bean 工廠的定義并?不會意識到被覆蓋,所以僅僅察看XML定義文件并不能立刻明顯地知道覆蓋配置是否被使用了。在有多個PorpertyOverrideConfigurer對用一個bean屬性定義了不同的值的時候,最后一個將取勝(取決于覆蓋的機制)。

    Properties文件的一行配置應該是如下的格式:

    beanName.property=value

    一個properties文件的例子將會是下面這樣的:

    dataSource.driverClassName=com.mysql.jdbc.Driver dataSource.url=jdbc:mysql:mydb

    這個例子可以用在包含dataSource的bean的BeanFactory中,這個bean有driverurl屬性。

    3.9.?注冊附加的定制PropertyEditor

    當用字符串值設置bean的屬性時,BeanFactory實質上使用了標準的JavaBeans 的PropertyEditor將這些String轉換為屬性的復雜類型。Spring預先注冊了很多定制的PropertyEditor(比如,將一個字符串表示的classname轉換成真正的Class對象)。另外,一個類的PropertyEditor如果被恰當地命名并且放在與它提供支持的類同一個包內,那么Java標準的JavaBeans PropertyEditor查找機制就會自動找到這個PropertyEditor。

    如果需要注冊其他定制的PropertyEditor,這里也有幾個可用的機制。

    最手動的方法,也是通常不方便和不推薦的,就是簡單地使用ConfigurableBeanFactory接口的registerCustomEditor()方法,假定你已經有一個BeanFactory引用。

    比較方便的機制是,使用一個特殊的叫CustomEditorConfigurer的bean factory post-precessor。盡管bean factory post-processor能夠和BeanFactory半手動地使用,但是它有一個嵌套的屬性設置。所以強烈建議,就象這里描述的,它能夠和ApplicationContxt一起使用,這樣它就可以以其它bean的方式被部署,并且被自動監測和應用。

    3.10.?介紹ApplicationContext

    beans包提供了以編程的方式管理和操控bean的基本功能,而context包增加了ApplicationContext,它以一種更加面向框架的方式增強了BeanFactory的功能。多數用戶可以以一種完全的聲明式方式來使用ApplicationContext,甚至不用去手動創建它,但是卻去依賴象ContextLoader的支持類,在J2EE的的web應用的啟動進程中用它啟動ApplicationContext。當然,這種情況下還是可以以編程的方式創建一個ApplicationContext。

    Context包的基礎是位于org.springframework.context包中的ApplicationContext接口。它是由BeanFactory接口集成而來,提供BeanFactory所有的功能。為了以一種更向面向框架的方式工作,context包使用分層和有繼承關系的上下文類,包括:

    • MessageSource, 提供對i18n消息的訪問

    • 資源訪問, 比如URL和文件

    • 事件傳遞給實現了ApplicationListener接口的bean

    • 載入多個(有繼承關系)上下文類,使得每一個上下文類都專注于一個特定的層次,比如應用的web層

    因為ApplicationContext包括了BeanFactory所有的功能,所以通常建議先于BeanFactory使用,除了有限的一些場合比如在一個Applet中,內存的消耗是關鍵的,每kb字節都很重要。接下來的章節將敘述ApplicationContext在BeanFactory的基本能力上增建的功能。

    3.11.?ApplicationContext中增加的功能

    正如上面說明的那樣,ApplicationContext有幾個區別于BeanFactory的特性。讓我們一個一個地討論它們。

    3.11.1.?使用MessageSource

    ApplicationContext接口繼承MessageSource接口,所以提供了messaging功能(i18n或者國際化)。同NestingMessageSource一起使用,就能夠處理分級的信息,這些是Spring提供的處理信息的基本接口。讓我們很快瀏覽一下這里定義的方法:

    • String getMessage (String code, Object[] args, String default, Locale loc):這個方法是從MessageSource取得信息的基本方法。如果對于指定的locale沒有找到信息,則使用默認的信息。傳入的參數args被用來代替信息中的占位符,這個是通過Java標準類庫的MessageFormat實現的。

    • String getMessage (String code, Object[] args, Locale loc):本質上和上一個方法是一樣的,除了一點區別:沒有默認值可以指定;如果信息找不到,就會拋出一個NoSuchMessageException。

    • String getMessage(MessageSourceResolvable resolvable, Locale locale):上面兩個方法使用的所有屬性都是封裝到一個叫做MessageSourceResolvable的類中,你可以通過這個方法直接使用它。

    當ApplicationContext被加載的時候,它會自動查找在context中定義的MessageSource bean。這個bean必須叫做messageSource。如果找到了這樣的一個bean,所有對上述方法的調用將會被委托給找到的message source。如果沒有找到message source,ApplicationContext將會嘗試查它的父親是否包含這個名字的bean。如果有,它將會把找到的bean作為MessageSource。如果它最終沒有找到任何的信息源,一個空的StaticMessageSource將會被實例化,使它能夠接受上述方法的調用。

    Spring目前提供了兩個MessageSource的實現。它們是ResourceBundleMessageSource和StaticMessageSource。兩個都實現了NestingMessageSource以便能夠嵌套地解析信息。StaticMessageSource很少被使用,但是它提供以編程的方式向source增加信息。ResourceBundleMessageSource用得更多一些,我們將提供它的一個例子:

    <beans><bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"><property name="basenames"><list><value>format</value><value>exceptions</value><value>windows</value></list></property></bean> </beans>

    這段配置假定你在classpath有三個resource bundle,分別叫做fformat,exceptions和windows。使用JDK通過ResourceBundle解析信息的標準方式,任何解析信息的請求都會被處理。TODO:舉一個例子

    3.11.2.?事件傳遞

    ApplicationContext中的事件處理是通過ApplicationEvent類和ApplicationListener接口來提供的。如果上下文中部署了一個實現了ApplicationListener接口的bean,每次一個ApplicationEvent發布到ApplicationContext時,那個bean就會被通知。實質上,這是標準的Observer設計模式。Spring提供了三個標準事件:

    表?3.4.?內置事件

    事件解釋
    ContextRefreshedEvent當ApplicationContext已經初始化或刷新后發送的事件。這里初始化意味著:所有的bean被裝載,singleton被預實例化,以及ApplicationContext已準備好
    ContextClosedEvent當使用ApplicationContext的close()方法結束上下文的時候發送的事件。這里結束意味著:singleton被銷毀
    RequestHandledEvent一個與web相關的事件,告訴所有的bean一個HTTP請求已經被響應了(這個事件將會在一個請求結束被發送)。注意,這個事件只能應用于使用了Spring的DispatcherServlet的web應用

    同樣也可以實現自定義的事件。通過調用ApplicationContext的publishEvent()方法,并且指定一個參數,這個參數是你自定義的事件類的一個實例。我們來看一個例子。首先是ApplicationContext:

    <bean id="emailer" class="example.EmailBean"><property name="blackList"><list><value>black@list.org</value><value>white@list.org</value><value>john@doe.org</value></list></property> </bean><bean id="blackListListener" class="example.BlackListNotifier"><property name="notificationAddress"><value>spam@list.org</value></property> </bean>

    然后是實際的bean:

    public class EmailBean implements ApplicationContextAware {/** the blacklist */private List blackList;public void setBlackList(List blackList) {this.blackList = blackList;}public void setApplicationContext(ApplicationContext ctx) {this.ctx = ctx;}public void sendEmail(String address, String text) {if (blackList.contains(address)) {BlackListEvent evt = new BlackListEvent(address, text);ctx.publishEvent(evt);return;}// send email} }public class BlackListNotifier implement ApplicationListener {/** notification address */private String notificationAddress;public void setNotificationAddress(String notificationAddress) {this.notificationAddress = notificationAddress;}public void onApplicationEvent(ApplicationEvent evt) {if (evt instanceof BlackListEvent) {// notify appropriate person}} }

    當然,這個特定的例子或許可以用更好的方式實現(或許使用AOP特性),但是它用來說明基本的事件機制是足夠了。

    3.11.3.?在Spring中使用資源

    很多應用程序都需要訪問資源。資源可以包括文件,以及象web頁面或NNTP newsfeeds的東西。Spring提供了一個清晰透明的方案,以一種協議無關的方式訪問資源。ApplicationContext接口包含一個方法(getResource(String))負責這項工作。

    Resource類定義了幾個方法,這幾個方法被所有的Resource實現所共享:

    表?3.5.?資源功能

    方法解釋
    getInputStream()用InputStream打開資源,并返回這個InputStream。
    exists()檢查資源是否存在,如果不存在返回false
    isOpen()如果這個資源不能打開多個流將會返回true。因為除了基于文件的資源,一些資源不能被同事多次讀取,它們就會返回false。
    getDescription()返回資源的描述,通常是全限定文件名或者實際的URL。

    Spring提供了幾個Resource的實現。它們都需要一個String表示的資源的實際位置。依據這個String,Spring將會自動為你選擇正確的Resource實現。當向ApplicationContext請求一個資源時,Spring首先檢查你指定的資源位置,尋找任何前綴。根據不同的ApplicationContext的實現,不同的Resource實現可被使用的。Resource最好是使用ResourceEditor來配置,比如XmlBeanFactory。

    3.12.?在ApplicationContext中定制行為

    BeanFactory已經提供了許多機制來控制部署在其中的bean的生命周期(比如象InitializingBean或DisposableBean的標志接口,它們的配置效果和XmlBeanFactory配置中的init-method和destroy-method屬性以及bean post-processor是相同的。在ApplicationContext中,這些也同樣可以工作,但同時也增加了一些用于定制bean和容器行為的機制。

    3.12.1.?ApplicationContextAware標記接口

    所有BeanFactory中可用的標志接口這里也可以使用。ApplicationContext又增加了一個bean可以實現的標志接口:org.springframework.context.ApplicationContextAware。如果一個bean實現了這個接口并且被部署到了context中,當這個bean創建的時候,將使用這個接口的setApplicationContext()方法回調這個bean,為這個bean提供一個指向當前上下文的引用,這個引用將被存儲起來以便bean以后與上下文發生交互。

    3.12.2.?BeanPostProcessor

    Bean post-processor(實現了org.springframework.beans.factory.config.BeanPostProcessor的java類)在上面已經敘述過了。還是值得再次提到,post-processor在ApplicationContext中使用要比在普通的BeanFactory中使用方便得多。在一個ApplicationContext中,一個實現了上述標記接口的bean將會被自動查找,并且作為一個bean post-processor被注冊,在創建工廠中的每一個bean時都會被適當地調用。

    3.12.3.?BeanFactoryPostProcessor

    Bean factory post-processor(實現了org.springframework.beans.factory.config.BeanFactoryPostProcessor接口的java類)在前面已經介紹過。這里也值得再提一下,bean factory post-processor在ApplicationContext中使用也要比在普通的BeanFactory中使用方便得多。在一個ApplicationContext中,一個實現了上述標記接口的bean將會被自動查找,并且作為一個bean factory post-processor被注冊,在適當的時候被調用。

    3.12.4.?PropertyPlaceholderConfigurer

    PropertyPlaceholderConfigurer在BeanFactory中的使用已經敘述過了。這里仍然值得再次提一下,它在ApplicationContext中的使用要更加方便一些,因為當它像其它bean一樣部署的時候,上下文會自動識別和應用任何的bean factory post-processor,比如這個。這時候就沒有必要手動地運行它。

    <!-- property placeholder post-processor --> <bean id="placeholderConfig"class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><property name="location"><value>jdbc.properties</value></property> </bean>

    3.13.?注冊附加的定制PropertyEditors

    正如前面曾提到的,Spring使用標準的JavaBeans的PropertyEditor將字符串形式表示的屬性值轉換為屬性真實的復雜的類型。CustomEditorConfigurer,這個bean factory post-processor可以使ApplicationContext很方便地增加對額外的PropertyEditor的支持。

    考慮一個用戶類ExoticType,以及另外一個需要ExoticType作為屬性的DependsOnExoticType類:

    public class ExoticType {private String name;public ExoticType(String name) {this.name = name;} }public class DependsOnExoticType { private ExoticType type;public void setType(ExoticType type) {this.type = type;} }

    當設置好的時候,我們希望能夠以字符串的形式指定屬性,同時背后的PropertyEditor會將這個字符串轉換為一個真正的Exotic類型的對象:

    <bean id="sample" class="example.DependsOnExoticType"><property name="type"><value>aNameForExoticType</value></property> </bean>

    而這個PorpertyEditor看起來象下面這樣:

    // converts string representation to ExoticType object public class ExoticTypeEditor extends PropertyEditorSupport {private String format;public void setFormat(String format) {this.format = format;}public void setAsText(String text) {if (format != null && format.equals("upperCase")) {text = text.toUpperCase();}ExoticType type = new ExoticType(text);setValue(type);} }

    最后,我們用CustomEditorConfigurer將新的PropertyEditor注冊到ApplicationContext上,然后ApplicationContext就可以在需要的時候使用這個PropertyEditor了:

    <bean id="customEditorConfigurer" class="org.springframework.beans.factory.config.CustomEditorConfigurer"><property name="customEditors"><map><entry key="example.ExoticType"><bean class="example.ExoticTypeEditor"><property name="format"><value>upperCase</value></property></bean></entry></map></property> </bean>

    3.14.?用方法調用的返回值來設置bean的屬性

    有些時候,需要用容器中另一個bean的方法返回值來設置一個bean的屬性,或者使用其它任意類(不一定是容器中的bean)的靜態方法的返回值來設置。此外,有些時候,需要調用一個靜態或非靜態的方法來執行某些初始化工作。對于這兩個目的,可以使用MethodInvokingFactoryBean助手類。它是一個FactoryBean,可以返回一個靜態或非靜態方法的調用結果。

    下面是一個基于XML的BeanFactory的bean定義的例子,它使用那個助手類調用靜態工廠方法:

    <bean id="myClass" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"><property name="staticMethod"><value>com.whatever.MyClassFactory.getInstance</value></property> </bean>

    下面這個例子先調用一個靜態方法,然后調用一個實例方法,來獲得一個Java System的屬性。雖然有點羅嗦,但是可以工作:

    <bean id="sysProps" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"><property name="targetClass"><value>java.lang.System</value></property><property name="targetMethod"><value>getProperties</value></property> </bean> <bean id="javaVersion" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"><property name="targetObject"><ref local="sysProps"/></property><property name="targetMethod"><value>getProperty</value></property><property name="arguments"><list><value>java.version</value></list></property> </bean>

    注意,實際上這個類多半用來訪問工廠方法,所以MethodInvokingFactoryBean默認以singleton方式進行操作。經由容器的第一次請求工廠生成對象將會引起調用特定的工廠方法,它的返回值將會被緩存并且返回供這次請求和以后的請求使用。這個工廠的一個內部singleton屬性可以被設置為false,從而導致每次對象的請求都會調用那個目標方法。

    通過設置targetMethod屬性為一個靜態方法名的字符串來指定靜態目標方法,而設置targetClass為定義靜態方法的類。或者,通過設置targetObject屬性目標對象,設置targetMethod屬性要在目標對象上調用的方法名,來指定目標實例方法。方法調用的參數可以通過設置args屬性來指定。

    3.15.?從一個web應用創建ApplicationContext

    與BeanFactory總是以編程的方式創建相反,ApplicationContext可以通過使用比如ContextLoader聲明式地被創建。當然你也可以用ApplicationContext的任一種實現來以編程的方式創建它。首先,我們來看看ContextLoader以及它的實現。

    ContextLoader有兩個實現:ContextLoaderListener和ContextLoaderServlet。它們兩個有著同樣的功能,除了listener不能在Servlet 2.2兼容的容器中使用。自從Servelt 2.4規范,listener被要求在web應用啟動后初始化。很多2.3兼容的容器已經實現了這個特性。使用哪一個取決于你自己,但是如果所有的條件都一樣,你大概會更喜歡ContextLoaderListener;關于兼容方面的更多信息可以參照ContextLoaderServlet的JavaDoc。

    你可以象下面這樣用ContextLoaderListener注冊一個ApplicationContext:

    <context-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/daoContext.xml /WEB-INF/applicationContext.xml</param-value> </context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener><!-- OR USE THE CONTEXTLOADERSERVLET INSTEAD OF THE LISTENER <servlet><servlet-name>context</servlet-name><servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class><load-on-startup>1</load-on-startup> </servlet> -->

    這個listener需要檢查contextConfigLocation參數。如果不存在的話,它將默認使用/WEB-INF/applicationContext.xml。如果它存在,它就會用預先定義的分隔符(逗號,分號和空格)分開分割字符串,并將這些值作為應用上下文將要搜索的位置。ContextLoaderServlet可以用來替換ContextLoaderListener。這個servlet像listener那樣使用contextConfigLocation參數。

    3.16.?粘合代碼和罪惡的singleton

    一個應用中的大多數代碼最好寫成依賴注射(反向控制)的風格,這樣這些代碼就和BeanFactory容器或者ApplicationContext容器無關,它們在被創建的時候從容器處得到自己的依賴,并且完全不知道容器的存在。然而,對于少量需要與其它代碼粘合的粘合層代碼來說,有時候就需要以一種singleton(或者類似singleton)的方式來訪問BeanFactory或ApplicationContext。舉例來說,第三方的代碼可能想要(以Class.forName()的方式)直接構造一個新的對象,卻沒辦法從BeanFactory中得到這些對象。如果第三方代碼構造的對象只是一個小的stub或proxy,并且使用singleton方式訪問BeanFactroy/ApplicationContext來獲得真正的對象,大多數的代碼(由BeanFactory產生的對象)仍然可以使用反向控制。因此大多數的代碼依然不需要知道容器的存在,或者容器是如何被訪問的,并保持和其它代碼解耦,有著所有該有的益處。EJB也可以使用這種stub/proxy方案代理到一個普通的BeanFactory產生的java實現的對象。雖然理想情況下BeanFactory不需要是一個singleton,但是如果每個bean使用它自己的non-singleton的BeanFactory,對于內存使用或初始化次數都是不切實際。

    另一個例子,在一個多層的復雜的J2EE應用中(比如有很多JAR,EJB,以及WAR打包成一個EAR),每一層都有自己的ApplicationContext定義(有效地組成一個層次結構),如果頂層只有一個web-app(WAR)的話,比較好的做法是創建一個由不同層的XML定義文件組成的組合ApplicationContext。所有的ApplicationContext變體都可以從多個定義文件以這種方式構造出來。但是,如果在頂層有多個兄弟web-apps,為每一個web-app創建一個ApplicationContext,但是每個ApplicationContext都包含大部分相同的底層的bean定義,這就會因為內存使用而產生問題,因為創建bean的多個copy會花很長時間初始化(比如Hibernate SessionFactory),以及其它可能產生的副作用。作為替換,諸如ContextSingletonBeanFactoryLocator和SingletonBeanFactoryLocator的類可以在需要的時候以有效的singleton方式,加載多個層次的(比如一個是另一個的父親)BeanFactory或ApplicationContext,這些將會作為web-app ApplicationContext的parents。這樣做的結果就是,底層的bean定義只在需要的時候加載并且只被加載一次。

    3.16.1.?使用SingletonBeanFactoryLocator和ContextSingletonBeanFactoryLocator

    你可以查看SingletonBeanFactoryLocator和ContextSingletonBeanFactoryLocator的JavaDoc來獲得詳細的使用例子。

    正如在EJB那一章提到的,Spring為EJB提供的方便的基類一般使用一個non-singleton的BeanFactoryLocator實現,這個可以在需要的時候被SingletonBeanFactoryLocator和ContextSingletonBeanFactoryLocator替換。



    [1]?See?第?3.3.1?節 “設置bean的屬性和合作者”


    from:?http://docs.huihoo.com/spring/zh-cn/beans.html

    總結

    以上是生活随笔為你收集整理的Spring - Java/J2EE Application Framework 应用框架 第 3 章 Beans, BeanFactory和ApplicationContext的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    强辱丰满人妻hd中文字幕 | 久久国产精品萌白酱免费 | 欧美日韩在线亚洲综合国产人 | 国产精品亚洲专区无码不卡 | 性色av无码免费一区二区三区 | 色妞www精品免费视频 | 久久97精品久久久久久久不卡 | 国产精品久久久久9999小说 | 国产精品无码mv在线观看 | 久久综合网欧美色妞网 | 日本爽爽爽爽爽爽在线观看免 | 成人综合网亚洲伊人 | 亚洲国产精品无码一区二区三区 | 亚洲の无码国产の无码步美 | 欧美人妻一区二区三区 | 日韩精品a片一区二区三区妖精 | 久久这里只有精品视频9 | 亚洲精品中文字幕乱码 | 欧美大屁股xxxxhd黑色 | 亚洲精品一区二区三区四区五区 | 日韩精品久久久肉伦网站 | 国产乱人偷精品人妻a片 | 女人色极品影院 | 婷婷六月久久综合丁香 | 在线成人www免费观看视频 | 久久久久久久久蜜桃 | 日产国产精品亚洲系列 | 亚洲精品国偷拍自产在线观看蜜桃 | 国产麻豆精品一区二区三区v视界 | 亚洲精品美女久久久久久久 | 人人妻在人人 | 成人精品视频一区二区 | 成人无码视频免费播放 | 国产成人综合色在线观看网站 | 欧美猛少妇色xxxxx | 久久久中文字幕日本无吗 | 无码免费一区二区三区 | 久久国产精品二国产精品 | 国产人妻久久精品二区三区老狼 | 国产亚洲精品久久久ai换 | 欧美日本免费一区二区三区 | 少妇的肉体aa片免费 | 久久久久免费看成人影片 | 亚洲区欧美区综合区自拍区 | 国产av人人夜夜澡人人爽麻豆 | 人妻互换免费中文字幕 | 18精品久久久无码午夜福利 | 欧美熟妇另类久久久久久多毛 | 狠狠色欧美亚洲狠狠色www | 久久久久成人精品免费播放动漫 | 日本一本二本三区免费 | 欧美成人免费全部网站 | 精品国产一区二区三区av 性色 | 无套内谢老熟女 | 精品国产一区二区三区四区在线看 | 国产真实伦对白全集 | 婷婷丁香五月天综合东京热 | 欧美精品免费观看二区 | 免费看男女做好爽好硬视频 | 日韩精品无码一本二本三本色 | 亚洲最大成人网站 | 国产激情精品一区二区三区 | av无码不卡在线观看免费 | 99视频精品全部免费免费观看 | 婷婷色婷婷开心五月四房播播 | 午夜精品一区二区三区的区别 | 女高中生第一次破苞av | 国产激情无码一区二区app | 免费人成网站视频在线观看 | 成人试看120秒体验区 | 成人免费视频在线观看 | √天堂资源地址中文在线 | 国产精品理论片在线观看 | 无码人妻出轨黑人中文字幕 | 亚洲va中文字幕无码久久不卡 | 狠狠躁日日躁夜夜躁2020 | av无码不卡在线观看免费 | 亚拍精品一区二区三区探花 | 久久人人97超碰a片精品 | 午夜福利一区二区三区在线观看 | 成熟女人特级毛片www免费 | 亚洲日本va午夜在线电影 | 精品无人区无码乱码毛片国产 | 日本一本二本三区免费 | 欧美zoozzooz性欧美 | 色欲av亚洲一区无码少妇 | 天堂亚洲免费视频 | a片在线免费观看 | 1000部夫妻午夜免费 | 久久国语露脸国产精品电影 | 天天躁夜夜躁狠狠是什么心态 | 国产亚洲精品久久久ai换 | 日日噜噜噜噜夜夜爽亚洲精品 | 亚洲成av人综合在线观看 | 国产内射老熟女aaaa | 国产欧美亚洲精品a | 亚洲成av人影院在线观看 | 丰满少妇女裸体bbw | 99er热精品视频 | 人人超人人超碰超国产 | 久久久精品欧美一区二区免费 | 亚洲成a人一区二区三区 | 1000部啪啪未满十八勿入下载 | 成 人影片 免费观看 | 亚洲中文字幕无码中字 | 色综合久久中文娱乐网 | 欧美xxxxx精品 | 中文字幕乱码亚洲无线三区 | 精品一区二区三区波多野结衣 | 久久亚洲精品中文字幕无男同 | 麻豆果冻传媒2021精品传媒一区下载 | 久久99精品久久久久久动态图 | 国产亚洲精品久久久久久 | 久久综合激激的五月天 | 少妇高潮喷潮久久久影院 | 牲欲强的熟妇农村老妇女视频 | 99国产精品白浆在线观看免费 | 久久久久成人片免费观看蜜芽 | 丰满人妻被黑人猛烈进入 | 日韩人妻少妇一区二区三区 | 在线观看国产一区二区三区 | 激情内射日本一区二区三区 | 特级做a爰片毛片免费69 | 久久精品人人做人人综合试看 | 丰满肥臀大屁股熟妇激情视频 | 性欧美熟妇videofreesex | 国产另类ts人妖一区二区 | 少妇被黑人到高潮喷出白浆 | 午夜精品一区二区三区在线观看 | 任你躁国产自任一区二区三区 | 美女极度色诱视频国产 | 又色又爽又黄的美女裸体网站 | 日韩亚洲欧美精品综合 | 国内精品九九久久久精品 | 日日碰狠狠躁久久躁蜜桃 | 久久99精品久久久久婷婷 | 欧美一区二区三区视频在线观看 | 久久无码中文字幕免费影院蜜桃 | 精品国产国产综合精品 | 色综合久久久无码网中文 | 国产做国产爱免费视频 | 99视频精品全部免费免费观看 | 久久成人a毛片免费观看网站 | 久久99精品国产麻豆蜜芽 | 国产精品亚洲综合色区韩国 | 人人澡人人妻人人爽人人蜜桃 | 东京无码熟妇人妻av在线网址 | 97精品人妻一区二区三区香蕉 | 国产va免费精品观看 | v一区无码内射国产 | 亚洲成av人片天堂网无码】 | 欧美成人免费全部网站 | 无码人妻精品一区二区三区不卡 | 中国女人内谢69xxxx | 国产av一区二区精品久久凹凸 | 中文字幕无线码免费人妻 | 亚洲阿v天堂在线 | 最新国产乱人伦偷精品免费网站 | 国产精品久久久久久无码 | 精品乱码久久久久久久 | 久久久久久国产精品无码下载 | 久久综合九色综合欧美狠狠 | 久久综合给久久狠狠97色 | 亚洲中文字幕无码中字 | 国产精品亚洲一区二区三区喷水 | 日韩视频 中文字幕 视频一区 | 国产精品无码一区二区三区不卡 | 久久国产精品_国产精品 | 少女韩国电视剧在线观看完整 | 亚洲自偷自偷在线制服 | 欧美老妇交乱视频在线观看 | 清纯唯美经典一区二区 | 一本无码人妻在中文字幕免费 | 亚洲男女内射在线播放 | 亚洲aⅴ无码成人网站国产app | 爽爽影院免费观看 | 黑人玩弄人妻中文在线 | 亚洲 a v无 码免 费 成 人 a v | 白嫩日本少妇做爰 | 国产精品二区一区二区aⅴ污介绍 | 亚洲天堂2017无码中文 | 日本熟妇人妻xxxxx人hd | 伊人久久大香线蕉亚洲 | 日本一区二区三区免费高清 | 精品无码国产自产拍在线观看蜜 | 波多野结衣aⅴ在线 | 少妇性荡欲午夜性开放视频剧场 | ass日本丰满熟妇pics | 少妇无码av无码专区在线观看 | 超碰97人人做人人爱少妇 | 亚洲中文字幕无码一久久区 | 久久久久成人片免费观看蜜芽 | 中文字幕乱码中文乱码51精品 | 丰满岳乱妇在线观看中字无码 | 久久人人97超碰a片精品 | 国产成人综合在线女婷五月99播放 | 在线天堂新版最新版在线8 | 男女猛烈xx00免费视频试看 | 久久99精品国产麻豆蜜芽 | 少妇无码av无码专区在线观看 | 国产乡下妇女做爰 | 女高中生第一次破苞av | 狂野欧美性猛xxxx乱大交 | 波多野结衣高清一区二区三区 | 中文毛片无遮挡高清免费 | 精品无人国产偷自产在线 | 成人精品一区二区三区中文字幕 | 国产亲子乱弄免费视频 | 亚洲国产精品无码一区二区三区 | 午夜时刻免费入口 | 国产精品久久久久久久9999 | 国产成人精品视频ⅴa片软件竹菊 | 亚拍精品一区二区三区探花 | 免费无码的av片在线观看 | 成年美女黄网站色大免费全看 | 狂野欧美激情性xxxx | 国产激情无码一区二区app | v一区无码内射国产 | 久久人人爽人人爽人人片av高清 | 欧美一区二区三区 | 久久久久99精品国产片 | 亚洲国产精品成人久久蜜臀 | 曰韩少妇内射免费播放 | 亚洲国产精品一区二区美利坚 | 国产真实夫妇视频 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 1000部啪啪未满十八勿入下载 | 久久久久久av无码免费看大片 | 色婷婷av一区二区三区之红樱桃 | 国产成人综合色在线观看网站 | 扒开双腿吃奶呻吟做受视频 | 亚洲欧美国产精品专区久久 | 成人综合网亚洲伊人 | 亚洲 激情 小说 另类 欧美 | аⅴ资源天堂资源库在线 | 久久亚洲日韩精品一区二区三区 | 色一情一乱一伦 | 激情爆乳一区二区三区 | 少妇人妻偷人精品无码视频 | 免费国产黄网站在线观看 | 国产内射老熟女aaaa | 亚洲一区二区三区含羞草 | 在线播放免费人成毛片乱码 | 欧美人与动性行为视频 | 免费观看激色视频网站 | 色婷婷av一区二区三区之红樱桃 | 十八禁视频网站在线观看 | 久久国产精品_国产精品 | a国产一区二区免费入口 | 亚洲中文字幕在线无码一区二区 | 熟妇女人妻丰满少妇中文字幕 | 97久久国产亚洲精品超碰热 | 国产精品鲁鲁鲁 | 99久久精品午夜一区二区 | 久久97精品久久久久久久不卡 | 狠狠色噜噜狠狠狠7777奇米 | 免费无码午夜福利片69 | 亚洲经典千人经典日产 | 熟妇人妻无码xxx视频 | 99国产精品白浆在线观看免费 | 亚洲综合无码一区二区三区 | 亚洲人成影院在线无码按摩店 | 成熟女人特级毛片www免费 | 色一情一乱一伦一区二区三欧美 | 久久国产自偷自偷免费一区调 | 欧美人与禽zoz0性伦交 | 久久久中文字幕日本无吗 | 亚洲の无码国产の无码影院 | 成人一区二区免费视频 | 亚洲精品久久久久久久久久久 | 亚洲中文字幕av在天堂 | 人人妻人人澡人人爽欧美一区九九 | 男女爱爱好爽视频免费看 | 两性色午夜免费视频 | 无码国模国产在线观看 | 精品国产一区二区三区av 性色 | 日本精品人妻无码77777 天堂一区人妻无码 | 亚洲国产精华液网站w | 大地资源中文第3页 | 又大又黄又粗又爽的免费视频 | 亚洲小说春色综合另类 | 成人无码精品一区二区三区 | 激情亚洲一区国产精品 | 亚洲成色在线综合网站 | 国产莉萝无码av在线播放 | 国产精品亚洲五月天高清 | 欧美性生交活xxxxxdddd | 在线a亚洲视频播放在线观看 | 亚洲精品一区三区三区在线观看 | 国产成人无码专区 | 国产真实伦对白全集 | 国内精品久久久久久中文字幕 | 在线欧美精品一区二区三区 | 久热国产vs视频在线观看 | 久久久久av无码免费网 | 无码人中文字幕 | 人妻互换免费中文字幕 | 国产成人精品视频ⅴa片软件竹菊 | 亚洲综合另类小说色区 | 国产精品.xx视频.xxtv | 国产精品亚洲综合色区韩国 | 亚洲区欧美区综合区自拍区 | 久久亚洲日韩精品一区二区三区 | 亚洲热妇无码av在线播放 | 少妇一晚三次一区二区三区 | 中文字幕av伊人av无码av | 中文字幕乱码中文乱码51精品 | 国产国语老龄妇女a片 | 亚洲成色在线综合网站 | 白嫩日本少妇做爰 | 2019午夜福利不卡片在线 | 动漫av一区二区在线观看 | 色欲综合久久中文字幕网 | 亚洲狠狠婷婷综合久久 | 九九在线中文字幕无码 | 国产女主播喷水视频在线观看 | 秋霞成人午夜鲁丝一区二区三区 | 婷婷五月综合缴情在线视频 | 久久亚洲精品成人无码 | 久久99国产综合精品 | 狂野欧美激情性xxxx | 奇米影视888欧美在线观看 | 日韩精品无码一本二本三本色 | 中文字幕人成乱码熟女app | 天堂一区人妻无码 | 国产麻豆精品精东影业av网站 | 天干天干啦夜天干天2017 | 天海翼激烈高潮到腰振不止 | 日日天日日夜日日摸 | 亚洲欧美日韩综合久久久 | 乱人伦中文视频在线观看 | 窝窝午夜理论片影院 | 波多野结衣乳巨码无在线观看 | 国产成人无码a区在线观看视频app | 国产午夜亚洲精品不卡 | 久久人人爽人人人人片 | 无码av岛国片在线播放 | 女人被爽到呻吟gif动态图视看 | 成 人 网 站国产免费观看 | 国产超级va在线观看视频 | 一本大道伊人av久久综合 | 福利一区二区三区视频在线观看 | 亚洲无人区午夜福利码高清完整版 | 人妻体内射精一区二区三四 | 亚洲精品鲁一鲁一区二区三区 | 婷婷丁香六月激情综合啪 | 久久无码中文字幕免费影院蜜桃 | 国产精品久久久久9999小说 | 大色综合色综合网站 | 无码人妻丰满熟妇区毛片18 | 麻豆成人精品国产免费 | 欧美阿v高清资源不卡在线播放 | 18禁黄网站男男禁片免费观看 | 日本成熟视频免费视频 | 熟妇人妻中文av无码 | 国产精品手机免费 | 亚洲精品午夜无码电影网 | 欧美老熟妇乱xxxxx | 国产亚av手机在线观看 | 亚洲精品国偷拍自产在线观看蜜桃 | 1000部啪啪未满十八勿入下载 | 亚洲日本在线电影 | 玩弄人妻少妇500系列视频 | 国产成人无码专区 | 四虎国产精品一区二区 | 特黄特色大片免费播放器图片 | 丰满人妻被黑人猛烈进入 | 日韩精品成人一区二区三区 | 国产97人人超碰caoprom | 国产又爽又黄又刺激的视频 | 奇米影视7777久久精品 | 日本乱人伦片中文三区 | 亚洲乱码国产乱码精品精 | 久久 国产 尿 小便 嘘嘘 | 国产精品怡红院永久免费 | 久久久无码中文字幕久... | 国产精品理论片在线观看 | 久青草影院在线观看国产 | 亚洲无人区一区二区三区 | 麻豆精品国产精华精华液好用吗 | 亚洲国产av精品一区二区蜜芽 | 国产成人精品必看 | 国产精品福利视频导航 | 伊在人天堂亚洲香蕉精品区 | 十八禁视频网站在线观看 | 男女猛烈xx00免费视频试看 | 亚洲一区二区三区播放 | 精品aⅴ一区二区三区 | 国产 精品 自在自线 | 成人欧美一区二区三区 | 7777奇米四色成人眼影 | 超碰97人人做人人爱少妇 | 人妻少妇精品无码专区二区 | 2020久久超碰国产精品最新 | 丰腴饱满的极品熟妇 | 精品久久久中文字幕人妻 | 国产亚洲精品久久久久久久久动漫 | 国产精品无套呻吟在线 | 内射爽无广熟女亚洲 | 亚洲国产成人a精品不卡在线 | 国产精品理论片在线观看 | 亚洲爆乳无码专区 | 国产明星裸体无码xxxx视频 | 无码纯肉视频在线观看 | 亚洲精品欧美二区三区中文字幕 | 999久久久国产精品消防器材 | 久久久精品成人免费观看 | 少女韩国电视剧在线观看完整 | 亚洲日韩乱码中文无码蜜桃臀网站 | 99久久婷婷国产综合精品青草免费 | 亚洲爆乳大丰满无码专区 | 久久精品国产大片免费观看 | 亚洲の无码国产の无码步美 | 在线观看免费人成视频 | 美女张开腿让人桶 | 欧美精品无码一区二区三区 | 亚洲の无码国产の无码步美 | 日本又色又爽又黄的a片18禁 | 一本久久伊人热热精品中文字幕 | 无码人中文字幕 | 日产精品高潮呻吟av久久 | 曰韩少妇内射免费播放 | 人妻体内射精一区二区三四 | 天下第一社区视频www日本 | 欧美黑人性暴力猛交喷水 | 99久久99久久免费精品蜜桃 | 欧美丰满熟妇xxxx性ppx人交 | 男人和女人高潮免费网站 | 色综合久久中文娱乐网 | 少妇性l交大片欧洲热妇乱xxx | 亚洲精品一区二区三区在线观看 | 国产亚洲精品久久久久久国模美 | 日韩亚洲欧美中文高清在线 | 国内精品人妻无码久久久影院 | 两性色午夜免费视频 | 欧美丰满熟妇xxxx性ppx人交 | 精品偷自拍另类在线观看 | 亚洲日韩乱码中文无码蜜桃臀网站 | 午夜丰满少妇性开放视频 | 在线成人www免费观看视频 | 精品国精品国产自在久国产87 | 中文字幕色婷婷在线视频 | 乱人伦人妻中文字幕无码 | 中文字幕乱妇无码av在线 | 一二三四社区在线中文视频 | 亚洲精品久久久久中文第一幕 | 久久精品丝袜高跟鞋 | 国产后入清纯学生妹 | 亚洲色大成网站www国产 | 亚洲伊人久久精品影院 | 双乳奶水饱满少妇呻吟 | 亚洲天堂2017无码 | 国产亚洲精品久久久久久国模美 | 中文字幕+乱码+中文字幕一区 | 思思久久99热只有频精品66 | 色综合久久久无码中文字幕 | 亚洲国产精品成人久久蜜臀 | 亚洲综合无码久久精品综合 | 内射老妇bbwx0c0ck | 亚洲人成网站在线播放942 | 国产精品久久久久9999小说 | 麻豆果冻传媒2021精品传媒一区下载 | 久激情内射婷内射蜜桃人妖 | 男人扒开女人内裤强吻桶进去 | 波多野结衣乳巨码无在线观看 | 欧美 日韩 人妻 高清 中文 | 成在人线av无码免费 | 东北女人啪啪对白 | 欧美精品免费观看二区 | 成人一区二区免费视频 | 国产精品-区区久久久狼 | 性生交片免费无码看人 | 国产亚洲欧美日韩亚洲中文色 | 大肉大捧一进一出好爽视频 | 水蜜桃av无码 | 成人精品视频一区二区 | 久久zyz资源站无码中文动漫 | 精品人妻人人做人人爽 | 大肉大捧一进一出视频出来呀 | 亚洲国产精品无码一区二区三区 | 国产成人综合在线女婷五月99播放 | 性生交大片免费看l | 国产成人精品久久亚洲高清不卡 | 色综合视频一区二区三区 | 亚洲精品成人福利网站 | 六十路熟妇乱子伦 | 女人色极品影院 | 国产色在线 | 国产 | 日韩av激情在线观看 | 丰满诱人的人妻3 | 少妇人妻大乳在线视频 | 无遮挡国产高潮视频免费观看 | 亚洲成a人片在线观看无码 | 久久无码人妻影院 | 亚洲中文字幕无码一久久区 | 欧美日韩人成综合在线播放 | 国产无套粉嫩白浆在线 | 国产无遮挡吃胸膜奶免费看 | 国产成人综合美国十次 | 国产手机在线αⅴ片无码观看 | 婷婷六月久久综合丁香 | 色一情一乱一伦一视频免费看 | 丰腴饱满的极品熟妇 | 欧美怡红院免费全部视频 | 中文字幕人妻丝袜二区 | 国产成人亚洲综合无码 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 国产精品久久久午夜夜伦鲁鲁 | 久久久婷婷五月亚洲97号色 | 中文字幕精品av一区二区五区 | 精品夜夜澡人妻无码av蜜桃 | 秋霞特色aa大片 | 熟妇人妻中文av无码 | 伊人色综合久久天天小片 | 大屁股大乳丰满人妻 | 午夜精品久久久久久久久 | 日本护士毛茸茸高潮 | 精品水蜜桃久久久久久久 | 国产女主播喷水视频在线观看 | 国产午夜无码视频在线观看 | 成人一区二区免费视频 | 国产av一区二区三区最新精品 | 激情内射日本一区二区三区 | 国产 浪潮av性色四虎 | 国内丰满熟女出轨videos | 国产内射老熟女aaaa | 国产莉萝无码av在线播放 | 色综合久久中文娱乐网 | 中文无码成人免费视频在线观看 | 少妇人妻av毛片在线看 | 成人免费视频视频在线观看 免费 | 久久精品国产99精品亚洲 | 色综合视频一区二区三区 | 亚洲精品一区二区三区在线 | 日欧一片内射va在线影院 | 少妇厨房愉情理9仑片视频 | 丰满少妇弄高潮了www | 国产成人无码一二三区视频 | 丰满诱人的人妻3 | 97久久精品无码一区二区 | 国产乱人偷精品人妻a片 | 中文字幕+乱码+中文字幕一区 | 日韩精品久久久肉伦网站 | 欧美大屁股xxxxhd黑色 | 国产特级毛片aaaaaa高潮流水 | 1000部夫妻午夜免费 | 综合人妻久久一区二区精品 | 国产成人av免费观看 | 玩弄人妻少妇500系列视频 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 亚洲天堂2017无码中文 | 未满成年国产在线观看 | 亚洲一区二区观看播放 | 3d动漫精品啪啪一区二区中 | 又大又黄又粗又爽的免费视频 | 97资源共享在线视频 | 日韩精品成人一区二区三区 | 久久国产36精品色熟妇 | 中文毛片无遮挡高清免费 | 国产亚洲视频中文字幕97精品 | 一本大道久久东京热无码av | 精品熟女少妇av免费观看 | 国产激情综合五月久久 | 亚洲精品一区二区三区四区五区 | 国产精品理论片在线观看 | 中文字幕无码av激情不卡 | 无码精品国产va在线观看dvd | 久久综合网欧美色妞网 | 欧美日韩久久久精品a片 | 久久精品中文字幕大胸 | 熟妇人妻无乱码中文字幕 | 日韩精品无码一区二区中文字幕 | 欧美日韩色另类综合 | 偷窥日本少妇撒尿chinese | 久久国产劲爆∧v内射 | 国产精品高潮呻吟av久久 | 亚洲欧美日韩国产精品一区二区 | 国产成人无码av一区二区 | 午夜丰满少妇性开放视频 | 国产免费久久精品国产传媒 | 久久99精品国产麻豆 | 亚洲无人区午夜福利码高清完整版 | 亚洲精品中文字幕乱码 | 偷窥日本少妇撒尿chinese | 300部国产真实乱 | 97精品国产97久久久久久免费 | 久久亚洲中文字幕精品一区 | 国产成人无码av一区二区 | 综合人妻久久一区二区精品 | 精品无码一区二区三区爱欲 | 久久综合香蕉国产蜜臀av | 欧美丰满少妇xxxx性 | 性欧美熟妇videofreesex | 少女韩国电视剧在线观看完整 | 成人精品视频一区二区 | 欧美丰满老熟妇xxxxx性 | 蜜臀aⅴ国产精品久久久国产老师 | 亚洲成av人片在线观看无码不卡 | 乱码午夜-极国产极内射 | 老熟女重囗味hdxx69 | 国产精品久久国产精品99 | 高清无码午夜福利视频 | 老头边吃奶边弄进去呻吟 | 四虎永久在线精品免费网址 | 亚洲第一无码av无码专区 | 三上悠亚人妻中文字幕在线 | 亚洲 另类 在线 欧美 制服 | 四虎永久在线精品免费网址 | 精品日本一区二区三区在线观看 | 又色又爽又黄的美女裸体网站 | 日本熟妇人妻xxxxx人hd | 又大又硬又黄的免费视频 | 欧美精品国产综合久久 | 300部国产真实乱 | 色欲久久久天天天综合网精品 | 乌克兰少妇xxxx做受 | 亚洲另类伦春色综合小说 | 成人性做爰aaa片免费看不忠 | 老熟妇乱子伦牲交视频 | 亚洲国产午夜精品理论片 | 欧美国产日韩亚洲中文 | 男女爱爱好爽视频免费看 | 久久久久免费精品国产 | 一区二区传媒有限公司 | 日韩欧美中文字幕在线三区 | 国语自产偷拍精品视频偷 | 国产精品无码成人午夜电影 | 无码成人精品区在线观看 | 国产精品福利视频导航 | 日本乱偷人妻中文字幕 | 少妇被黑人到高潮喷出白浆 | 老子影院午夜伦不卡 | 国产精品对白交换视频 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 四十如虎的丰满熟妇啪啪 | 婷婷六月久久综合丁香 | 亚洲人成影院在线观看 | 奇米影视7777久久精品 | 国产精品亚洲а∨无码播放麻豆 | 色老头在线一区二区三区 | 狠狠色欧美亚洲狠狠色www | 成人精品视频一区二区 | 丰满少妇人妻久久久久久 | 亚洲区小说区激情区图片区 | 丝袜美腿亚洲一区二区 | 亚洲成a人一区二区三区 | 欧美三级不卡在线观看 | 国産精品久久久久久久 | 亚洲中文字幕av在天堂 | 天堂久久天堂av色综合 | 日本欧美一区二区三区乱码 | 高潮喷水的毛片 | 99久久亚洲精品无码毛片 | 欧美35页视频在线观看 | 波多野结衣高清一区二区三区 | 亚洲性无码av中文字幕 | 97精品国产97久久久久久免费 | 亚洲精品久久久久久一区二区 | 欧美自拍另类欧美综合图片区 | 在线欧美精品一区二区三区 | 亚洲国产欧美日韩精品一区二区三区 | 无码人妻精品一区二区三区不卡 | 少妇被黑人到高潮喷出白浆 | 精品久久久无码中文字幕 | 少女韩国电视剧在线观看完整 | 十八禁真人啪啪免费网站 | 中文字幕 亚洲精品 第1页 | 亚洲aⅴ无码成人网站国产app | 露脸叫床粗话东北少妇 | 在教室伦流澡到高潮hnp视频 | 久久精品女人的天堂av | 俺去俺来也在线www色官网 | 成人欧美一区二区三区 | 日日躁夜夜躁狠狠躁 | 精品无码成人片一区二区98 | 久久综合狠狠综合久久综合88 | 色欲综合久久中文字幕网 | 又大又紧又粉嫩18p少妇 | 一本久道久久综合婷婷五月 | 国产精品国产三级国产专播 | 97精品人妻一区二区三区香蕉 | 搡女人真爽免费视频大全 | 日本又色又爽又黄的a片18禁 | 国产乡下妇女做爰 | 久久久久久久人妻无码中文字幕爆 | 欧美三级不卡在线观看 | 国产99久久精品一区二区 | 国产无套粉嫩白浆在线 | 麻豆国产人妻欲求不满谁演的 | 无码帝国www无码专区色综合 | 色欲久久久天天天综合网精品 | 精品乱子伦一区二区三区 | 久久精品女人天堂av免费观看 | 国产精品久久久av久久久 | 亚洲狠狠婷婷综合久久 | 国产精品-区区久久久狼 | 成人欧美一区二区三区 | 亚洲欧美色中文字幕在线 | 欧美 丝袜 自拍 制服 另类 | 亚洲无人区午夜福利码高清完整版 | 精品水蜜桃久久久久久久 | 国产激情综合五月久久 | 青草视频在线播放 | 日日摸夜夜摸狠狠摸婷婷 | 国产成人人人97超碰超爽8 | 青青草原综合久久大伊人精品 | 三上悠亚人妻中文字幕在线 | 少妇无码吹潮 | 日本一本二本三区免费 | 国产午夜精品一区二区三区嫩草 | 国产成人无码一二三区视频 | 精品久久久久久人妻无码中文字幕 | 女人被男人躁得好爽免费视频 | 人人妻在人人 | 无码乱肉视频免费大全合集 | 中文字幕色婷婷在线视频 | 国产精品久久久久久久影院 | 亚洲日韩中文字幕在线播放 | 东京无码熟妇人妻av在线网址 | 中文字幕乱妇无码av在线 | 国产人成高清在线视频99最全资源 | 牲欲强的熟妇农村老妇女视频 | 国产特级毛片aaaaaa高潮流水 | 伊人久久大香线蕉亚洲 | 人妻少妇精品久久 | 美女黄网站人色视频免费国产 | 又大又紧又粉嫩18p少妇 | 狠狠cao日日穞夜夜穞av | 老子影院午夜伦不卡 | 国产在热线精品视频 | 欧美性生交活xxxxxdddd | 夜夜躁日日躁狠狠久久av | 日本爽爽爽爽爽爽在线观看免 | 欧美激情一区二区三区成人 | 日韩av激情在线观看 | 99久久人妻精品免费一区 | 2019nv天堂香蕉在线观看 | 成人精品一区二区三区中文字幕 | 亚洲欧美日韩综合久久久 | 东京一本一道一二三区 | 中文字幕无码av激情不卡 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 日韩精品无码一本二本三本色 | 欧美日韩久久久精品a片 | 国产精品久久久午夜夜伦鲁鲁 | 熟女体下毛毛黑森林 | 精品 日韩 国产 欧美 视频 | 天天爽夜夜爽夜夜爽 | a国产一区二区免费入口 | 亚洲综合久久一区二区 | 精品国产一区二区三区四区在线看 | 日产国产精品亚洲系列 | 日本成熟视频免费视频 | 青春草在线视频免费观看 | 欧美日韩视频无码一区二区三 | 成人免费视频一区二区 | 丰满诱人的人妻3 | 国产一区二区三区四区五区加勒比 | 亚洲成色www久久网站 | 黄网在线观看免费网站 | 300部国产真实乱 | 国产精品99爱免费视频 | 久久精品女人天堂av免费观看 | 高中生自慰www网站 | 色综合久久久久综合一本到桃花网 | 国产成人一区二区三区在线观看 | 亚洲国产日韩a在线播放 | 中文字幕 亚洲精品 第1页 | 丰满肥臀大屁股熟妇激情视频 | 色狠狠av一区二区三区 | 国产三级精品三级男人的天堂 | 久久天天躁狠狠躁夜夜免费观看 | 久久亚洲中文字幕无码 | 日韩视频 中文字幕 视频一区 | 日韩视频 中文字幕 视频一区 | 强开小婷嫩苞又嫩又紧视频 | 日日摸夜夜摸狠狠摸婷婷 | 我要看www免费看插插视频 | 欧洲极品少妇 | 亚洲精品无码人妻无码 | 国产精品无套呻吟在线 | 成年美女黄网站色大免费全看 | 中文字幕无码人妻少妇免费 | 少妇被粗大的猛进出69影院 | 久久久精品国产sm最大网站 | 久久久亚洲欧洲日产国码αv | 无码成人精品区在线观看 | 一个人看的视频www在线 | 午夜精品一区二区三区的区别 | 精品国产国产综合精品 | 色欲久久久天天天综合网精品 | 成人性做爰aaa片免费看不忠 | 欧美人与物videos另类 | 自拍偷自拍亚洲精品10p | 97人妻精品一区二区三区 | 国产极品视觉盛宴 | 激情内射亚州一区二区三区爱妻 | 午夜精品一区二区三区在线观看 | 男人的天堂av网站 | 无码人妻丰满熟妇区毛片18 | 狠狠cao日日穞夜夜穞av | 九一九色国产 | 欧美乱妇无乱码大黄a片 | 国产精品成人av在线观看 | 国产精品久久久久7777 | 在线а√天堂中文官网 | 丁香花在线影院观看在线播放 | 日韩 欧美 动漫 国产 制服 | 2020久久香蕉国产线看观看 | 久久99精品久久久久婷婷 | 人妻尝试又大又粗久久 | 久久www免费人成人片 | 午夜理论片yy44880影院 | 国产精品视频免费播放 | 国产明星裸体无码xxxx视频 | 麻豆国产丝袜白领秘书在线观看 | 中文字幕av伊人av无码av | 5858s亚洲色大成网站www | 国产成人无码一二三区视频 | 国产香蕉尹人综合在线观看 | 狠狠色噜噜狠狠狠7777奇米 | 免费观看激色视频网站 | 内射巨臀欧美在线视频 | 亚洲日韩av一区二区三区四区 | 九月婷婷人人澡人人添人人爽 | 国产香蕉尹人综合在线观看 | 国产成人精品久久亚洲高清不卡 | 欧美人与禽猛交狂配 | 欧美熟妇另类久久久久久不卡 | 无码人妻久久一区二区三区不卡 | 天天躁夜夜躁狠狠是什么心态 | 人人妻人人澡人人爽欧美一区九九 | 秋霞成人午夜鲁丝一区二区三区 | 久久精品一区二区三区四区 | 精品国偷自产在线视频 | 青青青手机频在线观看 | 内射爽无广熟女亚洲 | 欧美国产日产一区二区 | 久久久成人毛片无码 | 久久精品中文闷骚内射 | 日韩av无码一区二区三区 | 国产精品对白交换视频 | 麻花豆传媒剧国产免费mv在线 | 亚洲の无码国产の无码影院 | 国产又粗又硬又大爽黄老大爷视 | 国产又爽又猛又粗的视频a片 | 精品人人妻人人澡人人爽人人 | 亚洲国产精品一区二区第一页 | 亚洲成a人片在线观看无码 | 99精品国产综合久久久久五月天 | 熟女少妇在线视频播放 | 欧美日韩一区二区免费视频 | 黄网在线观看免费网站 | 久久熟妇人妻午夜寂寞影院 | 精品国精品国产自在久国产87 | 婷婷丁香六月激情综合啪 | 四虎4hu永久免费 | 人人妻人人澡人人爽人人精品浪潮 | 欧美性色19p | 国产亚洲精品精品国产亚洲综合 | 日本www一道久久久免费榴莲 | 天天摸天天碰天天添 | 99久久无码一区人妻 | 成人动漫在线观看 | 一本精品99久久精品77 | 国产97人人超碰caoprom | 人妻有码中文字幕在线 | 亚洲精品一区国产 | 99久久无码一区人妻 | 狠狠亚洲超碰狼人久久 | 97资源共享在线视频 | 国产人妻人伦精品 | 国产精品.xx视频.xxtv | 帮老师解开蕾丝奶罩吸乳网站 | 国产精品亚洲专区无码不卡 | 水蜜桃亚洲一二三四在线 | 狠狠色噜噜狠狠狠狠7777米奇 | 1000部啪啪未满十八勿入下载 | 香港三级日本三级妇三级 | 水蜜桃亚洲一二三四在线 | 欧美精品国产综合久久 | 露脸叫床粗话东北少妇 | 图片小说视频一区二区 | 无码精品国产va在线观看dvd | 久久精品中文字幕一区 | 国产成人一区二区三区别 | 永久免费观看美女裸体的网站 | 乌克兰少妇xxxx做受 | 国产精品久久久久9999小说 | 青青草原综合久久大伊人精品 | 久久亚洲精品中文字幕无男同 | 国产尤物精品视频 | 亚洲精品成人福利网站 | 亚洲色www成人永久网址 | 少妇被黑人到高潮喷出白浆 | 精品人妻av区 | 国产 精品 自在自线 | 亚洲男女内射在线播放 | 性生交大片免费看女人按摩摩 | 九九在线中文字幕无码 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 国产午夜福利亚洲第一 | 黑人大群体交免费视频 | 伦伦影院午夜理论片 | 国产疯狂伦交大片 | 欧洲极品少妇 | 99久久精品国产一区二区蜜芽 | 日韩精品无码一区二区中文字幕 | 亚洲小说春色综合另类 | 亚洲精品午夜国产va久久成人 | 亚洲乱码中文字幕在线 | 亚洲精品中文字幕久久久久 | 日韩精品无码一区二区中文字幕 | 国产免费观看黄av片 | 久久www免费人成人片 | 国色天香社区在线视频 | 亚洲va欧美va天堂v国产综合 | 人妻体内射精一区二区三四 | 国产午夜无码视频在线观看 | 国产熟妇高潮叫床视频播放 | 特级做a爰片毛片免费69 | 国产精品久久久av久久久 | 曰韩少妇内射免费播放 | 爽爽影院免费观看 | 亚洲欧美精品伊人久久 | av香港经典三级级 在线 | 波多野42部无码喷潮在线 | 蜜臀av无码人妻精品 | 麻豆md0077饥渴少妇 | 麻豆国产丝袜白领秘书在线观看 | 欧美性猛交内射兽交老熟妇 | 国产又粗又硬又大爽黄老大爷视 | 亚洲欧洲日本综合aⅴ在线 | 大地资源网第二页免费观看 | 亚洲区小说区激情区图片区 | 久久久av男人的天堂 | 亚洲日韩一区二区 | 亚洲成a人片在线观看无码3d | 一二三四社区在线中文视频 | 精品欧洲av无码一区二区三区 | 最近免费中文字幕中文高清百度 | 成人影院yy111111在线观看 | 精品久久久久久亚洲精品 | 六月丁香婷婷色狠狠久久 | 日日摸天天摸爽爽狠狠97 | 一本久久a久久精品亚洲 | 久久久久久久久蜜桃 | 中文字幕无码免费久久9一区9 | 亚洲欧美精品伊人久久 | 欧美freesex黑人又粗又大 | 国产无av码在线观看 | 人妻插b视频一区二区三区 | 国产做国产爱免费视频 | 国产又爽又猛又粗的视频a片 | av无码电影一区二区三区 | 日欧一片内射va在线影院 | 国产真人无遮挡作爱免费视频 | 自拍偷自拍亚洲精品被多人伦好爽 | 国产精品igao视频网 | 无遮挡啪啪摇乳动态图 | 99久久精品国产一区二区蜜芽 | 亚洲熟女一区二区三区 | 国产suv精品一区二区五 | 午夜理论片yy44880影院 | 亚洲欧洲无卡二区视頻 | 领导边摸边吃奶边做爽在线观看 | 国产午夜福利100集发布 | 欧美日韩视频无码一区二区三 | 亚洲国产精品无码久久久久高潮 | 国产精品资源一区二区 | 日韩成人一区二区三区在线观看 | 国产精品毛片一区二区 | 动漫av一区二区在线观看 | 亚洲国产欧美日韩精品一区二区三区 | 黑人巨大精品欧美黑寡妇 | 性啪啪chinese东北女人 | 日韩精品一区二区av在线 | 国产香蕉尹人视频在线 | 欧美日韩视频无码一区二区三 | 国产精品二区一区二区aⅴ污介绍 | 牲欲强的熟妇农村老妇女视频 | 又大又黄又粗又爽的免费视频 | 欧美丰满熟妇xxxx | 欧美人与禽zoz0性伦交 | 亚洲综合久久一区二区 | 欧美日韩视频无码一区二区三 | 日产精品99久久久久久 | 综合人妻久久一区二区精品 | 国产乱人伦偷精品视频 | 精品一区二区三区无码免费视频 | 精品无人国产偷自产在线 | 99久久精品国产一区二区蜜芽 | 少妇性荡欲午夜性开放视频剧场 | 伊人久久大香线蕉午夜 | 国产人妻精品一区二区三区不卡 | 97久久精品无码一区二区 | 亚洲精品综合五月久久小说 | 亚洲日韩av一区二区三区中文 | 在线视频网站www色 | 粗大的内捧猛烈进出视频 | 亚洲精品一区二区三区大桥未久 | 色妞www精品免费视频 | 中文字幕无线码免费人妻 | 免费观看黄网站 | 荡女精品导航 | 久久99精品国产麻豆蜜芽 | 国产精品理论片在线观看 | 欧美真人作爱免费视频 | 蜜臀aⅴ国产精品久久久国产老师 | 黑人粗大猛烈进出高潮视频 | 无码国产乱人伦偷精品视频 | 国产69精品久久久久app下载 | 麻豆av传媒蜜桃天美传媒 | 国产真实乱对白精彩久久 | 狂野欧美性猛xxxx乱大交 | 日韩av无码中文无码电影 | 国产成人无码午夜视频在线观看 | 内射老妇bbwx0c0ck | 日韩精品a片一区二区三区妖精 | 欧美午夜特黄aaaaaa片 | 77777熟女视频在线观看 а天堂中文在线官网 | 亚洲中文字幕无码中字 | 又大又硬又爽免费视频 | 99精品视频在线观看免费 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 日韩欧美中文字幕在线三区 | 青春草在线视频免费观看 | 久久99国产综合精品 | 无码人妻精品一区二区三区不卡 | 国产精品久久精品三级 | 亚洲国产精品久久人人爱 | 亚洲日韩av一区二区三区四区 | 国产福利视频一区二区 | 国产成人无码区免费内射一片色欲 | 色欲久久久天天天综合网精品 | 国产无套粉嫩白浆在线 | 国产亚av手机在线观看 | 欧美三级不卡在线观看 | 亚洲成av人片天堂网无码】 | 未满成年国产在线观看 | 娇妻被黑人粗大高潮白浆 | 亚洲成色在线综合网站 | 久久精品国产一区二区三区 | 最近免费中文字幕中文高清百度 | 久久久久久久女国产乱让韩 | 综合激情五月综合激情五月激情1 | 色一情一乱一伦一区二区三欧美 | 国产成人综合色在线观看网站 | 日日麻批免费40分钟无码 | 国产人妻精品一区二区三区不卡 | 久久久久99精品国产片 | 中文字幕av无码一区二区三区电影 | 国产农村妇女高潮大叫 | 中文字幕亚洲情99在线 | 亚洲欧美国产精品久久 | 激情内射亚州一区二区三区爱妻 | 亚洲阿v天堂在线 | 日本熟妇大屁股人妻 | 东北女人啪啪对白 | 亚洲精品一区二区三区大桥未久 | 亚洲精品无码国产 | 蜜臀aⅴ国产精品久久久国产老师 | 精品乱码久久久久久久 | 日日摸日日碰夜夜爽av | 精品久久久久香蕉网 | 色狠狠av一区二区三区 | 亚洲s色大片在线观看 | 亚洲日韩乱码中文无码蜜桃臀网站 | 性开放的女人aaa片 | 曰韩少妇内射免费播放 | 55夜色66夜色国产精品视频 | 日韩精品无码免费一区二区三区 | 久久99久久99精品中文字幕 | 亚洲人亚洲人成电影网站色 | 国产成人精品无码播放 | 无遮无挡爽爽免费视频 | 久青草影院在线观看国产 | 久久精品国产日本波多野结衣 | 日韩av无码一区二区三区不卡 | 无码一区二区三区在线观看 | 青青久在线视频免费观看 | 国产精品第一区揄拍无码 | 无遮挡国产高潮视频免费观看 | 亚洲成av人片天堂网无码】 | 亚洲一区二区观看播放 | 亚洲综合无码久久精品综合 | 国产精品久久久久久久影院 | 激情五月综合色婷婷一区二区 | 久久久国产精品无码免费专区 | 无码人妻丰满熟妇区毛片18 | 国产小呦泬泬99精品 | 欧美激情一区二区三区成人 | 午夜福利一区二区三区在线观看 | 免费播放一区二区三区 | 国产精品无码一区二区桃花视频 | 欧美freesex黑人又粗又大 | 亚洲色偷偷男人的天堂 | 亚洲人成影院在线无码按摩店 | 久久精品国产99久久6动漫 | 亚洲va中文字幕无码久久不卡 | 人人妻人人澡人人爽欧美精品 | 一本一道久久综合久久 | 国产偷自视频区视频 | 在线a亚洲视频播放在线观看 | 人妻插b视频一区二区三区 | 国产免费久久精品国产传媒 | 久久综合九色综合欧美狠狠 | 亚洲 另类 在线 欧美 制服 | 水蜜桃亚洲一二三四在线 | 日韩av无码中文无码电影 | 日韩亚洲欧美精品综合 | 国产精品亚洲专区无码不卡 | 中文字幕无码人妻少妇免费 | 国内精品一区二区三区不卡 | 亚洲 激情 小说 另类 欧美 | 国产人妻人伦精品 | 国产亚洲人成a在线v网站 | 日韩av无码一区二区三区不卡 | 人妻中文无码久热丝袜 | 少妇激情av一区二区 | 国产香蕉尹人综合在线观看 | 18无码粉嫩小泬无套在线观看 | 欧美 亚洲 国产 另类 | 精品国产成人一区二区三区 | 国产午夜福利亚洲第一 | 国产av无码专区亚洲a∨毛片 | 无码人妻丰满熟妇区五十路百度 | 天堂一区人妻无码 | 国产av无码专区亚洲awww | 国产凸凹视频一区二区 | 99久久精品国产一区二区蜜芽 | 国产97色在线 | 免 | 亚洲成a人片在线观看无码3d | 久久久久国色av免费观看性色 | 无码福利日韩神码福利片 | av香港经典三级级 在线 | 国产农村妇女高潮大叫 | 久久精品人人做人人综合 | 亚洲色在线无码国产精品不卡 | 欧美乱妇无乱码大黄a片 | 国产精品久久久久7777 | 亚洲国产成人av在线观看 | 国产av无码专区亚洲awww | 亚洲无人区午夜福利码高清完整版 | 精品水蜜桃久久久久久久 | 欧美日韩在线亚洲综合国产人 | 波多野结衣aⅴ在线 | 精品 日韩 国产 欧美 视频 | 黑人玩弄人妻中文在线 | 亚洲成a人片在线观看无码 | 亚洲国产精品无码一区二区三区 | 久久人妻内射无码一区三区 | 老子影院午夜精品无码 | 国产婷婷色一区二区三区在线 | 国产电影无码午夜在线播放 | 乱人伦人妻中文字幕无码久久网 | 久久无码中文字幕免费影院蜜桃 | 日韩精品a片一区二区三区妖精 | 国产精品igao视频网 | 99久久人妻精品免费一区 | 乱中年女人伦av三区 | 女人被爽到呻吟gif动态图视看 | 妺妺窝人体色www婷婷 | 国精产品一区二区三区 | 久久久久av无码免费网 | 精品aⅴ一区二区三区 | 久久精品中文闷骚内射 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 亚洲高清偷拍一区二区三区 | 欧美国产亚洲日韩在线二区 | 色婷婷欧美在线播放内射 | 色综合久久久无码中文字幕 | 人妻无码αv中文字幕久久琪琪布 | 亚洲色欲久久久综合网东京热 | 中文字幕乱码中文乱码51精品 | 欧美日韩久久久精品a片 | 夜夜躁日日躁狠狠久久av | 熟妇激情内射com | 欧美乱妇无乱码大黄a片 | 伊人久久大香线蕉av一区二区 | 999久久久国产精品消防器材 | 亚洲精品国偷拍自产在线麻豆 | 少女韩国电视剧在线观看完整 | 亚洲欧美精品aaaaaa片 | 精品欧洲av无码一区二区三区 | 国产乡下妇女做爰 | 免费看男女做好爽好硬视频 | 国产精品久久久久影院嫩草 | 国产精品高潮呻吟av久久4虎 | 日日摸日日碰夜夜爽av | 国内精品久久久久久中文字幕 | 男女下面进入的视频免费午夜 | 国产成人精品久久亚洲高清不卡 | 久久久久免费精品国产 | 久久久精品人妻久久影视 | 婷婷五月综合激情中文字幕 | 国产午夜福利亚洲第一 | 福利一区二区三区视频在线观看 | 丝袜美腿亚洲一区二区 | 在线亚洲高清揄拍自拍一品区 | 国产成人无码区免费内射一片色欲 | 免费国产黄网站在线观看 | 日欧一片内射va在线影院 | 免费人成在线视频无码 | 日本高清一区免费中文视频 | 伊人久久婷婷五月综合97色 | 人妻少妇精品视频专区 | 欧美日韩一区二区免费视频 | 国内精品一区二区三区不卡 | 久久精品99久久香蕉国产色戒 | 兔费看少妇性l交大片免费 | 无码一区二区三区在线观看 | 亚洲日本一区二区三区在线 | 久久久久99精品成人片 | 奇米影视7777久久精品人人爽 | 人妻少妇精品久久 | 国产超碰人人爽人人做人人添 | 精品无码一区二区三区的天堂 | 国产精品亚洲综合色区韩国 | 奇米影视888欧美在线观看 | 精品国产av色一区二区深夜久久 | av人摸人人人澡人人超碰下载 | 黑人粗大猛烈进出高潮视频 | 99久久亚洲精品无码毛片 | 久久久久久久久888 | 国产女主播喷水视频在线观看 | 国产内射爽爽大片视频社区在线 | 欧美丰满老熟妇xxxxx性 | 狠狠色噜噜狠狠狠狠7777米奇 | 少妇性俱乐部纵欲狂欢电影 | a片免费视频在线观看 | 国产精品国产自线拍免费软件 | 性史性农村dvd毛片 | 人妻有码中文字幕在线 | 狠狠cao日日穞夜夜穞av | 无遮无挡爽爽免费视频 | 亚洲国产精品成人久久蜜臀 | 国产亚洲人成a在线v网站 | 色欲久久久天天天综合网精品 | 久久综合给合久久狠狠狠97色 | 亚洲欧洲日本无在线码 | 无码人妻黑人中文字幕 | 久久精品女人天堂av免费观看 | 鲁大师影院在线观看 | 国产电影无码午夜在线播放 | 狠狠亚洲超碰狼人久久 | 蜜臀av在线播放 久久综合激激的五月天 | 97精品人妻一区二区三区香蕉 | 亚洲日韩av片在线观看 | 日韩精品无码一区二区中文字幕 | 牲欲强的熟妇农村老妇女 | 高潮毛片无遮挡高清免费视频 | 免费看少妇作爱视频 | 成在人线av无码免费 | 亚洲综合无码久久精品综合 | 久久熟妇人妻午夜寂寞影院 | 久久这里只有精品视频9 | 亚洲区小说区激情区图片区 | 欧美国产日产一区二区 | 中文字幕亚洲情99在线 | 国产精品高潮呻吟av久久4虎 | 亚洲乱码日产精品bd | 熟女体下毛毛黑森林 | 中文字幕乱码人妻二区三区 | 亚洲一区二区三区四区 | 精品成人av一区二区三区 | 少妇一晚三次一区二区三区 | 大肉大捧一进一出好爽视频 | av香港经典三级级 在线 | 中文字幕无码日韩专区 | 好男人www社区 | 国产精品99爱免费视频 | 麻豆精产国品 | 国产精品久久国产三级国 | 激情五月综合色婷婷一区二区 | 国产午夜亚洲精品不卡下载 | 色婷婷香蕉在线一区二区 | 久久伊人色av天堂九九小黄鸭 | 亚洲日韩精品欧美一区二区 | 蜜桃视频插满18在线观看 | 成在人线av无码免观看麻豆 | 又大又黄又粗又爽的免费视频 | 色偷偷人人澡人人爽人人模 | 丰腴饱满的极品熟妇 | 国产在线精品一区二区三区直播 | 欧美精品国产综合久久 | 国产艳妇av在线观看果冻传媒 | 理论片87福利理论电影 | 亚洲精品国偷拍自产在线观看蜜桃 | 东京热一精品无码av | 色婷婷综合中文久久一本 | 色五月五月丁香亚洲综合网 | 亚洲一区二区三区四区 | 亚洲毛片av日韩av无码 | 国产精品久久久av久久久 | 性欧美大战久久久久久久 | 久久精品国产大片免费观看 | 黑森林福利视频导航 | 中文无码成人免费视频在线观看 | 婷婷丁香五月天综合东京热 | 老司机亚洲精品影院 | 真人与拘做受免费视频 | 正在播放东北夫妻内射 | 成人aaa片一区国产精品 | 成人亚洲精品久久久久 | 桃花色综合影院 | 欧美大屁股xxxxhd黑色 | 国产无遮挡吃胸膜奶免费看 | 欧美熟妇另类久久久久久多毛 | 无码人妻精品一区二区三区下载 | 人妻插b视频一区二区三区 | 啦啦啦www在线观看免费视频 | 精品国产一区二区三区四区在线看 | 日韩人妻系列无码专区 | 四虎影视成人永久免费观看视频 | 国产精品18久久久久久麻辣 | 亚洲成a人片在线观看无码3d | 国产黄在线观看免费观看不卡 | 午夜福利不卡在线视频 | 日韩欧美群交p片內射中文 | 国产成人久久精品流白浆 | 日日摸夜夜摸狠狠摸婷婷 | 欧美人与禽猛交狂配 | 欧美色就是色 | 亚洲综合无码一区二区三区 | 精品无码国产自产拍在线观看蜜 | 综合人妻久久一区二区精品 | 高潮毛片无遮挡高清免费视频 | 久久久无码中文字幕久... | 在线精品国产一区二区三区 | 男人扒开女人内裤强吻桶进去 | 午夜福利一区二区三区在线观看 | 中文字幕无码乱人伦 | 欧美精品国产综合久久 | 日本欧美一区二区三区乱码 | 亚洲日本一区二区三区在线 | 久久久精品456亚洲影院 | 亚洲 欧美 激情 小说 另类 | 久久天天躁狠狠躁夜夜免费观看 | 国产亚洲tv在线观看 | 97久久超碰中文字幕 | 亚洲色欲色欲天天天www | 精品日本一区二区三区在线观看 | 国产艳妇av在线观看果冻传媒 | 四虎国产精品一区二区 | 国精产品一品二品国精品69xx | 国产极品美女高潮无套在线观看 | 女人被爽到呻吟gif动态图视看 | 亚洲国产高清在线观看视频 | 国产人妻精品午夜福利免费 | 狂野欧美性猛交免费视频 | 精品国产精品久久一区免费式 | 欧美黑人巨大xxxxx | 亚洲最大成人网站 | 亚洲自偷自偷在线制服 | 国产成人精品三级麻豆 | 色偷偷人人澡人人爽人人模 | 99精品无人区乱码1区2区3区 | 小鲜肉自慰网站xnxx | 亚洲国产精品美女久久久久 | 婷婷五月综合激情中文字幕 | 精品国产成人一区二区三区 | 人人妻人人澡人人爽精品欧美 | 中文字幕日韩精品一区二区三区 | 成 人 免费观看网站 | 中文字幕亚洲情99在线 | 亚洲色无码一区二区三区 | 欧洲vodafone精品性 | 欧美丰满少妇xxxx性 | 无遮无挡爽爽免费视频 | 漂亮人妻洗澡被公强 日日躁 | 国产成人精品视频ⅴa片软件竹菊 | 伊人久久大香线蕉亚洲 | 激情亚洲一区国产精品 | 中文字幕无线码免费人妻 | 麻豆国产人妻欲求不满谁演的 | 内射白嫩少妇超碰 | 国产精品美女久久久网av | 国产午夜手机精彩视频 | 国产乡下妇女做爰 | 久激情内射婷内射蜜桃人妖 | 亚洲va中文字幕无码久久不卡 | 麻豆蜜桃av蜜臀av色欲av | 成年女人永久免费看片 | 天天躁日日躁狠狠躁免费麻豆 | 国内精品人妻无码久久久影院 | 激情爆乳一区二区三区 | 1000部啪啪未满十八勿入下载 | 少妇激情av一区二区 | 久久99热只有频精品8 | 无码毛片视频一区二区本码 | 久久午夜无码鲁丝片午夜精品 | 久久久久99精品成人片 | 少妇高潮一区二区三区99 | 天天躁夜夜躁狠狠是什么心态 | 日本在线高清不卡免费播放 | 日本高清一区免费中文视频 | 中国大陆精品视频xxxx | 小sao货水好多真紧h无码视频 | 99久久精品日本一区二区免费 | 99国产欧美久久久精品 | 丰满肥臀大屁股熟妇激情视频 | 精品无码国产一区二区三区av | 亚洲国产精品一区二区第一页 | 午夜时刻免费入口 | 十八禁真人啪啪免费网站 | 熟妇人妻中文av无码 | 男女超爽视频免费播放 | 国产成人无码av片在线观看不卡 | 国产亚洲tv在线观看 | 欧美真人作爱免费视频 | 国产精品18久久久久久麻辣 | 婷婷综合久久中文字幕蜜桃三电影 | 久久 国产 尿 小便 嘘嘘 | 久久综合久久自在自线精品自 | 国产特级毛片aaaaaaa高清 | 国内精品九九久久久精品 | 亚洲综合精品香蕉久久网 | 亚洲精品成a人在线观看 | 天天爽夜夜爽夜夜爽 | 亚洲一区二区三区含羞草 | 午夜精品久久久内射近拍高清 | 国产精品美女久久久网av | 特大黑人娇小亚洲女 | 精品夜夜澡人妻无码av蜜桃 | 精品厕所偷拍各类美女tp嘘嘘 | 无码国产色欲xxxxx视频 | 免费观看激色视频网站 | 国产一区二区三区四区五区加勒比 | 日日碰狠狠躁久久躁蜜桃 | 国产激情一区二区三区 | 黄网在线观看免费网站 | 国产成人综合在线女婷五月99播放 | 一本加勒比波多野结衣 | 女人高潮内射99精品 | 精品无码av一区二区三区 | 国产精品亚洲lv粉色 | 久久婷婷五月综合色国产香蕉 | 天堂а√在线地址中文在线 | 亚洲精品午夜无码电影网 | 大屁股大乳丰满人妻 | 午夜精品久久久内射近拍高清 | 蜜桃无码一区二区三区 | 欧美激情一区二区三区成人 | 久久精品中文字幕一区 | 免费看少妇作爱视频 | 少妇高潮一区二区三区99 | 色欲久久久天天天综合网精品 | 少妇人妻av毛片在线看 | 久久99精品国产麻豆蜜芽 | 美女黄网站人色视频免费国产 | 人人澡人人透人人爽 | 国内精品人妻无码久久久影院 | 久久99精品久久久久久动态图 | 久久久中文久久久无码 | 国产精品无码永久免费888 | 亚洲 欧美 激情 小说 另类 | 综合激情五月综合激情五月激情1 | 一个人免费观看的www视频 | 在线观看欧美一区二区三区 | 激情人妻另类人妻伦 | av人摸人人人澡人人超碰下载 | 国产一区二区三区精品视频 | 俺去俺来也在线www色官网 | 67194成是人免费无码 | 中文字幕 亚洲精品 第1页 | 国产成人一区二区三区别 | 性欧美videos高清精品 | 在线精品亚洲一区二区 | 亚洲欧洲日本无在线码 | 亚洲人成网站免费播放 | 国产一区二区三区精品视频 | 日韩欧美成人免费观看 | 妺妺窝人体色www婷婷 | 国产成人精品久久亚洲高清不卡 | 精品国产乱码久久久久乱码 | 99视频精品全部免费免费观看 | 亚洲色欲色欲天天天www | 人人妻人人澡人人爽欧美一区 | 中文字幕亚洲情99在线 | 欧美人妻一区二区三区 | 亚洲综合无码一区二区三区 | 亚洲日本一区二区三区在线 | 国产xxx69麻豆国语对白 | 欧美黑人性暴力猛交喷水 | 人人爽人人澡人人高潮 | 亚洲成熟女人毛毛耸耸多 | 欧美刺激性大交 | 国产热a欧美热a在线视频 | 无码人妻出轨黑人中文字幕 | 国产精品久久久久久亚洲毛片 | 久久精品国产一区二区三区肥胖 | 久久久久亚洲精品男人的天堂 | 国产成人精品无码播放 | 久久久久亚洲精品中文字幕 | 伊在人天堂亚洲香蕉精品区 | 99re在线播放 | 乱人伦中文视频在线观看 | 国产人妻人伦精品1国产丝袜 | 亚洲天堂2017无码 | 亚洲精品久久久久久久久久久 | 国产亚洲欧美日韩亚洲中文色 | 亚洲欧美中文字幕5发布 | 国产真人无遮挡作爱免费视频 | 色综合久久中文娱乐网 | 亚洲男人av香蕉爽爽爽爽 | 国产精品久久久久久无码 | 中文字幕人成乱码熟女app | 国产精品无套呻吟在线 | 一个人免费观看的www视频 | 日日鲁鲁鲁夜夜爽爽狠狠 | 77777熟女视频在线观看 а天堂中文在线官网 | 一个人看的www免费视频在线观看 | 日本在线高清不卡免费播放 | 亚洲区小说区激情区图片区 | 午夜丰满少妇性开放视频 | 国产成人无码av在线影院 | 亚洲综合色区中文字幕 | 国产成人综合色在线观看网站 | 国産精品久久久久久久 | 无码av最新清无码专区吞精 | 精品一区二区不卡无码av | 日日摸夜夜摸狠狠摸婷婷 | 中文字幕人妻无码一区二区三区 | 亚洲の无码国产の无码步美 | 影音先锋中文字幕无码 | 高清无码午夜福利视频 | 水蜜桃色314在线观看 | 亚洲国产精品无码久久久久高潮 | 国产真实乱对白精彩久久 | 亚洲日韩乱码中文无码蜜桃臀网站 | 亚洲人成人无码网www国产 | 成人影院yy111111在线观看 | 内射巨臀欧美在线视频 | 又大又黄又粗又爽的免费视频 | 奇米影视7777久久精品 | 爱做久久久久久 | 天堂亚洲2017在线观看 | 无码精品国产va在线观看dvd | 免费网站看v片在线18禁无码 | 成年美女黄网站色大免费全看 | 国产人妖乱国产精品人妖 | 内射后入在线观看一区 | 伊人久久大香线焦av综合影院 | 天天爽夜夜爽夜夜爽 | 国产精品人人爽人人做我的可爱 | 国产色精品久久人妻 | 久久视频在线观看精品 | 性做久久久久久久免费看 | 乱码午夜-极国产极内射 | 亚洲自偷自偷在线制服 | 精品国产成人一区二区三区 | 欧美老熟妇乱xxxxx | 少妇被黑人到高潮喷出白浆 | 老头边吃奶边弄进去呻吟 | 波多野结衣av一区二区全免费观看 | 中文字幕乱码人妻二区三区 | 国产高清av在线播放 | 国产在热线精品视频 | 欧美成人高清在线播放 | 永久免费精品精品永久-夜色 | 久久国产精品二国产精品 | 亚洲 另类 在线 欧美 制服 | а√资源新版在线天堂 | 狠狠躁日日躁夜夜躁2020 | 亚洲国产欧美在线成人 | 久久综合给久久狠狠97色 | 色一情一乱一伦一区二区三欧美 | 亚洲a无码综合a国产av中文 | 欧美日韩视频无码一区二区三 | 亚洲最大成人网站 | 亚洲一区二区三区无码久久 | 丰满岳乱妇在线观看中字无码 | 亚洲国产欧美日韩精品一区二区三区 | 国产超碰人人爽人人做人人添 | 伊人久久婷婷五月综合97色 | 中文毛片无遮挡高清免费 | 中文无码精品a∨在线观看不卡 | 久久国产精品偷任你爽任你 | 久久无码中文字幕免费影院蜜桃 | 99久久婷婷国产综合精品青草免费 | 无码任你躁久久久久久久 | 亚洲一区二区三区香蕉 | www国产亚洲精品久久网站 | 鲁鲁鲁爽爽爽在线视频观看 | 国产亚洲欧美日韩亚洲中文色 | 亚洲国产欧美在线成人 | 久久zyz资源站无码中文动漫 | 妺妺窝人体色www在线小说 | 国产精品久免费的黄网站 | 国内精品人妻无码久久久影院 | 无码人妻丰满熟妇区五十路百度 | 中文字幕无码日韩专区 | 在线精品亚洲一区二区 | 亚洲爆乳精品无码一区二区三区 | 高清无码午夜福利视频 | 桃花色综合影院 | 麻花豆传媒剧国产免费mv在线 | 国产真实夫妇视频 | 色婷婷综合中文久久一本 | 午夜福利一区二区三区在线观看 | 国产激情艳情在线看视频 | 狂野欧美激情性xxxx | 久久国产精品萌白酱免费 | 国产欧美亚洲精品a | 色婷婷久久一区二区三区麻豆 | 人人妻人人澡人人爽欧美精品 | 熟妇人妻中文av无码 | 成人一在线视频日韩国产 | 人妻少妇精品久久 | 日韩精品无码一区二区中文字幕 | 亚洲成av人在线观看网址 | 成人亚洲精品久久久久 | 亚洲精品中文字幕乱码 | 丰满少妇熟乱xxxxx视频 | 欧美日本精品一区二区三区 | 国产精品无码一区二区三区不卡 | 亚洲日韩av片在线观看 | 久青草影院在线观看国产 | 日日碰狠狠躁久久躁蜜桃 | 久久视频在线观看精品 | 欧洲熟妇精品视频 | 精品人人妻人人澡人人爽人人 | 正在播放老肥熟妇露脸 | 狂野欧美性猛交免费视频 | 熟女体下毛毛黑森林 | 精品国产av色一区二区深夜久久 | av无码电影一区二区三区 | 在线精品国产一区二区三区 | 亚洲s色大片在线观看 | 伊人久久大香线蕉av一区二区 | 国产97色在线 | 免 | 九九综合va免费看 | 在线精品国产一区二区三区 | 3d动漫精品啪啪一区二区中 | 九九综合va免费看 | 俄罗斯老熟妇色xxxx | 18无码粉嫩小泬无套在线观看 | 亚洲一区二区三区无码久久 | 成熟妇人a片免费看网站 | 午夜理论片yy44880影院 | 国产熟女一区二区三区四区五区 | 欧美freesex黑人又粗又大 | 久久精品丝袜高跟鞋 | 欧美精品国产综合久久 | 日韩少妇内射免费播放 | 免费乱码人妻系列无码专区 | 强开小婷嫩苞又嫩又紧视频 | 3d动漫精品啪啪一区二区中 | 天堂在线观看www | 亚洲国产综合无码一区 | 国产在线精品一区二区三区直播 | 久久99精品国产.久久久久 | 亚洲热妇无码av在线播放 | 日韩少妇白浆无码系列 | 亚洲中文字幕va福利 | 任你躁在线精品免费 | 日韩人妻少妇一区二区三区 | 国产人妻精品一区二区三区不卡 | 国产亚洲美女精品久久久2020 | 久久精品99久久香蕉国产色戒 | 天堂а√在线地址中文在线 | 老熟妇仑乱视频一区二区 | 波多野结衣av一区二区全免费观看 | 日本精品少妇一区二区三区 | 久久综合九色综合97网 | 夜先锋av资源网站 | 无码人妻黑人中文字幕 | 中文精品无码中文字幕无码专区 | www国产精品内射老师 | 亚洲中文字幕无码中文字在线 | 99国产精品白浆在线观看免费 | 5858s亚洲色大成网站www | 精品厕所偷拍各类美女tp嘘嘘 | 欧美人与动性行为视频 | 中文字幕乱码中文乱码51精品 |