Spring 基礎知識學習
Spring 總結
在Spring框架的釋出版本中,共包含了20個不同的模組,可以劃分為6類不同的功能。
Spring整體架構圖
為了降低Java開發的複雜性,Spring採取了以下4種關鍵策略:
- 基於POJO的輕量級和最小侵入性程式設計;
- 通過依賴注入和麵向介面實現鬆耦合;
- 基於切面和慣例進行宣告式程式設計;
- 通過切面和模板減少樣板式程式碼。
依賴注入 DI
建立應用物件之間協作關係的行為通常稱為裝配(wiring),這也是依賴注入(DI)的本質。
當描述bean如何進行裝配時,Spring具有非常大的靈活性,它提供了三種主要的裝配機制:
- 在XML中進行顯式配置。
- 在Java中進行顯式配置。
- 隱式的bean發現機制和自動裝配。
自動化裝配bean
Spring從兩個角度來實現自動化裝配:
- 元件掃描(component scanning):Spring會自動發現應用上下文中所建立的bean。
- 自動裝配(autowiring):Spring自動滿足bean之間的依賴。
元件掃描和自動裝配組合在一起就能發揮出強大的威力,它們能夠將你的顯式配置降低到最少。
@Component註解表明該類會作為元件類,並告知Spring要為這個類建立bean
@ComponentScan註解啟用元件掃描
@Autowired註解實現自動裝配
通過Java程式碼裝配bean
@Bean註解會告訴Spring這個方法將會返回一個物件,該物件要註冊為Spring應用上下文中的bean。
通過XML裝配bean
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="knight" class="com.fiberhome.tongl.knight.BraveKnight"> <constructor-arg ref="quest" /> </bean> <bean id="quest" class="com.fiberhome.tongl.knight.SlayDragonQuest"> <constructor-arg value="#{T(System).out}" /> </bean> </beans>
在XML中宣告DI時,會有多種可選的配置方案和風格。具體到構造器注入,有兩種基本的配置方案可供選擇:
- 使用Spring 3.0所引入的c-名稱空間
屬性注入,也有兩種基本的配置方案可供選擇:
- p-名稱空間
三種Spring的配置使用總結
儘可能地使用自動配置的機制。顯式配置越少越好,以避免顯式配置所帶來的維護成本。當你必須要顯式配置bean的時候(比如,有些原始碼不是由你來維護的,而當你需要為這些程式碼配置bean的時候),應該優先選擇基於Java的配置,它比基於XML的配置更加強大、型別安全並且易於重構。最後,只有當你想要使用便利的XML名稱空間,並且在JavaConfig中沒有同樣的實現時,才應該使用XML。
bean的作用域
Spring定義了多種作用域,可以基於這些作用域建立bean,包括:
- 單例(Singleton):在整個應用中,只建立bean的一個例項。
- 原型(Prototype):每次注入或者通過Spring應用上下文獲取的時候,都會建立一個新的bean例項。
- 會話(Session):在Web應用中,為每個會話建立一個bean例項。
- 請求(Rquest):在Web應用中,為每個請求建立一個bean例項。
單例是預設的作用域,但是正如之前所述,對於易變的型別,這並不合適。如果選擇其他的作用域,要使用@Scope註解,它可以與@Component或@Bean一起使用。
注入外部的值
在Spring中,處理外部值的最簡單方式就是宣告屬性源並通過Spring的Environment來檢索屬性。
@PropertySource引用類路徑中.properties的檔案。
@Value 屬性佔位符(配置PropertySourcesPlaceholderConfigurer bean)
面向切面程式設計(aspect-oriented programming,AOP)
DI有助於應用物件之間的解耦,而AOP可以實現橫切關注點與它們所影響的物件之間的解耦。
切點表示式
使用註解建立切面
@AspectJ註解解表明類不僅僅是一個POJO,還是一個切面
@EnableAspectJAutoProxy註解啟用自動代理功能
AspectJ提供了五個註解來定義通知
- @After 通知方法會在目標方法返回或丟擲異常後呼叫
- @AfterReturning 通知方法會在目標方法返回後呼叫
- @AfterThrowing 通知方法會在目標方法丟擲異常後呼叫
- @Around 通知方法會將目標方法封裝起來
- @Before 通知方法會在目標方法呼叫之前執行
Reference
- 《Spring 實戰(第四版)》