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 實戰(第四版)》