OMG,到底在尋找什么..................
          (構(gòu)造一個(gè)完美的J2EE系統(tǒng)所需要的完整知識(shí)體系)
          posts - 198,  comments - 37,  trackbacks - 0

          原貼地址: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




          posted on 2006-11-01 10:39 OMG 閱讀(732) 評(píng)論(0)  編輯  收藏 所屬分類: Spring

          <2006年11月>
          2930311234
          567891011
          12131415161718
          19202122232425
          262728293012
          3456789

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          IT風(fēng)云人物

          文檔

          朋友

          相冊(cè)

          經(jīng)典網(wǎng)站

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 库尔勒市| 鄯善县| 辽宁省| 皮山县| 江川县| 繁峙县| 潮安县| 杨浦区| 神池县| 黄平县| 朔州市| 宁乡县| 晋宁县| 东源县| 马龙县| 岳阳市| 马山县| 郎溪县| 葫芦岛市| 凤山县| 孝昌县| 炎陵县| 肇东市| 玛多县| 洪湖市| 二连浩特市| 尚义县| 汶上县| 报价| 古田县| 阆中市| 龙江县| 怀化市| 鸡泽县| 合肥市| 民权县| 蒙自县| 固原市| 北川| 尼勒克县| 唐海县|