原貼地址:http://book.csdn.net/bookfiles/111/1001113461.shtml
一.Spring IOC反轉(zhuǎn)控制 BeanFactory
Spring IoC
設(shè)計(jì)的核心是
org.springframework.beans
包,它的設(shè)計(jì)目標(biāo)是與
JavaBean
組件一起使用。這個(gè)包通常不是由用戶直接使用,而是由服務(wù)器將其用作其他多數(shù)功能的底層中介。下一個(gè)最高級(jí)抽象是
BeanFactory
接口,它是工廠設(shè)計(jì)模式的實(shí)現(xiàn),允許通過(guò)名稱創(chuàng)建和檢索對(duì)象。
BeanFactory
也可以管理對(duì)象之間的關(guān)系。
BeanFactory 支持兩個(gè)對(duì)象模型。
單態(tài)模型:它提供了具有特定名稱的對(duì)象的共享實(shí)例,可以在查詢時(shí)對(duì)其進(jìn)行檢索。 Singleton 是默認(rèn)的也是最常用的對(duì)象模型,對(duì)于無(wú)狀態(tài)服務(wù)對(duì)象很理想。
原型模型:它確保每次檢索都會(huì)創(chuàng)建單獨(dú)的對(duì)象。在每個(gè)用戶都需要自己的對(duì)象時(shí),原型模型最適合。
bean 工廠的概念是 Spring 作為 IoC 容器的基礎(chǔ), IoC 將處理事情的責(zé)任從應(yīng)用程序代碼轉(zhuǎn)移到框架。 Spring 框架使用 JavaBean 屬性和配置數(shù)據(jù)來(lái)指出必須設(shè)置的依賴關(guān)系。
1 . BeanFactory
BeanFactory 實(shí)際上是實(shí)例化,配置和管理眾多 bean 的容器。這些 bean 通常會(huì)彼此合作,因而它們之間會(huì)產(chǎn)生依賴。 BeanFactory 使用的配置數(shù)據(jù)可以反映這些依賴關(guān)系(一些依賴可能不像配置數(shù)據(jù)一樣可見(jiàn),而是在運(yùn)行期作為 bean 之間程序交互的函數(shù))。
一個(gè) BeanFactory 可以用接口 org.springframework.beans.factory.BeanFactory 表示,這個(gè)接口有多個(gè)實(shí)現(xiàn)。最常使用的簡(jiǎn)單的 BeanFactory 實(shí)現(xiàn)是 org.springframework.beans.factory. xml.XmlBeanFactory (這里提醒一下, ApplicationContext 是 BeanFactory 的子類,所以大多數(shù)的用戶更喜歡使用 ApplicationContext 的 XML 形式)。
雖然大多數(shù)情況下,幾乎所有被 BeanFactory 管理的用戶代碼都不需要知道 BeanFactory ,但是 BeanFactory 還是以某種方式實(shí)例化。可以使用下面的代碼實(shí)例化 BeanFactory 。
InputStream is = new FileInputStream("beans.xml");
XmlBeanFactory factory = new XmlBeanFactory(is);
也可以使用下列代碼實(shí)例化 BeanFactory 。
ClassPathResource res = new ClassPathResource("beans.xml");
XmlBeanFactory factory = new XmlBeanFactory(res);
實(shí)例化 BeanFactory 還可以采用如下代碼。
ClassPathXmlApplicationContext appContext = new ClassPathXmlApplication Context(?
???new String[] {"applicationContext.xml", "applicationContext-part2. xml"});
// of course, an ApplicationContext is just a BeanFactory
BeanFactory factory = (BeanFactory) appContext;
很多情況下,用戶代碼不需要實(shí)例化 BeanFactory ,因?yàn)?/span> Spring 框架代碼會(huì)做這件事。例如, Web 層提供支持代碼,在 J2EE Web 應(yīng)用啟動(dòng)過(guò)程中自動(dòng)載入一個(gè) Spring ApplicationContext 。這個(gè)聲明過(guò)程在這里描述。
編程操作 BeanFactory 將會(huì)在后面提到,下面部分將集中描述 BeanFactory 的配置。
一個(gè)最基本的 BeanFactory 配置由一個(gè)或多個(gè)它所管理的 Bean 定義組成。在一個(gè) XmlBeanFactory 中,根節(jié)點(diǎn) beans 中包含一個(gè)或多個(gè) 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>
...
2 . BeanDefinition
一個(gè) XmlBeanFactory 中的 Bean 定義包括的內(nèi)容如下。
classname :這通常是 bean 真正的實(shí)現(xiàn)類。但是,如果一個(gè) bean 使用一個(gè)靜態(tài)工廠方法所創(chuàng)建,而不是被普通的構(gòu)造函數(shù)創(chuàng)建,那么這實(shí)際上就是工廠類的 classname 。
bean 行為配置元素:它聲明這個(gè) bean 在容器的行為方式(比如 prototype 或 singleton 、自動(dòng)裝配模式、依賴檢查模式、初始化和析構(gòu)方法)。
構(gòu)造函數(shù)的參數(shù)和新創(chuàng)建 bean 需要的屬性:舉一個(gè)例子,一個(gè)管理連接池的 bean 使用的連接數(shù)目(即可以指定為一個(gè)屬性,也可以作為一個(gè)構(gòu)造函數(shù)參數(shù))或者池的大小限制。
和這個(gè) bean 工作相關(guān)的其他 bean :比如它的合作者(同樣可以作為屬性或者構(gòu)造函數(shù)的參數(shù)),這個(gè)也被叫做依賴。
上面列出的概念直接轉(zhuǎn)化為組成 bean 定義的一組元素。這些元素在表 6-1 中列出,它們每一個(gè)都有更詳細(xì)的說(shuō)明的鏈接。
表 6-1? Bean 定義的解釋
特 ??? 性 |
說(shuō) ??? 明 |
class |
bean 的類 |
id 和 name |
bean 的標(biāo)志符 (id 與 name) |
singleton 或 prototype |
Singleton 的使用與否 |
構(gòu)造函數(shù)參數(shù) |
設(shè)置 bean 的屬性和合作者 |
bean 的屬性 |
設(shè)置 bean 的屬性和合作者 |
自動(dòng)裝配模式 |
自動(dòng)裝配協(xié)作對(duì)象 |
依賴檢查模式 |
依賴檢查 |
初始化模式 |
生命周期接口 |
析構(gòu)方法 |
生命周期接口 |
注 意, bean 定義可以表示為真正的接口 org.springframework.beans.factory.config.BeanDefinition 以及它的各種子接口和實(shí)現(xiàn)。然而,絕大多數(shù)的用戶代碼不需要與 BeanDefination 直接接觸。
3 . bean 類
class 屬性通常是強(qiáng)制性的,有兩種用法。在絕大多數(shù)情況下, BeanFactory 直接調(diào)用 bean 的構(gòu)造函數(shù)來(lái)“ new ”一個(gè) bean (相當(dāng)于調(diào)用 new 的 Java 代碼), class 屬性指定了需要?jiǎng)?chuàng)建的 bean 的類。在比較少的情況下, BeanFactory 調(diào)用某個(gè)類的靜態(tài)的工廠方法來(lái)創(chuàng)建 bean , class 屬性指定了實(shí)際包含靜態(tài)工廠方法的那個(gè)類(至于靜態(tài)工廠方法返回的 bean 的類型是同一個(gè)類還是完全不同的另一個(gè)類,這并不重要)。
1 )通過(guò)構(gòu)造函數(shù)創(chuàng)建 bean
當(dāng)使用構(gòu)造函數(shù)創(chuàng)建 bean 時(shí),所有普通的類都可以被 Spring 使用,并且和 Spring 兼容。這就是說(shuō),被創(chuàng)建的類不需要實(shí)現(xiàn)任何特定的接口或者按照特定的樣式進(jìn)行編寫(xiě)。僅僅指定 bean 的類就足夠了。然而,根據(jù) bean 使用的 IoC 類型,你可能需要一個(gè)默認(rèn)的(空的)構(gòu)造函數(shù)。
另外, BeanFactory 并不局限于管理真正的 JavaBean ,它也能管理任何你想讓它管理的類。雖然很多使用 Spring 的人喜歡在 BeanFactory 中用真正的 JavaBean (僅包含一個(gè)默認(rèn)的(無(wú)參數(shù)的)構(gòu)造函數(shù),在屬性后面定義相對(duì)應(yīng)的 setter 和 getter 方法),但是在你的 BeanFactory 中也可以使用特殊的非 bean 樣式的類。舉例來(lái)說(shuō),如果你需要使用一個(gè)遺留下來(lái)的完全沒(méi)有遵守 JavaBean 規(guī)范的連接池,不要擔(dān)心, Spring 同樣能夠管理它。
使用 XmlBeanFactory 你可以像下面這樣定義你的 bean class 。
<bean id="exampleBean"
class="examples.ExampleBean"/>
<bean name="anotherExample"
class="examples.ExampleBeanTwo"/>
至于為構(gòu)造函數(shù)提供(可選的)參數(shù),以及對(duì)象實(shí)例創(chuàng)建后設(shè)置實(shí)例屬性,將會(huì)在后面敘述。
2 )通過(guò)靜態(tài)工廠方法創(chuàng)建 bean
當(dāng)你定義一個(gè)使用靜態(tài)工廠方法創(chuàng)建的 bean ,同時(shí)使用 class 屬性指定包含靜態(tài)工廠方法的類,這個(gè)時(shí)候需要 factory-method 屬性來(lái)指定工廠方法名。 Spring 調(diào)用這個(gè)方法(包含一組可選的參數(shù))并返回一個(gè)有效的對(duì)象,之后這個(gè)對(duì)象就完全和構(gòu)造方法創(chuàng)建的對(duì)象一樣。用戶可以使用這樣的 bean 定義在遺留代碼中調(diào)用靜態(tài)工廠。
下面是一個(gè) bean 定義的例子,聲明這個(gè) bean 要通過(guò) factory-method 指定的方法創(chuàng)建。注意,這個(gè) bean 定義并沒(méi)有指定返回對(duì)象的類型,只指定包含工廠方法的類。在這個(gè)例子中, createInstance 必須是 static 方法。
<bean id="exampleBean" ?class="examples.ExampleBean2" ?factory-method="createInstance"/>
至于為工廠方法提供(可選的)參數(shù),以及對(duì)象實(shí)例被工廠方法創(chuàng)建后設(shè)置實(shí)例屬性,將會(huì)在后面敘述。
3 )通過(guò)實(shí)例工廠方法創(chuàng)建 bean
使用一個(gè)實(shí)例工廠方法(非靜態(tài)的)創(chuàng)建 bean 和使用靜態(tài)工廠方法非常類似,調(diào)用一個(gè)已存在的 bean (這個(gè) bean 應(yīng)該是工廠類型)的工廠方法來(lái)創(chuàng)建新的 bean 。
使用這種機(jī)制, class 屬性必須為空,而且 factory-bean 屬性必須指定一個(gè) bean 的名字,這個(gè) bean 一定要在當(dāng)前的 bean 工廠或者父 bean 工廠中,并包含工廠方法。而工廠方法本身仍然要通過(guò) factory-method 屬性設(shè)置。
下面是一個(gè)例子。
<!-- The factory bean, which contains a method called??createInstance -->
<bean id="myFactoryBean"class="...">?
? ...
</bean>
<!-- The bean to be created via the factory bean -->
<bean id="exampleBean"
?factory-bean="myFactoryBean"
?factory-method="createInstance"/>
雖然我們要在后面討論設(shè)置 bean 的屬性,但是,這個(gè)方法意味著工廠 bean 本身能夠被容器通過(guò)依賴注射來(lái)管理和配置。
4 . Bean 的標(biāo)志符( id 與 name )
每一個(gè) bean 都有一個(gè)或多個(gè) id (也叫做標(biāo)志符或名字,這些名詞說(shuō)的是一回事)。這些 id 在管理 bean 的 BeanFactory 或 ApplicationContext 中必須是惟一的。一個(gè) bean 差不多總是只有一個(gè) id ,但是,如果一個(gè) bean 有超過(guò)一個(gè)的 id ,那么另外的那些本質(zhì)上可以認(rèn)為是別名。
在一個(gè) XmlBeanFactory 中(包括 ApplicationContext 的形式),你可以用 id 或者 name 屬性來(lái)指定 bean 的 id(s) ,并且在這兩個(gè)或其中一個(gè)屬性中至少指定一個(gè) id 。 id 屬性允許你指定一個(gè) id ,并且它在 XML DTD (定義文檔)中作為一個(gè)真正的 XML 元素的 ID 屬性被標(biāo)記,所以 XML 解析器能夠在其他元素指回向它的時(shí)候做一些額外的校驗(yàn)。正因如此,用 id 屬性指定 bean 的 id 是一個(gè)比較好的方式。然而, XML 規(guī)范嚴(yán)格限定了在 XML ID 中合法的字符。通常這并不是真正限制你,但是,如果你有必要使用這些字符(在 ID 中的非法字符),或者你想給 bean 增加其他的別名,那么你可以通過(guò) name 屬性指定一個(gè)或多個(gè) id (用逗號(hào)或分號(hào)分隔)。
5 . Singleton 的使用與否
Beans 被定義為兩種部署模式中的一種: singleton 或 non-singleton (后一種也叫做 prototype ,盡管這個(gè)名詞用的不精確)。如果一個(gè) bean 是 singleton 形態(tài)的,那么就只有一個(gè)共享的實(shí)例存在,所有和這個(gè) bean 定義的 id 符合的 bean 請(qǐng)求都會(huì)返回這個(gè)惟一的、特定的實(shí)例。
如果 bean 以 non-singleton 、 prototype 模式部署的話,對(duì)這個(gè) bean 的每次請(qǐng)求都會(huì)創(chuàng)建一個(gè)新的 bean 實(shí)例。這對(duì)于每個(gè) user 需要一個(gè)獨(dú)立的 user 對(duì)象的情況是非常理想的。
Beans 默認(rèn)被部署為 singleton 模式,除非你指定。要記住把部署模式變?yōu)?/span> non-singletion ( prototype )后,每一次對(duì)這個(gè) bean 的請(qǐng)求都會(huì)導(dǎo)致一個(gè)新創(chuàng)建的 bean ,而這可能并不是你真正想要的。所以,僅僅在絕對(duì)需要的時(shí)候才把模式改成 prototype 。
在下面這個(gè)例子中,兩個(gè) bean 一個(gè)被定義為 singleton ,而另一個(gè)被定義為 non-singleton ( prototype )。客戶端每次向 BeanFactory 請(qǐng)求都會(huì)創(chuàng)建新的 exampleBean ,而 AnotherExample 僅僅被創(chuàng)建一次,在每次對(duì)它請(qǐng)求都會(huì)返回這個(gè)實(shí)例的引用。
<bean id="exampleBean"
?class="examples.ExampleBean" singleton="false"/>
<bean name="yetAnotherExample"
?class="examples.ExampleBeanTwo" singleton="true"/>
注意,當(dāng)部署一個(gè)
bean
為
prototype
模式,這個(gè)
bean
的生命周期就會(huì)有稍許改變。
通過(guò)定義,
Spring
無(wú)法管理一個(gè)
non-singleton/prototype bean
的整個(gè)生命周期,因?yàn)楫?dāng)它創(chuàng)建之后,它被交給客戶端,而且容器根本不再跟蹤它了。當(dāng)說(shuō)起
non-singleton/prototype bean
的時(shí)候,你可以把
Spring
的角色想像成“
new
”操作符的替代品。從那之后的任何生命周期方面的事情都由客戶端來(lái)處理。
二.Spring IOC反轉(zhuǎn)控制 ApplicationContext
beans 包提供了以編程的方式管理和操控 bean 的基本功能,而 context 包增加了 ApplicationContext ,它以一種更加面向框架的方式增強(qiáng)了 BeanFactory 的功能。多數(shù)用戶可以以一種完全的聲明式方式來(lái)使用 ApplicationContext ,甚至不用去手工創(chuàng)建它,但是卻去依賴像 ContextLoader 的支持類,在 J2EE 的 Web 應(yīng)用的啟動(dòng)進(jìn)程中用它啟動(dòng) ApplicationContext 。當(dāng)然,這種情況下還可以以編程的方式創(chuàng)建一個(gè) ApplicationContext 。
Context 包的基礎(chǔ)是位于 org.springframework.context 包中的 ApplicationContext 接口。它是由 BeanFactory 接口集成而來(lái),提供 BeanFactory 所有的功能。為了以一種更像面向框架的方式工作, context 包使用分層和有繼承關(guān)系的上下文類,包括:
1
.
MessageSource
,提供對(duì)
i18n
消息的訪問(wèn);
2
.資源訪問(wèn),比如
URL
和文件;
3
.事件傳遞給實(shí)現(xiàn)了
ApplicationListener
接口的
bean
;
4
.載入多個(gè)(有繼承關(guān)系)上下文類,使得每一個(gè)上下文類都專注于一個(gè)特定的層次,比如應(yīng)用的
Web
層。
因?yàn)?/span> ApplicationContext 包括了 BeanFactory 所有的功能,所以通常建議先于 BeanFactory 使用,除了有限的一些場(chǎng)合,比如在一個(gè) Applet 中,內(nèi)存的消耗是關(guān)鍵的,每千字節(jié)都很重要。接下來(lái),敘述 ApplicationContext 在 BeanFactory 的基本能力上增加的功能。
( 1 )使用 MessageSource
ApplicationContext 接口繼承 MessageSource 接口,所以提供了 messaging 功能( i18n 或者國(guó)際化)。同 NestingMessageSource 一起使用,就能夠處理分級(jí)的信息,這些是 Spring 提供的處理信息的基本接口。讓我們很快瀏覽一下這里定義的方法。
String getMessage (String code 、 Object[] args 、 String default 、 Locale loc) :這個(gè)方法是從 MessageSource 取得信息的基本方法。如果對(duì)于指定的 locale 沒(méi)有找到信息,則使用默認(rèn)的信息。傳入的參數(shù) args 被用來(lái)代替信息中的占位符,這個(gè)是通過(guò) Java 標(biāo)準(zhǔn)類庫(kù)的 MessageFormat 實(shí)現(xiàn)的。
String getMessage (String code 、 Object[] args 、 Locale loc) :本質(zhì)上和上一個(gè)方法是一樣的,除了一點(diǎn)區(qū)別:沒(méi)有默認(rèn)值可以指定;如果信息找不到,就會(huì)拋出一個(gè) NoSuchMessage Exception 。
String getMessage(MessageSourceResolvable resolvable 、 Locale locale) :上面兩個(gè)方法使用的所有屬性都可以封裝到一個(gè)叫做 MessageSourceResolvable 的類中,你可以通過(guò)這個(gè)方法直接使用它。
當(dāng) ApplicationContext 被加載的時(shí)候,它會(huì)自動(dòng)查找在 context 中定義的 MessageSource bean ,這個(gè) bean 必須叫做 message source 。如果找到了這樣的一個(gè) bean ,所有對(duì)上述方法的調(diào)用將會(huì)被委托給找到的 message source 。如果沒(méi)有找到 message source , ApplicationContext 將會(huì)嘗試查它的父親是否包含這個(gè)名字的 bean 。如果有,它將會(huì)把找到的 bean 作為 Message Source 。如果它最終沒(méi)有找到任何信息源,一個(gè)空的 StaticMessageSource 將會(huì)被實(shí)例化,使它能夠接受上述方法的調(diào)用。
Spring 目前提供了兩個(gè) MessageSource 的實(shí)現(xiàn),它們是 ResourceBundleMessageSource 和 StaticMessageSource 。它們都實(shí)現(xiàn)了 NestingMessageSource , 以便能夠嵌套地解析信息。 StaticMessageSource 很少被使用,但是它提供以編程的方式向 source 增加信息。 Resource BundleMessageSource 用得更多一些,我們將提供它的一個(gè)例子。
<beans>?
? <bean id="messageSource"
?????????????? class="org.springframework.context.support.ResourceBundle MessageSource">
??????? <property name="basenames">
??????????? <list>
?????????????? <value>format</value>
??????????????? <value>exceptions</value>
??????????????? <value>windows</value>
??????????? </list>
??????? </property>
??? </bean>
</beans>
這段配置假定你在 classpath 有 3 個(gè) resource bundle ,分別叫做 f format 、 exceptions 和 windows 。 使用 JDK 通過(guò) ResourceBundle 解析信息的標(biāo)準(zhǔn)方式,任何解析信息的請(qǐng)求都會(huì)被處理。
( 2 )事件傳遞
ApplicationContext 中的事件處理是通過(guò) ApplicationEvent 類和 ApplicationListener 接口來(lái)提供的。如果上下文中部署了一個(gè)實(shí)現(xiàn)了 ApplicationListener 接口的 bean ,每次一個(gè) ApplicationEvent 發(fā)布到 ApplicationContext 時(shí),那個(gè) bean 就會(huì)被通知。實(shí)質(zhì)上,這是標(biāo)準(zhǔn)的 Observer 設(shè)計(jì)模式。 Spring 提供了 3 個(gè)標(biāo)準(zhǔn)事件,如表 6-2 所示。
表 6-2? 內(nèi)置事件
事 ??? 件 |
解 ??? 釋 |
ContextRefreshedEvent |
當(dāng) ApplicationContext 已經(jīng)初始化或刷新后發(fā)送的事件。這里初始化意味著所有的 bean 被裝載, singleton 被預(yù)實(shí)例化,以及 ApplicationContext 已準(zhǔn)備好 |
ContextClosedEvent |
當(dāng)使用 ApplicationContext 的 close() 方法結(jié)束上下文的時(shí)候發(fā)送的事件。這里結(jié)束意味著: singleton 被銷毀 ? |
RequestHandledEvent |
一個(gè)與 Web 相關(guān)的事件,告訴所有的 bean 一個(gè) HTTP 請(qǐng)求已經(jīng)被響應(yīng)了(這個(gè)事件將會(huì)在一個(gè)請(qǐng)求結(jié)束后被發(fā)送)。注意,這個(gè)事件只能應(yīng)用于使用了 Spring 的 DispatcherServlet 的 Web 應(yīng)用 |
同樣也可以實(shí)現(xiàn)自定義的事件。通過(guò)調(diào)用 ApplicationContext 的 publishEvent() 方法,并且指定一個(gè)參數(shù),這個(gè)參數(shù)是你自定義的事件類的一個(gè)實(shí)例。我們來(lái)看一個(gè)例子,首先是 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>
然后是實(shí)際的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
??????? }
??? }
}
?
( 3 )在 Spring 中使用資源
很多應(yīng)用程序都需要訪問(wèn)資源。 Spring 提供了一個(gè)清晰透明的方案,以一種協(xié)議無(wú)關(guān)的方式訪問(wèn)資源。 ApplicationContext 接口包含一個(gè)方法( getResource(String) )負(fù)責(zé)這項(xiàng)工作。
Resource 類定義了幾個(gè)方法,這幾個(gè)方法被所有的 Resource 實(shí)現(xiàn)所共享,資源功能如表 6-3 所示。
表 6-3? 資源功能
方 ??? 法 |
解 ??? 釋 |
getInputStream() |
用 InputStream 打開(kāi)資源,并返回這個(gè) InputStream |
exists() |
檢查資源是否存在,如果不存在,返回 false |
isOpen() |
如果這個(gè)資源不能打開(kāi)多個(gè)流,將會(huì)返回 true 。因?yàn)槌嘶谖募馁Y源,一些資源不能被同時(shí)多次讀取,它們就會(huì)返回 false |
getDescription() |
返回資源的描述,通常是全限定文件名或者實(shí)際的 URL |
Spring 提供了幾個(gè) Resource 的實(shí)現(xiàn)。它們都需要一個(gè) String 表示的資源的實(shí)際位置。依據(jù)這個(gè) String , Spring 將會(huì)自動(dòng)為你選擇正確的 Resource 實(shí)現(xiàn)。當(dāng)向 ApplicationContext 請(qǐng)求一個(gè)資源時(shí), Spring 首先檢查你指定的資源位置,尋找任何前綴。根據(jù)不同的 Application Context 的實(shí)現(xiàn),不同的 Resource 實(shí)現(xiàn)可被使用。 Resource 最好是使用 ResourceEditor 來(lái)配置,比如 XmlBeanFactory 。