1. 程式人生 > >《Spring實戰(第3版)》

《Spring實戰(第3版)》

POJO,Plain Ordinary Java Object

第一部分 Spring的核心

第二章 裝配Bean

2.1 宣告Bean

  • 引數注入,通過構造器注入,可注入物件引用
  • 通過工廠方法建立Bean
  • Bean的作用域:預設是單例singleton,prototype:允許Bean的定義可以被例項化任意次(每次呼叫都建立一個例項)
  • 初始化和銷燬Bean:init-method和destroy-method,可使用<beans>元素的default-init-methoddefault-destroy-method配置共同的初始化和銷燬方法,如下所示:
<?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-3.0.xsd" default-init-method="turnOnLights" default-destroy-method
="turnOffLights">
... </beans>
  • 為Bean定義初始化和銷燬方法的另一種可選方式是,讓Bean實現Spring的InitializingBean和DisposableBean介面。Spring容器以特殊的方式對待實現這兩個介面的Bean,允許它們進入Bean的生命週期。

2.2 注入bean屬性

  • 注入簡單值
  • 引用其他Bean
  • 注入內部Bean
    內部Bean是定義在其他Bean內部的Bean,不能被複用,不能被其他Bean所引用。內部Bean不僅限於setter注入,還可以把內部Bean裝配到構造方法的入參中。
<bean
id="kenny" class="com.springinaction.springidol.Instrumentalist">
<property name="song" value="Jingle Bells" /> <property name="instrument"> <bean class="org.springinaction.springidol.Saxophone" /> </property> </bean> <bean id="duke" class="com.springinaction.springidol.PoeticJuggler"> <constructor-arg value="15" /> <constructor-arg> <bean class="com.springinaction.springidol.Sonnet29" /> </constructor-arg> </bean>
  • 使用Spring名稱空間p裝配屬性
  • 裝配集合
Collection element Useful for
<list> Wiring a list of values, allowing duplicates
<set> Wiring a set of values, ensuring no duplicates
<map> Wiring a collection of name-value pairs where name and value can be of any type
<props> Wiring a collection of name-value pairs where the name and value are both Strings
  • 裝配空值
    為屬性設定null值,只需使用<null/>元素。
<property name="someNonNullProperty"><null/></property>

2.3 使用表示式裝配

  • Spring表示式語言(Spring Expression Language, SpEL)
  • #{}標記其內容是SpEL表示式
  • SpEL支援正則表示式
  • 可使用SpEL篩選集合、訪問集合成員、查詢集合成員、投影集合(從集合的每一個成員中選擇特定的屬性放入一個新的集合中)。
  • 思考:是否可替代應用的配置項???

第三章 最小化Spring XML配置

  • 自動裝配(autowiring)
    有助於減少甚至消除配置<property>元素和<constructor-arg>元素,讓Spring自動識別如何裝配Bean的依賴關係。
  • 自動檢測(autodiscovery)
    比自動裝配更進一步,讓Spring能夠自動識別哪些類需要被配置成Spring Bean,從而減少對<bean>元素的使用。

3.1 自動裝配Bean屬性

  • 4種類型的自動裝配
型別 說明
byName 相同名字(或者ID),屬性裝配
byType 相同型別,屬性裝配
constructor 相同型別,構造器裝配
autodetect 先constructor,如失敗使用byType
  • 首選Bean(預設primary的值為true)、取消某個Bean的自動裝配的候選資格
  • 預設自動裝配
    可在根元素<beans>增加default-autowire屬性標示所有Bean的預設自動裝配型別,但是<bean>中的autowire屬性可以覆蓋<beans>元素所配置的預設自動裝配策略。
  • 混合使用自動裝配和顯示裝配
    注意事項:當使用constructor自動裝配策略時,我們必須讓Spring自動裝配構造器的所有入參——我們不能混合使用constructor自動裝配策略和<constructor-arg>元素。

3.2 使用註解裝配

Spring容器預設禁用註解裝配。在Spring的context名稱空間中配置<context:annotation-config>啟用自動裝配功能,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.xsd">
    <context:annotation-config />
    <!-- bean declarations go here -->
