第一章-Spirng之旅
##1.1 簡化java開發
Spring是一個開源框架,Spring是為了解決企業級應用開發的複雜性而建立的,所有的理念都可以追溯到Spring最根本的使命上:簡化java開發
Spring是如何簡化java開發的?
為了降低java開發的複雜性,Spring採取了以下4種關鍵策略:
- 基於POJO的輕量級和最小侵入性程式設計;
- 通過依賴注入和麵向介面實現鬆耦合;
- 基於切面和慣例進行宣告式程式設計;
- 通過切面和模板減少樣板式程式碼;
###1.1.1 激發POJO的潛能
很多框架通過強迫應用繼承它們的類或者實現它們的介面從而導致應用與框架綁死,
Spirng不是強迫你實現Spring規範的介面或繼承Spring規範的類,相反,在基於Spring構建的應用中,它的類通常沒有任何痕跡表明你使用了Spring.Spring的非侵入式程式設計模型意味著這個類在Spring應用和非Spring應用都可以發揮同樣的作用。
###1.1.2 依賴注入(DI)
任何一個有實際意義的應用都會由兩個或者更多的類組成,這些類相互之間進行協作來完成特定的業務邏輯。按照傳統的做法,每個物件負責管理與自己相互協作的物件的引用,這將會導致高度耦合和難以測試的程式碼。
耦合局具有兩面性。一方面,緊密耦合的程式碼難以測試,難以複用,難以理解,並且會表現出“打地鼠”式的bug特性。另一方面,一定程度的耦合又是必須的,完全沒有耦合的程式碼什麼都做不了。為了完成有意義的功能,不同的類必須以適當的方式進行互動。
通過DI,物件的依賴關係將由系統中負責協調各物件的第三方元件在建立物件的時候進行設定。物件無須自行建立或管理它們的依賴關係。依賴關係將被自動注入到需要它們的物件當中去。
DI帶來的最大收益–鬆耦合。如果一個物件只通過介面來表明依賴關係,那麼這種依賴就能夠在物件本身毫不知情的情況下,用不同的具體實現來替換。
建立應用元件之間協作的行為通常稱為裝配。Spring有多種裝配bean的方式,採用XML是很常見的一種裝配方式,Spring還支援使用java來描述裝配配置。
Spring通過應用上下文裝配bean的定義並把它們組裝起來。Spring應用上下文全權負責物件的建立和組裝。Spring自帶多種應用上下文的實現,它們之間的區別僅僅在於如果載入配置。
###1.1.3 應用切面
DI能夠讓相互協作的軟體元件保持鬆耦合,而面向切面程式設計(AOP)能把遍佈應用各處的功能分離出來形成可重用的元件。系統由許多不同的元件組成,每一個元件各負責一塊特定功能,除了實現自身核心的功能之外,這些元件還經常承擔額外的職責。諸如日誌,事務管理和安全這樣的系統服務經常融入到自身具有核心業務邏輯元件中去,這些系統服務通常被稱為橫切關注點,因為它們會跨越系統的多個元件。
如果這些關注點分散到多個元件中去,程式碼將會帶來雙重的複雜性。
AOP能過將這些服務模組化,並以宣告的方式將它們應用到它們需要影響的元件中去。所造成的結果就是這些元件會具有更高的內聚性並且更加關注自身的業務,完全不需要了解系統服務所帶來的複雜性。總之,AOP確保POJO的簡單性。
###1.1.4 使用魔板消除樣板式程式碼
樣板式程式碼的一個常見範例是使用JDBC訪問資料庫,JDBC不是產生樣板式程式碼的唯一場景。在很多程式設計場景中往往都有類似的樣板程式碼。
Spring旨在通過模板封裝來清除樣板式程式碼。Spring的JdbcTemplate使得執行資料庫操作時,避免傳統jdbc模板程式碼成為了可能,簡化我們的開發。
##1.2 容納你的Bean
在基於Spring的應用中,你的應用物件生存與Spring容器中。
Spring容器負責建立物件,裝配它們,配置它們並管理它們的整個生命週期,從生存到死亡。
Spring容器並不是只有一個。Spring自帶了多個容器實現,可以歸於兩種不同的型別:
- bean工廠(由org.springframework.beans.factory.BeanFactory介面定義)是最簡單的容器,提供基本的DI支援。
- 應用上下文(由org.springframewoek.context.ApplicationContext介面定義)基於BeanFactory構建,並提供應用框架級別的服務。
bean工廠對大多數應用來說太低階了,應用上下文要比bean工廠更為歡迎。
###1.2.1 使用應用上下文
Spring自帶多種型別的應用上下文,這邊列舉常用的幾個:
-
AnnotationConfigApplicationContext:從一個或多個基於java的配置類中載入上下文定義,適用於java註解的方式;
-
ClassPathXmlApplicationContext:從類路徑下的一個或多個xml配置檔案中載入上下文定義,適用於xml配置的方式;
-
FileSystemXmlApplicationContext:從檔案系統下的一個或多個xml配置檔案中載入上下文定義,也就是說系統碟符中載入xml配置檔案;
-
AnnotationConfigWebApplicationContext:專門為web應用準備的,適用於註解方式;
-
XmlWebApplicationContext:從web應用下的一個或多個xml配置檔案載入上下文定義,適用於xml配置方式。
應用上下文準備就緒後,就可以通過getBean()方法獲取從Spring容器回去bean。
###1.2.2 bean的生命週期
參考:https://www.cnblogs.com/kenshinobiy/p/4652008.html
Spring上下文中的Bean生命週期
1、例項化一個Bean--也就是我們常說的new;
2、按照Spring上下文對例項化的Bean進行配置--也就是IOC注入;
3、如果這個Bean已經實現了BeanNameAware介面,會呼叫它實現的setBeanName(String)方法,此處傳遞的就是Spring配置檔案中Bean的id值
4、如果這個Bean已經實現了BeanFactoryAware介面,會呼叫它實現的setBeanFactory(setBeanFactory(BeanFactory)傳遞的是Spring工廠自身(可以用這個方式來獲取其它Bean,只需在Spring配置檔案中配置一個普通的Bean就可以);
5、如果這個Bean已經實現了ApplicationContextAware介面,會呼叫setApplicationContext(ApplicationContext)方法,傳入Spring上下文(同樣這個方式也可以實現步驟4的內容,但比4更好,因為ApplicationContext是BeanFactory的子介面,有更多的實現方法);
6、如果這個Bean關聯了BeanPostProcessor介面,將會呼叫postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor經常被用作是Bean內容的更改,並且由於這個是在Bean初始化結束時呼叫那個的方法,也可以被應用於記憶體或快取技術;
7、如果Bean在Spring配置檔案中配置了init-method屬性會自動呼叫其配置的初始化方法。
8、如果這個Bean關聯了BeanPostProcessor介面,將會呼叫postProcessAfterInitialization(Object obj, String s)方法、;
注:以上工作完成以後就可以應用這個Bean了,那這個Bean是一個Singleton的,所以一般情況下我們呼叫同一個id的Bean會是在內容地址相同的例項,當然在Spring配置檔案中也可以配置非Singleton,這裡我們不做贅述。
9、當Bean不再需要時,會經過清理階段,如果Bean實現了DisposableBean這個介面,會呼叫那個其實現的destroy()方法;
10、最後,如果這個Bean的Spring配置中配置了destroy-method屬性,會自動呼叫其配置的銷燬方法。
以上10步驟可以作為面試或者筆試的模板,另外我們這裡描述的是應用Spring上下文Bean的生命週期,如果應用Spring的工廠也就是BeanFactory的話去掉第5步就Ok了。
##1.3 Spring模組
- 核心容器(Spring core)
核心容器提供Spring框架的基本功能。Spring以bean的方式組織和管理Java應用中的各個元件及其關係。Spring使用BeanFactory來產生和管理Bean,它是工廠模式的實現。BeanFactory使用控制反轉(IoC)模式將應用的配置和依賴性規範與實際的應用程式程式碼分開。BeanFactory使用依賴注入的方式提供給元件依賴。
- Spring上下文(Spring context)
Spring上下文是一個配置檔案,向Spring框架提供上下文資訊。Spring上下文包括企業服務,如JNDI、EJB、電子郵件、國際化、校驗和排程功能。
- Spring面向切面程式設計(Spring AOP)
通過配置管理特性,Spring AOP 模組直接將面向方面的程式設計功能整合到了 Spring框架中。所以,可以很容易地使 Spring框架管理的任何物件支援 AOP。Spring AOP 模組為基於 Spring 的應用程式中的物件提供了事務管理服務。通過使用 Spring AOP,不用依賴 EJB 元件,就可以將宣告性事務管理整合到應用程式中。
- Spring DAO模組
DAO模式主要目的是將持久層相關問題與一般的的業務規則和工作流隔離開來。Spring 中的DAO提供一致的方式訪問資料庫,不管採用何種持久化技術,Spring都提供一直的程式設計模型。Spring還對不同的持久層技術提供一致的DAO方式的異常層次結構。
- Spring ORM模組
Spring 與所有的主要的ORM對映框架都整合的很好,包括Hibernate、JDO實現、TopLink和IBatis SQL Map等。Spring為所有的這些框架提供了模板之類的輔助類,達成了一致的程式設計風格。
- Spring Web模組
Web上下文模組建立在應用程式上下文模組之上,為基於Web的應用程式提供了上下文。Web層使用Web層框架,可選的,可以是Spring自己的MVC框架,或者提供的Web框架,如Struts、Webwork、tapestry和jsf。
- Spring MVC框架(Spring WebMVC)
MVC框架是一個全功能的構建Web應用程式的MVC實現。通過策略介面,MVC框架變成為高度可配置的。Spring的MVC框架提供清晰的角色劃分:控制器、驗證器、命令物件、表單物件和模型物件、分發器、處理器對映和檢視解析器。Spring支援多種檢視技術。