前言:
本塊文章會通過連載的方式來深入了解和學習Spring相關核心技術和實現原理。包括Spring的Bean生命周期管理,聲明性事務管理,AOP管理,注解應用實現,以及在其上面進行擴展的相關應用進行介紹。
本篇技術文章將作為Spring入門篇。
什么是Spring開發框架?
Spring 是一個基于Java/JavaEE的應用開發平臺。其實現是由作者Rod
Johnson在2002年出版《Expert One-on-One J2EE Design and Development》一書后,總結經驗后,研發而成。
Spring的核心內容包括:
1. 輕量級的容器, 提供集中式,自動配置與裝配應用業務對象功能。
Spring提供了管理業務對象的一致方法并且鼓勵了注入對接口編程而不是對類編程的良好習慣。Spring的架構基礎是基于使用POJO對象管理的 Inversion of Control(控制反轉)容器,提供非侵入的方式為當前一些復雜的系統應用提供松耦合,一致性的業務對象配置管理。容器以快捷開發為出發點,方便開發中 的可測試性和部署時的可擴展性為目的。實現只針對單個業務組件在獨立環境的下進行開發與測試,在部署時再集成到任意的Java SE或Java EE環境中。
2. 提供了唯一的事務管理抽象,基于插件式的事務管理(聲明性事務管理)能夠很容易的實現事務層管理,而無需了解各種底層事務實現,例如JTA或者 JDBC事務提供一個一致的編程模型。相對于只依賴Java EE環境的普通的JTA或EJB CMT方式, Spring就更簡單輕便了。
3. 提供了唯一的數據訪問抽象,包括簡單和有效率的JDBC框架,極大的改進了效率(大大減少了開發的代碼量)并且減少了可能的錯誤。基于JDBC的異常信息也是完全遵循Spring的公共DAO異常層級。
4. Spring的數據訪問層集成了Toplink, Hibernate, JDO, and iBATIS SQL Maps等 O/R mapping解決方案,其目的是提供統一的DAO支持類實現和事務管理策略。尤其Hibernate對SpringIOC特性的支持,能更好的實現集 成,以更好的利用Spring的公共事務與DAO異常層級。
5. Spring提供了一個用標準Java編寫的AOP框架(也能集成AspectJ),提供基于POJOs的聲明式的事務管理和其他企業事務--如果你需要
還能實現你自己的aspects。這個框架足夠強大,使得應用程序能夠拋開EJB的復雜性,同時享受著和傳統EJB相關的關鍵服務。當然也可以選擇不支持 JTA方式的開發,尤其如不支持JTA的Tomcat服務器下開發單數據庫應用。
6. 提供可以與IoC容器集成的強大而靈活的MVC Web框架. 其本身通過提供策略接口與多視圖支持技術(如JSP, Velocity模塊引擎, Tiles,
iText和POI)實現框架的高可配置性。 Spring作為中間層也可以很容易的與其它第三方web MVC框架實現集成,如Struts,WebWork,Struct2(Struts與WebWork的集成)和Tapestry.
Spring bean對象生命周期管理
Spring bean對象的生命周期管理包括Bean的創建裝配和Bean的銷毀兩個過程。在了解Spring bean對象生命周期管理內容之前,首先來整理一下Spring對每個Bean進行管理擴展接口有哪些?
BeanNameAware

Spring在注冊當前Bean到容器中時,會把當前Bean的Id值作為參數回調用到該接口方法
BeanClassLoaderAware

Spring在注冊當前Bean到容器中時,會把當前Bean Class所屬的ClassLoader對象作為參數回調該接口方法
BeanFactoryAware

Spring在注冊當前Bean到容器中時,會把當前Bean對象所屬的BeanFactory工廠對象實例作為參數回調該接口方法
ResourceLoaderAware

Spring在注冊當前Bean到容器中時,會把ResourceLoader對象實例作為參數回調該接口方法. ResourceLoader對象方便的提供基于Classpath方式的Resource文件查找和定位功能。例如:
Resource template = rl.getResource("some/resource/path/myTemplate.txt");
ApplicationEventPublisherAware

Spring在注冊當前Bean到容器中時,會把ApplicationEventPublisher對象實例作為參數回調該接口方法. ApplicationEventPublisher對象用于對所有監聽ApplicationListener接口事件的對象,發布ApplicationEvent事件。
MessageSourceAware

Spring在注冊當前Bean到容器中時,會把MessageSource對象實例作為參數回調該接口方法. MessageSource用于處理Spring的信息資源對象,如國際化信息處理
ApplicationContextAware

Spring在注冊當前Bean到容器中時,會把ApplicationContext對象實例作為參數回調該接口方法.
ServletContextAware

Spring在注冊當前Bean到容器中時,會把ServletContext對象實例作為參數回調該接口方法. 這個只在基于Web的ApplicationContext才會啟用
BeanPostProcessors

Spring在對Bean象進行實例化前后,回調相應的方法。
InitializingBean

Spring容器完成Bean對象所有properties屬性的依賴裝配后,回調該接口方法。
DisposableBean

Spring容器在執行關閉操作時,對Bean對進行銷毀前,回調該接口方法
了解相關的生命周期管理接口概念后,下面就比較容易整理Spring的Bean創建和銷毀的整個調用過程:
Spring Bean創建過程如下:
1
|
觸發 BeanNameAware 的setBeanName方法
|
2
|
觸發BeanClassLoaderAware的setBeanClassLoader方法
|
3
|
觸發BeanFactoryAware's
setBeanFactory
|
4
|
觸發ResourceLoaderAware's
setResourceLoader (only applicable when running in an application context)
|
5
|
觸發ApplicationEventPublisherAware的setApplicationEventPublisher方法 (只在由application context啟動時工作)
|
6
|
觸發MessageSourceAware的 setMessageSource 方法(只在由application context啟動時工作)
|
7
|
觸發ApplicationContextAware'的setApplicationContext方法 (只在由application context啟動時工作)
|
8
|
觸發ServletContextAware的setServletContext 方法(只web application context下啟用)
|
9
|
觸發BeanPostProcessors的postProcessBeforeInitialization方法
|
10
|
觸發InitializingBean的 afterPropertiesSet方法
|
11
|
觸發用戶在XML文件中配置的”init-method” 指定的方法名。不指定則跳過
|
12
|
觸發BeanPostProcessors 的postProcessAfterInitialization 方法
|
Spring Bean銷毀過程如下:
1
|
觸發 DisposableBean的destroy方法
|
2
|
觸發用戶在XML文件中配置的” destroy-method” 指定的方法名。不指定則跳過
|
至此Spring Bean生命周期管理的核心內容的介紹就到這里。
本章節完.
Good Luck!
Yours Matthew!