《Spring實戰》1.Spring介紹
Spring體系模組
組成 Spring 框架的每個模組(或元件)都可以單獨存在,或者與其他一個或多個模組聯合實現。每個模組的功能如下:
- 核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要元件是
BeanFactory
,它是工廠模式的實現。BeanFactory
使用控制反轉 (IOC) 模式將應用程式的配置和依賴性規範與實際的應用程式程式碼分開。 - Spring 上下文:Spring 上下文是一個配置檔案,向 Spring 框架提供上下文資訊。Spring 上下文包括企業服務,例如 JNDI、EJB、電子郵件、國際化、校驗和排程功能。
- Spring AOP:通過配置管理特性,Spring AOP 模組直接將面向方面的程式設計功能整合到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何物件支援 AOP。Spring AOP 模組為基於 Spring 的應用程式中的物件提供了事務管理服務。通過使用 Spring AOP,不用依賴 EJB 元件,就可以將宣告性事務管理整合到應用程式中。
- Spring DAO:JDBC DAO 抽象層提供了有意義的異常層次結構,可用該結構來管理異常處理和不同資料庫供應商丟擲的錯誤訊息。異常層次結構簡化了錯誤處理,並且極大地降低了需要編寫的異常程式碼數量(例如開啟和關閉連線)。Spring DAO 的面向 JDBC 的異常遵從通用的 DAO 異常層次結構。
- Spring ORM:Spring 框架插入了若干個 ORM 框架,從而提供了 ORM 的物件關係工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有這些都遵從 Spring 的通用事務和 DAO 異常層次結構。
- Spring Web 模組:Web 上下文模組建立在應用程式上下文模組之上,為基於 Web 的應用程式提供了上下文。所以,Spring 框架支援與 Jakarta Struts 的整合。Web 模組還簡化了處理多部分請求以及將請求引數繫結到域物件的工作。
- Spring MVC 框架:MVC 框架是一個全功能的構建 Web 應用程式的 MVC 實現。通過策略介面,MVC 框架變成為高度可配置的,MVC 容納了大量檢視技術,其中包括 JSP、Velocity、Tiles、iText 和 POI。
Spring簡化了Java的開發
為了降低Java開發的複雜性,Spring採取了4個關鍵策略:
- 基於POJO的輕量級和最小侵入性程式設計
- 通過依賴注入和麵向介面實心鬆耦合
- 基於切面和慣例進行宣告式程式設計
- 通過切面和模板減少樣板式程式碼
1.依賴注入(DI)
通過DI,物件的依賴關係將由系統中負責協調各物件的第三方元件在建立物件的時候進行設定,物件無需自行建立或管理他們的關係。在Spring中由容器管理物件的依賴關係。帶來的最大收益--鬆耦合
建立應用元件之間協作的行為統稱為裝配。Spring有多種裝配Bean的方式,採用XML是一種很常用的方式。
<bean id="" class="com.java.ClassName">
<constructor-arg value="123"/> 構造器傳入引數
</bean>
id填入Bean的ID,class填入類的全類名。
Spring還支援基於Java的配置
@Configuration // 聲明當前類為一個配置類
public class Config {
@Bean // 宣告為一個Bean
public ClassName className() {
return new ClassName();
}
}
Spring通過應用上下文(Application Context)裝載bean的定義並把它們組裝起來。Spring應用上下文全權負責物件的建立和組裝。Spring自帶和多種應用上下文的實現。
3.切面(AOP)
DI能夠讓相互協作的軟體元件保持鬆散耦合,而面向切面程式設計允許你把遍佈應用各處的功能分離出來形成可重用的元件。例如日誌、事物管理、安全等這樣的系統服務經常在AOP中使用。
AOP能夠使這些服務模組化,並且以宣告的方式將他們應用到他們需要影響的元件中。可以將安全、事物和安全與核心業務邏輯相分離。
<aop:config>
<aop:aspect ref="aspect"> //宣告一個切面
// 定義切點
<aop:pointcut id="point" expression="execution(* *.method())"/>
// 宣告該切點的前置通知
<aop:before pointcut-ref="point" method="afterMethod"/>
// 宣告該切點的後置通知
<aop:after pointcut-ref="point" method="afterMethod"/>
</aop:aspect>
</aop:config>
這樣就可以在xml中簡單配置一個AOP。
4.使用模板消除樣板式程式碼
當使用JDBC查詢資料時存在大量的樣板式程式碼。Spring的jdbcTemplate使得執行資料庫操作時,避免出現大量的模板式程式碼。
Bean容器
在基於Spring的應用中,你的應用物件生存於Spring容器(container)中,Spring容器負責建立物件,裝配他們,配置他們並管理他們整個生命週期。
Spring容器自帶了多個容器實現,可以歸為兩種不同型別。bean工廠是最簡單的容器,提供基本的DI支援。應用上下文基於BeanFactory構建。經常使用的應用上下文:
- AnnotationConfigApplicationContext:從一個或多個基於Java的配置類中載入Spring應用上下文。
- AnnotationConfigWebApplicationContext:從一個或者多個基於Java的配置類中載入Spring Web應用上下文。
- ClassPathXMLApplicationContext:從類路徑下的一個或多個XML配置檔案中載入上下文定義,把應用上下文的定義檔案作為類資源。
- FileSystemXmlApplicationContext:從檔案系統的一個或多個XML配置檔案中載入上下文定義。
- XmlWebApplicationContext:從Web應用下的一個或多個XML配置檔案中載入上下文定義。
無論是從檔案系統中裝載應用上下文,還是從類路徑下裝載應用上下文,將bean載入到beanFactory的過程都是相似的。
1.bean的生命週期
- Spring對bean進行例項化
- Spring將值和bean的引用注入到bean對應的屬性中;
- 如果bean實現了BeanFactoryAware介面,Spring將bean的ID傳遞給setBeanName()方法;
- 如果bean實現了BeanFactoryAware介面,Spring將呼叫setBeanFactory()方法,將BeanFactory容器例項傳入。
- 如果bean實現了ApplicationContextAware介面,Spring將呼叫setApplicationContext()方法,將bean所在的應用上下文的引用傳入;
- 如果bean實現了BeanPostProcessor介面,Spring將呼叫它們的postProcessBeforeInitialization()方法。
- 如果bean實現了InitializingBean介面,Spring將呼叫他們的afterPropertiesSet()方法。類似的,如果bean使用init-method聲明瞭初始化方法,該方法也會被呼叫。
- 如果bean實現了BeanPostProcessor介面,Spring將呼叫它們的postProcessAfterInitialization()方法。
- 此時bean已經準備就緒,可以被應用程式使用了,他們將一直駐留在應用上下文中,直到應用上下文被摧毀;
- 如果bean實現了DisposableBean介面,Spring將呼叫他的destroy()介面方法。同樣的,如果bean使用destroy-method聲明瞭銷燬方法,該方法也會被呼叫。