Sping之BeanWrapper、BeanFactory ApplicationContext
org.springframework.beans包中包括了核心組件的實現(xiàn)類, 核心中的核心為BeanWrapper和BeanFactory類。
我對這三個類的理解是:
1、 通過Spring BeanWrapper去操作一個JavaBean;
2、 Bean Factory負責(zé)根據(jù)配置文件創(chuàng)建Bean實例;
3、 BeanFactory提供了針對Java Bean的管理功能,而ApplicationContext提供了一更為框架化的實現(xiàn)(從上面的示例中可以看出,BeanFactory的使用方式更加類似一個API,而非Framework style) 。 ApplicationContext覆蓋了BeanFactory的所有功能,并提供了更多的特性。此外,ApplicationContext為與現(xiàn)有應(yīng)用框架相整合,提供了更為開放式的實現(xiàn)(如對于Web應(yīng)用,我們可以在web.xml中對ApplicationContext進行配置。
一、看看如何通過Spring BeanWrapper操作一個JavaBean:
Object obj = Class.forName("net.xiaxin.beans.User").newInstance();
BeanWrapper bw = new BeanWrapperImpl(obj);
bw.setPropertyValue("name", "Erica");
System.out.println("User name=>"+bw.getPropertyValue("name"));
對比之前的代碼,相信大家已經(jīng)知道BeanWrapper的實現(xiàn)原理。
誠然,通過這樣的方式設(shè)定Java Bean屬性實在繁瑣,但它卻提供了一個通用的屬性設(shè)定機制,而這樣的機制,也正是Spring依賴注入機制所依賴的基礎(chǔ)。
通過BeanWrapper,我們可以無需在編碼時就指定JavaBean的實現(xiàn)類和屬性值,通過在配置文件加以設(shè)定,就可以在運行期動態(tài)創(chuàng)建對象并設(shè)定其屬性(依賴關(guān)系) 。
二、 Bean Factory
Bean Factory,顧名思義,負責(zé)創(chuàng)建并維護Bean實例。
Bean Factory負責(zé)根據(jù)配置文件創(chuàng)建Bean實例,可以配置的項目有:
1. Bean屬性值及依賴關(guān)系(對其他Bean的引用)
2. Bean創(chuàng)建模式(是否Singleton模式,即是否只針對指定類維持全局唯一的實例)
3. Bean初始化和銷毀方法
4. Bean的依賴關(guān)系
.Bean Factory的生命周期
下面是一個較為完整的Bean配置示例:
Bean的定義
<bean
id="beanId"(1)
name="beanName"(2)
class="beanClass"(3)
parent="parentBean"(4)
abstract="true | false"(5)
singleton="true | false"(6)
lazy-init="true | false | default"(7)
autowire="no | byName | byType | constructor | autodetect | default"(8)
dependency-check = "none | objects | simple | all | default"(9)
depends-on="dependsOnBean"(10)
init-method="method"(11)
destroy-method="method"(12)
factory-method="method"(13)
factory-bean="bean">(14)
<property name="message">
<value>HeLLo</value> (15)
</property>
<property name="dataSource">
<ref local="dataSource"/> (16)
</property>
</bean>
<bean id="dataSource"
class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>java:comp/env/jdbc/sample</value>
</property>
</bean>
(1)、id: Bean的唯一標識名。它必須是合法的XML ID,在整個XML文檔中唯一。
(2)、name: 用來為id創(chuàng)建一個或多個別名。它可以是任意的字母符合。多個別名之間用逗號或空格分開。
(3)、class: 用來定義類的全限定名(包名+類名)。只有子類Bean不用定義該屬性。
(4)、parent: 子類Bean定義它所引用它的父類Bean。這時前面的class屬性失效。子類Bean會繼承父類Bean的所有屬性,子類Bean也可以覆蓋父類Bean的屬性。注意:子類Bean和父類Bean是同一個Java類。
(5)、abstract(默認為”false”):用來定義Bean是否為抽象Bean。它表示這個Bean將不會被實例化,一般用于父類Bean,因為父類Bean主要是供子類Bean繼承使用。
(6)、singleton(默認為“true”):定義Bean是否是Singleton(單例)。如果設(shè)為“true”,則在BeanFactory作用范圍內(nèi),只維護此Bean的一個實例。如果設(shè)為“flase”,Bean將是Prototype(原型)狀態(tài),BeanFactory將為每次Bean請求創(chuàng)建一個新的Bean實例。
(7)、lazy-init(默認為“default”):用來定義這個Bean是否實現(xiàn)懶初始化。如果為“true”,它將在BeanFactory啟動時初始化所有的Singleton Bean。反之,如果為“false”,它只在Bean請求時才開始創(chuàng)建Singleton Bean。
(8)、autowire(自動裝配,默認為“default”):它定義了Bean的自動裝載方式。
1、“no”:不使用自動裝配功能。
2、“byName”:通過Bean的屬性名實現(xiàn)自動裝配。
3、“byType”:通過Bean的類型實現(xiàn)自動裝配。
4、“constructor”:類似于byType,但它是用于構(gòu)造函數(shù)的參數(shù)的自動組裝。
5、“autodetect”:通過Bean類的反省機制(introspection)決定是使用“constructor”還是使用“byType”。
(9)、dependency-check(依賴檢查,默認為“default”):它用來確保Bean組件通過JavaBean描述的所以依賴關(guān)系都得到滿足。在與自動裝配功能一起使用時,它特別有用。
1、none:不進行依賴檢查。
2、objects:只做對象間依賴的檢查。
3、simple:只做原始類型和String類型依賴的檢查
4、all:對所有類型的依賴進行檢查。它包括了前面的objects和simple。
(10)、depends-on(依賴對象):這個Bean在初始化時依賴的對象,這個對象會在這個Bean初始化之前創(chuàng)建。
(11)、init-method:用來定義Bean的初始化方法,它會在Bean組裝之后調(diào)用。它必須是一個無參數(shù)的方法。
(12)、destroy-method:用來定義Bean的銷毀方法,它在BeanFactory關(guān)閉時調(diào)用。同樣,它也必須是一個無參數(shù)的方法。它只能應(yīng)用于singleton Bean。
(13)、factory-method:定義創(chuàng)建該Bean對象的工廠方法。它用于下面的“factory-bean”,表示這個Bean是通過工廠方法創(chuàng)建。此時,“class”屬性失效。
(14)、factory-bean:定義創(chuàng)建該Bean對象的工廠類。如果使用了“factory-bean”則“class”屬性失效。
(15) <value>
通過<value/>節(jié)點可指定屬性值。BeanFactory將自動根據(jù)Java Bean對應(yīng)的屬性
類型加以匹配。
下面的”desc”屬性提供了一個null值的設(shè)定示例。注意<value></value>代表一
個空字符串,如果需要將屬性值設(shè)定為null,必須使用<null/>節(jié)點。
(16) <ref>
指定了屬性對BeanFactory中其他Bean的引用關(guān)系。示例中,TheAction的dataSource屬
性引用了id為dataSource的Bean。BeanFactory將在運行期創(chuàng)建dataSource bean實例,并將其
引用傳入TheAction Bean的dataSource屬性。
例:
<beans>
<description>Spring Bean Configuration Sample</description>
<bean
id="TheAction"
class="net.xiaxin.spring.qs.UpperAction"
singleton="true"
init-method="init"
destroy-method="cleanup"
depends-on="ActionManager"
>
<property name="message">
<value>HeLLo</value>
</property>
<property name="desc">
<null/>
</property>
<property name="dataSource">
<ref local="dataSource"/>
</property>
</bean>
<bean id="dataSource"
class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>java:comp/env/jdbc/sample</value>
</property>
</bean>
.關(guān)于ApplicationContext
ApplicationContext
BeanFactory提供了針對Java Bean的管理功能,而ApplicationContext提供了一個更為框架化的
實現(xiàn)(從上面的示例中可以看出,BeanFactory的使用方式更加類似一個API,而非Framework style)。
ApplicationContext覆蓋了BeanFactory的所有功能,并提供了更多的特性。此外,
ApplicationContext為與現(xiàn)有應(yīng)用框架相整合,提供了更為開放式的實現(xiàn)(如對于Web應(yīng)用,我們可以在
web.xml中對ApplicationContext進行配置)。
相對BeanFactory而言,ApplicationContext提供了以下擴展功能:
1.國際化支持
我們可以在Beans.xml文件中,對程序中的語言信息(如提示信息)進行定義,將程序中的提示
信息抽取到配置文件中加以定義,為我們進行應(yīng)用的各語言版本轉(zhuǎn)換提供了極大的靈活性。
2.資源訪問
支持對文件和URL的訪問。
3.事件傳播
事件傳播特性為系統(tǒng)中狀態(tài)改變時的檢測提供了良好支持。
4.多實例加載
可以在同一個應(yīng)用中加載多個Context實例。
posted on 2009-03-23 11:30
重慶理工小子 閱讀(1620)
評論(0) 編輯 收藏 所屬分類:
Spring2