1. 程式人生 > >Spring 基礎知識學習

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