前言:
本塊文章會(huì)通過(guò)連載的方式來(lái)深入了解和學(xué)習(xí)Spring相關(guān)核心技術(shù)和實(shí)現(xiàn)原理。包括Spring的Bean生命周期管理,聲明性事務(wù)管理,AOP管理,注解應(yīng)用實(shí)現(xiàn),以及在其上面進(jìn)行擴(kuò)展的相關(guān)應(yīng)用進(jìn)行介紹。
本篇技術(shù)文章將作為Spring入門篇。
什么是Spring開發(fā)框架?
Spring 是一個(gè)基于Java/JavaEE的應(yīng)用開發(fā)平臺(tái)。其實(shí)現(xiàn)是由作者Rod
Johnson在2002年出版《Expert One-on-One J2EE Design and Development》一書后,總結(jié)經(jīng)驗(yàn)后,研發(fā)而成。
Spring的核心內(nèi)容包括:
1. 輕量級(jí)的容器, 提供集中式,自動(dòng)配置與裝配應(yīng)用業(yè)務(wù)對(duì)象功能。
Spring提供了管理業(yè)務(wù)對(duì)象的一致方法并且鼓勵(lì)了注入對(duì)接口編程而不是對(duì)類編程的良好習(xí)慣。Spring的架構(gòu)基礎(chǔ)是基于使用POJO對(duì)象管理的 Inversion of Control(控制反轉(zhuǎn))容器,提供非侵入的方式為當(dāng)前一些復(fù)雜的系統(tǒng)應(yīng)用提供松耦合,一致性的業(yè)務(wù)對(duì)象配置管理。容器以快捷開發(fā)為出發(fā)點(diǎn),方便開發(fā)中 的可測(cè)試性和部署時(shí)的可擴(kuò)展性為目的。實(shí)現(xiàn)只針對(duì)單個(gè)業(yè)務(wù)組件在獨(dú)立環(huán)境的下進(jìn)行開發(fā)與測(cè)試,在部署時(shí)再集成到任意的Java SE或Java EE環(huán)境中。
2. 提供了唯一的事務(wù)管理抽象,基于插件式的事務(wù)管理(聲明性事務(wù)管理)能夠很容易的實(shí)現(xiàn)事務(wù)層管理,而無(wú)需了解各種底層事務(wù)實(shí)現(xiàn),例如JTA或者 JDBC事務(wù)提供一個(gè)一致的編程模型。相對(duì)于只依賴Java EE環(huán)境的普通的JTA或EJB CMT方式, Spring就更簡(jiǎn)單輕便了。
3. 提供了唯一的數(shù)據(jù)訪問(wèn)抽象,包括簡(jiǎn)單和有效率的JDBC框架,極大的改進(jìn)了效率(大大減少了開發(fā)的代碼量)并且減少了可能的錯(cuò)誤。基于JDBC的異常信息也是完全遵循Spring的公共DAO異常層級(jí)。
4. Spring的數(shù)據(jù)訪問(wèn)層集成了Toplink, Hibernate, JDO, and iBATIS SQL Maps等 O/R mapping解決方案,其目的是提供統(tǒng)一的DAO支持類實(shí)現(xiàn)和事務(wù)管理策略。尤其Hibernate對(duì)SpringIOC特性的支持,能更好的實(shí)現(xiàn)集 成,以更好的利用Spring的公共事務(wù)與DAO異常層級(jí)。
5. Spring提供了一個(gè)用標(biāo)準(zhǔn)Java編寫的AOP框架(也能集成AspectJ),提供基于POJOs的聲明式的事務(wù)管理和其他企業(yè)事務(wù)--如果你需要 還能實(shí)現(xiàn)你自己的aspects。這個(gè)框架足夠強(qiáng)大,使得應(yīng)用程序能夠拋開EJB的復(fù)雜性,同時(shí)享受著和傳統(tǒng)EJB相關(guān)的關(guān)鍵服務(wù)。當(dāng)然也可以選擇不支持 JTA方式的開發(fā),尤其如不支持JTA的Tomcat服務(wù)器下開發(fā)單數(shù)據(jù)庫(kù)應(yīng)用。
6. 提供可以與IoC容器集成的強(qiáng)大而靈活的MVC Web框架. 其本身通過(guò)提供策略接口與多視圖支持技術(shù)(如JSP, Velocity模塊引擎, Tiles, iText和POI)實(shí)現(xiàn)框架的高可配置性。 Spring作為中間層也可以很容易的與其它第三方web MVC框架實(shí)現(xiàn)集成,如Struts,WebWork,Struct2(Struts與WebWork的集成)和Tapestry.
Spring bean對(duì)象生命周期管理
Spring bean對(duì)象的生命周期管理包括Bean的創(chuàng)建裝配和Bean的銷毀兩個(gè)過(guò)程。在了解Spring bean對(duì)象生命周期管理內(nèi)容之前,首先來(lái)整理一下Spring對(duì)每個(gè)Bean進(jìn)行管理擴(kuò)展接口有哪些?
BeanNameAware
Spring在注冊(cè)當(dāng)前Bean到容器中時(shí),會(huì)把當(dāng)前Bean的Id值作為參數(shù)回調(diào)用到該接口方法
BeanClassLoaderAware
Spring在注冊(cè)當(dāng)前Bean到容器中時(shí),會(huì)把當(dāng)前Bean Class所屬的ClassLoader對(duì)象作為參數(shù)回調(diào)該接口方法
BeanFactoryAware
Spring在注冊(cè)當(dāng)前Bean到容器中時(shí),會(huì)把當(dāng)前Bean對(duì)象所屬的BeanFactory工廠對(duì)象實(shí)例作為參數(shù)回調(diào)該接口方法
ResourceLoaderAware
Spring在注冊(cè)當(dāng)前Bean到容器中時(shí),會(huì)把ResourceLoader對(duì)象實(shí)例作為參數(shù)回調(diào)該接口方法. ResourceLoader對(duì)象方便的提供基于Classpath方式的Resource文件查找和定位功能。例如:
Resource template = rl.getResource("some/resource/path/myTemplate.txt");
ApplicationEventPublisherAware
Spring在注冊(cè)當(dāng)前Bean到容器中時(shí),會(huì)把ApplicationEventPublisher對(duì)象實(shí)例作為參數(shù)回調(diào)該接口方法. ApplicationEventPublisher對(duì)象用于對(duì)所有監(jiān)聽ApplicationListener接口事件的對(duì)象,發(fā)布ApplicationEvent事件。
MessageSourceAware
Spring在注冊(cè)當(dāng)前Bean到容器中時(shí),會(huì)把MessageSource對(duì)象實(shí)例作為參數(shù)回調(diào)該接口方法. MessageSource用于處理Spring的信息資源對(duì)象,如國(guó)際化信息處理
ApplicationContextAware
Spring在注冊(cè)當(dāng)前Bean到容器中時(shí),會(huì)把ApplicationContext對(duì)象實(shí)例作為參數(shù)回調(diào)該接口方法.
ServletContextAware
Spring在注冊(cè)當(dāng)前Bean到容器中時(shí),會(huì)把ServletContext對(duì)象實(shí)例作為參數(shù)回調(diào)該接口方法. 這個(gè)只在基于Web的ApplicationContext才會(huì)啟用
BeanPostProcessors
Spring在對(duì)Bean象進(jìn)行實(shí)例化前后,回調(diào)相應(yīng)的方法。
InitializingBean
Spring容器完成Bean對(duì)象所有properties屬性的依賴裝配后,回調(diào)該接口方法。
DisposableBean
Spring容器在執(zhí)行關(guān)閉操作時(shí),對(duì)Bean對(duì)進(jìn)行銷毀前,回調(diào)該接口方法
了解相關(guān)的生命周期管理接口概念后,下面就比較容易整理Spring的Bean創(chuàng)建和銷毀的整個(gè)調(diào)用過(guò)程:
Spring Bean創(chuàng)建過(guò)程如下:
1 |
觸發(fā) BeanNameAware 的setBeanName方法 |
2 |
觸發(fā)BeanClassLoaderAware的setBeanClassLoader方法 |
3 |
觸發(fā)BeanFactoryAware's setBeanFactory |
4 |
觸發(fā)ResourceLoaderAware's setResourceLoader (only applicable when running in an application context) |
5 |
觸發(fā)ApplicationEventPublisherAware的setApplicationEventPublisher方法 (只在由application context啟動(dòng)時(shí)工作) |
6 |
觸發(fā)MessageSourceAware的 setMessageSource 方法(只在由application context啟動(dòng)時(shí)工作) |
7 |
觸發(fā)ApplicationContextAware'的setApplicationContext方法 (只在由application context啟動(dòng)時(shí)工作) |
8 |
觸發(fā)ServletContextAware的setServletContext 方法(只web application context下啟用) |
9 |
觸發(fā)BeanPostProcessors的postProcessBeforeInitialization方法 |
10 |
觸發(fā)InitializingBean的 afterPropertiesSet方法 |
11 |
觸發(fā)用戶在XML文件中配置的”init-method” 指定的方法名。不指定則跳過(guò) |
12 |
觸發(fā)BeanPostProcessors 的postProcessAfterInitialization 方法 |
Spring Bean銷毀過(guò)程如下:
1 |
觸發(fā) DisposableBean的destroy方法 |
2 |
觸發(fā)用戶在XML文件中配置的” destroy-method” 指定的方法名。不指定則跳過(guò) |
至此Spring Bean生命周期管理的核心內(nèi)容的介紹就到這里。
本章節(jié)完.Good Luck!
Yours Matthew!