</beans>
  • @Autowired
    byType方式,不僅可標註setter方法,還可以標註需要自動裝配Bean引用的任意方法,甚至可以標註構造器及屬性。可通過配置required屬性配置自動裝配是可選的。當使用構造器裝配時,只有一個構造器可以將required屬性設定為true。
    如下所示:
@Autowired
public void setInstrument(Instrument instrument) {
    this.instrument = instrument;
}

@Autowired
public void heresYourInstrument(Instrument instrument) {
    this.instrument = instrument;
}

@Autowired
public Instrumentalist(Instrument instrument) {
    this.instrument = instrument;
}

@Autowired(required=false)
private Instrument instrument;
  • @Qualifier
    限定歧義性的依賴,byName裝配。可建立自定義的限定器。
  • @Inject
    Java依賴注入規範,和@Autowired一樣,@Inject可以用來自動裝配屬性、方法和構造器;與@Autowired不同的是,@Inject沒有required屬性。因此,@Inject主鍵所標註的依賴關係必須存在,如果不存在,則會丟擲異常。@Inject可以注入一個Provider,可以實現Bean引用的延遲注入以及注入Bean的多個例項等功能。
  • @Named
    類似於Spring的@Qualifier,通過Bean的ID來標識可選擇的Bean。實際上,@Named註解就是一個使用@Qualifier註解所標註的註解。
  • 使用javax.inject.Qualifier建立自定義的JSR-330 Qualifier
  • 在註解注入中使用表示式

3.3 自動檢測Bean

為了配置Spring自動檢測,使用<context:component-scan>元素來代替<context:annotation-config>元素,第一個元素除了完成與第二個元素一樣的工作外,還允許Spring自動檢測Bean和定義Bean。如下所示:

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.xsd">
    <context:component-scan
        base-package="com.springinaction.springidol">
    </context:component-scan>
</beans>
  • 為自動檢測標註Bean
    @Component、@Controller、@Repository、@Service,其中@Component比較常用,可以在標註是指定一個Bean ID作為註解的引數。
  • 過濾元件掃描
    通過<context:include-filter><context:excludefilter>可以隨意調整掃描行為。

3.4 使用Spring基於Java的配置

幾乎不是有XML而使用純粹的Java程式碼類配置Spring應用。

  • 建立基於Java的配置
  • 定義一個配置類
    等價於XML配置中的<beans>元素。
  • 宣告一個簡單的Bean
  • 使用Spring的基於Java的配置進行注入

第4章 面向切面的Spring

AOP(Aspect Oriented Programming),面向切面程式設計。

4.1 什麼是面向切面程式設計

  • AOP述語
    通知(Advice)、連線點(JoinPoint)、切點(Pointcut)、切面(Aspect)、引入(Introduction)、織入(Weaving)
  • Spring通知是Java編寫的
  • Spring在執行期通知物件

    Spring的切面由包裹了目標物件的代理類實現,代理類處理方法的呼叫,執行額外的切面邏輯,並呼叫目標方法。
  • Spring只支援方法連線點

4.2 使用切點選擇連線點

  • 編寫切點
  • 使用Spring的bean()指示器
    該指示器允許在切點表示式中使用Bean的ID來標識Bean。bean()使用Bean ID或Bean名稱作為引數來限制切點只匹配特定的Bean。

4.3 在XML中宣告切面

  • 宣告前置、後置和環繞通知
  • 為通知傳遞引數
  • 通過切面引入新功能

    使用Spring AOP,我們可以為Bean引入新的方法,代理攔截呼叫並委託給實現該方法的的其他物件。

4.4 註解切面

通過@AspectJ,可以將類轉換為一個切面,可註解前置、後置、環繞通知。

4.5 注入AspectJ切面

雖然Spring AOP能夠滿足許多應用的切面需求,但與AspectJ相比,Spring AOP是一個功能比較弱的AOP解決方案。AspectJ提供了Spring AOP所不能支援的許多型別的切點。