Spring Bean 封裝機制
Spring 大量引入了Java 的Reflection機制,通過動態調用的方式避免硬編碼方式的約束,并在此基礎上建立了其核心組件BeanFactory,以此作為其依賴注入機制的實現基礎。
org.springframework.beans包中包括了這些核心組件的實現類,核心中的核心為BeanWrapper和BeanFactory類。(對其源碼進行研讀,必有所獲)。BeanFactory家族如圖1所示。
圖1 BeanFactory家族
BeanWrapper
講的通俗點,就是在運行期,由Spring根據配置文件,將其他對象的引用通過組件的提供的setter方法進行設定。
通過BeanWrapper,我們可以無需在編碼時就指定JavaBean的實現類和屬性值,通過在配置文件加以設定,就可以在運行期動態創建對象并設定其屬性(依賴關系)。
BeanFactory
Bean Factory,顧名思義,負責創建并維護Bean實例。
Bean Factory負責根據配置文件創建Bean實例,可以配置的項目有:
1. Bean屬性值及依賴關系(對其他Bean的引用)
2. Bean創建模式(是否Singleton模式,即是否只針對指定類維持全局唯一的實例)
3. Bean初始化和銷毀方法
4. Bean的依賴關系
聯合上面關于BeanWrapper的內容,我們可以看到,BeanWrapper實現了針對單個Bean的屬性設定操作。而BeanFactory則是針對多個Bean的管理容器,根據給定的配置文件,BeanFactory從中讀取類名、屬性名/值,然后通過Reflection機制進行Bean加載和屬性設定。
ApplicationContext
ApplicationContext覆蓋了BeanFactory的所有功能,并提供了更多的特性。此外ApplicationContext為與現有應用框架相整合,提供了更為開放式的實現(如對于Web應用,我們可以在web.xml中對ApplicationContext進行配置)。
相對BeanFactory而言,ApplicationContext提供了以下擴展功能:
1. 國際化支持(MessageSource)
我們可以在Beans.xml文件中,對程序中的語言信息(如提示信息)進行定義,將程序中的提示信息抽取到配置文件中加以定義,為我們進行應用的各語言版本轉換提供了極大的靈活性。
2. 資源訪問(ResourceLoader)
支持對文件和URL的訪問。
3. 事件傳播(ApplicationEventPublisher)
事件傳播特性為系統中狀態改變時的檢測提供了良好支持。
4. 多實例加載可以在同一個應用中加載多個Context實例。(ListableBeanFactory)
WebApplicationContext
與ApplicationContext的區別:ApplicationContext均通過編碼加載。對于Web應用,Spring提供了可配置的ApplicationContext加載機制。
兩種加載器:ContextLoaderServlet , ContextLoaderListener
配置非常簡單,在web.xml中增加:
<listener>
<listener-class>org.springframework.web.context.contextLoaderLisenter</listener-class>
</listener>
或:
<servlet>
<servlet-name>context</servlet-name> <servlet-class>org.springframework.web.context.contextLoaderServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
通過以 上配置,Web容器會自動加載/WEB-INF/applicationContext.xml初始化ApplicationContext。