Spring 基礎知識學習

  • 2019 年 10 月 28 日
  • 筆記

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