《Spring實戰(第3版)》
阿新 • • 發佈:2019-01-08
POJO,Plain Ordinary Java Object
第一部分 Spring的核心
第二章 裝配Bean
2.1 宣告Bean
- 引數注入,通過構造器注入,可注入物件引用
- 通過工廠方法建立Bean
- Bean的作用域:預設是單例singleton,prototype:允許Bean的定義可以被例項化任意次(每次呼叫都建立一個例項)
- 初始化和銷燬Bean:init-method和destroy-method,可使用
<beans>
元素的default-init-method
和default-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所不能支援的許多型別的切點。