簡介
在Spring中
兩個最基本最重要的包是
org
springframework
beans和orgntext包
這兩個包中的代碼為Spring的反向控制特性(也叫作依賴注射)提供了基礎
BeanFactory[ springframework/beans/factory/l]提供了能夠管理任何種類beans(對象)的先進的配置機制
潛在地利用任何一種存儲設備
ApplicationContext建立在BeanFactory之上並增加了其他的功能
比如同Spring AOP特性更容易整合
信息資源處理(用於國際化)
事件傳播
聲明式機制用於創建ApplicationContext和可選的父上下文以及與應用層相關的上下文(比如WebApplicationContext)
以及其他的增強
簡而言之
BeanFactory提供了配置框架和基本的功能
而ApplicationContext為它增加了更強的功能
這些功能中的一些或許更加J
EE和企業中心(enterprise
centric)
一般來說
ApplicationContext是BeanFactory的完全超集
任何BeanFactory功能和行為的描述也同樣被認為適用於ApplicationContext
用戶有時在特定的場合下不確定BeanFactory和ApplicationContext哪一個更適於使用
通常大部分在J
EE環境中構建的應用最好的選擇是使用ApplicationContext
因為它不僅提供了BeanFactory所有的特性以及它自己附加的特性
而且還提供更聲明化的方法去使用一些功能
這通常是令人滿意的
你最好選擇BeanFactory的主要場景通常是當內存使用是最主要的關注(比如在一個每kb都要計算的applet中)
而且你也不需要ApplicationContext所有特性的時候
這一章粗略地分為兩部分
第一部分包括同時適用於BeanFactory和ApplicationContext的基本原則
第二部分會包括僅僅適用於ApplicationContext的一些特性
.BeanFactory和Bean定義(基礎)
.BeanFactory
BeanFactory是實際上實例化
配置和管理許多beans的容器
這些beans通常互相之間合作
因而也在它們之間產生依賴
這些依賴反映在被BeanFactory使用的配置數據中(一些依賴可能不像配置數據一樣可見
而更可能在運行期作為bean之間程序交互的函數)
一個BeanFactory用接口org
springframework
beans
factory
BeanFactory表示
這個接口有多個實現
最常使用的的簡單的BeanFactory實現是org
springframework
beans
factory
xml
XmlBeanFactory
(這帶有如下的暗示
ApplicationContext是BeanFactory的子類
所以大多數的用戶更喜歡使用ApplicationContext的XML形式)
盡管對於大多數場景
幾乎所有的被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
part
xml
});
// of course
an ApplicationContext is just a BeanFactory
BeanFactory factory = (BeanFactory) appContext;
對於很多的應用場景
用戶代碼不需要實例化BeanFactory
因為Spring框架代碼會做這件事
舉例來說
web層提供支持代碼
用來自動讀取一個Spring ApplicationContext並把讀取過程作為一個J
EE web應用啟動過程的一部分
這個聲明式的過程在這裡描述
編程式地操縱BeanFactory將會在後面接受
下面部分將集中描述BeanFactory的配置
在最基礎的級別上
一個BeanFactory配置由一個或多個BeanFactory必須管理的Bean的定義組成
在一個XmlBeanFactory中
在頂級的<beans>元素中配置一個或多個<bean>元素
<?xml version=
encoding=
UTF
?>
<!DOCTYPE beans PUBLIC
//SPRING//DTD BEAN//EN
beans
dtd
;>
<beans>
<bean id=
class=
>
</bean>
<bean id=
class=
>
</bean>
</beans>
.Bean定義
一個XmlBeanFactory實體中的Bean定義包括如下的細節以及其他一些信息
l 一個classname
通常這是Bean定義中描述的那個bean的真正的實現類
然而如果一個bean使用一個靜態工廠方法所創建而不是被普通的構造函數創建
那麼這裡實際上就是工廠類的classname
l Bean行為配置元素
聲明這個bean在容器的行為方式(比如prototype或singleton
自動裝配模式
依賴檢查模式
初始化和析構方法)
l 構造函數參數和需要賦予新創建bean的屬性
舉一個例子
一個管理連接池的bean使用的連接數目(即可以指定為一個property也可以作為一個構造函數參數)
或者池大小的限制數目
l 這個bean需要起作用的其他beans
比如它的合作者(同業也可以作為屬性或者構造函數的參數)
這個也被叫做依賴
上面列出的概念直接轉化為組成bean定義的一組元素
這些元素在下面的表格中列出
關於它們每一個的更詳細的說明都有一個鏈接相對應
表
Bean定義說明
特性 更多信息
class
節
bean class
id和name
節
bean標志符(id和name)
singleton或prototype
節
使用singleton還是不使用呢
構造函數參數
節
設置bean的屬性和合作者
bean屬性
節
設置bean的屬性和合作者
自動裝配模式
節
自動裝配合作者
依賴檢查模式
節
檢查依賴
初始化方法
節
生命周期接口
析構方法
節
生命周期接口
注意bean定義是由真實的接口org
springframewonfig
BeanDefinition以及它的各種子接口和實現所表示的
然而
絕大多數的用戶代碼不需要與BeanDefination直接作用
.bean class
class屬性通常是強制性的(參看
節
通過實例工廠方法創建bean和
節
child bean的定義這兩個例外情況)
被用來達到兩個目的中的一個
在絕大多數普通的場景中BeanFactory自己直接調用bean的構造函數來創建bean(相當於調用new的Java代碼)
class屬性指定了需要創建的bean的類
在比較少的普通場景中BeanFactory調用某個類的靜態的所謂的工廠方法來創建bean
class屬性指定了實際包含靜態工廠方法的那個類
(至於靜態工廠方法返回的bean的類型是同一個類還是完全不同的另一個類
這並不重要)
.通過構造方法創建bean
當使用構造函數方式創建bean的時候
所有普通的類都可以被Spring使用以及同Spring兼容
這就是說
被創建的類不需要實現任何指定的接口或者按照特定的樣式進行編碼
僅僅指定bean的類就足夠了
然而
由於依賴你給特定bean使用的IoC類型
你可能需要一個默認的(空的)構造函數
另外
BeanFactory並不局限於管理真正的JavaBeans
事實上它也能夠管理任何你想讓它幫你管理的類
雖然很多使用Spring的人喜歡在BeanFactory中用真正的JavaBeans(僅包含一個默認的(無參數的)構造方法以及在屬性後面包含適當的相對應的setter和getter)
但是在你的BeanFactory中也可以使用特殊的非bean樣式的類
舉例來說
如果你需要使用一個遺留下來的完全沒有遵守JavaBean規范的連接池
不要擔心
Spring同樣能夠管理它
使用XmlBeanFactory你可以像如下這樣制定你的bean class
<bean id=
exampleBean
class=
examples
ExampleBean
/>
<bean name=
anotherExample
class=
examples
ExampleBeanTwo
/>
至於為構造方法提供參數(可選的)
以及對象實例構造後設置實例的屬性
將會在後面敘述
.通過靜態工廠方法創建Bean
當你定義一個使用靜態工廠方法創建的bean
同時使用class屬性指定包含靜態工廠方法的類
這個時候就需要另一個叫做factory
method的屬性來指定工廠方法的名字
Spring期待能夠調用這個方法(包含可選的一組參數將在後面敘述)並且返回一個有效的對象
之後這個對象就會如同用構造方法創建的對象一樣被看待
用戶可以使用這樣的bean定義在遺留代碼中調用靜態工廠
下面是一個bean定義的例子
聲明了一個bean要通過調用一個工廠方法被創建
要注意定義並沒有指定返回對象的類型
只指定包含工廠方法的類
在這個例子中
createInstance必須是靜態方法
<bean id=
exampleBean
class=
examples
ExampleBean
factory
method=
createInstance
/>
至於為工廠方法提供參數(可選的)
以及對象實例被工廠方法返回後設置該實例的屬性
將會在後面敘述
.通過實例工廠方法創建bean
與使用靜態工廠方法創建bean非常類似的是
使用一個實例工廠方法(非靜態的)
通過調用一個已存在bean(這個bean應該是工廠類型)的工廠方法來創建新的bean
要使用這種機制
class屬性必須保留為空的
而且factory
bean屬性必須指定一個包含工廠方法的bean的name(¥¥)
而工廠方法本身仍然要通過factory
method屬性設置
下面是一個例子
<!
The factory bean
which contains a method called
createInstance
>
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28606.html