(一)Spring IoC
重要概念
1、控制反轉(Inversion of control):
控制反轉是一種通過描述(在java中通過xml或者註解)並通過第三方去產生或獲取特定物件的方式。
控制反轉IoC(Inversion of Control)是說建立物件的控制權進行轉移,以前建立物件的主動權和建立時機是由自己把控的,而現在這種權力轉移到第三方,比如轉移交給了IoC容器,它就是一個專門用來建立物件的工廠,你要什麼物件,它就給你什麼物件,有了 IoC容器,依賴關係就變了,原先的依賴關係就沒了,它們都依賴IoC容器了,通過IoC容器來建立它們之間的關係。
控制反轉就是獲取依賴物件的方式反轉了,正常情況下由應用程式主動建立依賴物件,實現對依賴物件的管理,建立依賴物件的控制權在應用程式手中,應用程式需要什麼物件,就主動去建立這個物件,這是正轉的情況。實現控制反轉之後,由IoC容器實現依賴物件的建立和管理,應用程式需要什麼樣的物件,IoC容器就根據需求建立這個物件,應用程式只是被動地接收和使用這個物件,依賴物件的建立管理控制權由應用程式轉移給了IoC容器,這就實現了控制反轉。
2、依賴注入(Dependency Injection):
控制反轉的另一種表述方式,即讓呼叫類對某一介面的實現類的依賴關係由第三方(容器或協作類)注入,用以移除呼叫類對某一介面實現類的依賴。
3、Beanfacory 和ApplicationContext:
Spring通過配置檔案描述Bean以及Bean之間的依賴關係,利用Java語言的反射功能例項化Bean並建立起Bean之間的依賴關係。Spring的IoC容器在完成這些底層工作的基礎上,提供了Bean例項快取、生命週期管理、Bean例項代理、事件釋出、資源裝載等服務。
Beanfacory 是Spring框架最核心的介面,提供了高階IoC的配置機制。Beanfacory使管理不同的java物件成為可能,ApplicationContext(應用上下文)建立在Beanfacory基礎之上,提供更多面向引用的功能。Beanfacory 即為IoC容器,由於ApplicationContext建立在Beanfacory,我們也稱ApplicationContext為IoC容器。
IoC容器主要功能
1、動態建立、注入依賴物件。
2、管理物件生命週期。
3、對映依賴關係。
實現IoC容器的方式:
1、依賴查詢。
2、依賴注入。
依賴注入的三種方式:1、構造器注入。2、setter注入。3、介面注入。
注入和裝配的區別:
注入是例項化一個類時對類中各個引數的賦值方式。
裝配是定義bean以及bean之間關係。
- 裝配bean概述:
1、基於xml中配置。
2、基於註解中配置。
3、基於java類配置。
4、基於Groovy DSL配置。
- Bean作用域:
1、單例(singleton):它是預設的選項,在整個應用中,Spring只為其生成一個Bean的例項。
2、原型(prototype):每次注入時,或者通過Spring IoC容器獲取Bean時,Spring都會為它建立一個新的例項。
3、會話(session):在web應用中使用,就是在會話過程中Spring只會建立一個例項。
4、請求(request):在web應用中使用,就是在一次請求中Spring會建立一個例項,但是不同的請求會建立不同的例項。
基於xml中配置
1、四種自動裝配型別:
(1)byName:根據名字自行自動匹配。
(2)byType:根據型別自行自動匹配。
(3)construtor:根據建構函式自行自動匹配。
(4)autodetect:根據bean的自省機制選擇byType或者construtor。
2、Bean之間的關係:
(1)繼承;(2)依賴;(3)引用。
基於註解的配置
1、使用註解定義bean
@Component:用於對所有的類進行註解。
@Repository:用於對Dao實現類進行標註。
@Service:用於對Service實現類進行標註。
@controller:用於對controller實現類進行標註。
2、自動裝配
(1)@Autowired:通過@Autowired註解實現Bean的依賴注入。
(2)@Autowired的required屬性:用來指定是否必須找到匹配的Bean。
(3)@Qualifier,指定Bean的名稱。
profile:用於切換開發環境。
Spring EL:
概念:更為靈活的注入方式,能夠在執行時構建複雜表示式,存取物件屬性、物件方法呼叫等。
作用:
1、使用bean id引用bean。
2、呼叫指定物件的方法和訪問物件的屬性。
3、進行運算。
4、提供正規表示式進行匹配。
5、集合配置。
(二)面向切面程式設計(Aspect Oriented Programming)
概述:AOP技術利用"橫切"技術,剖解開封裝的物件內部,並將那些影響了多個類的公共行為封裝到一個可重用模組,並將其命名為"Aspect",即切面。所謂"切面",簡單說就是那些與業務無關,卻為業務模組所共同呼叫的邏輯或責任封裝起來,便於減少系統的重複程式碼,降低模組之間的耦合度,並有利於未來的可操作性和可維護性。
AOP相關概念
1、方面(Aspect):一個關注點的模組化,這個關注點實現可能另外橫切多個物件。事務管理是J2EE應用中一個很好的橫切關注點例子。方面用Spring的 Advisor或攔截器實現。
2、連線點(Joinpoint): 程式執行過程中明確的點,如方法的呼叫或特定的異常被丟擲。
3、通知(Advice): 在特定的連線點,AOP框架執行的動作。各種型別的通知包括“around”、“before”和“throws”通知。通知型別將在下面討論。許多AOP框架包括Spring都是以攔截器做通知模型,維護一個“圍繞”連線點的攔截器鏈。Spring中定義了四個advice: BeforeAdvice, AfterAdvice, ThrowAdvice和DynamicIntroductionAdvice。
4、切入點(Pointcut): 指定一個通知將被引發的一系列連線點的集合。AOP框架必須允許開發者指定切入點:例如,使用正規表示式。 Spring定義了Pointcut介面,用來組合MethodMatcher和ClassFilter,可以通過名字很清楚的理解, MethodMatcher是用來檢查目標類的方法是否可以被應用此通知,而ClassFilter是用來檢查Pointcut是否應該應用到目標類上。
5、引入(Introduction): 新增方法或欄位到被通知的類。 Spring允許引入新的介面到任何被通知的物件。例如,你可以使用一個引入使任何物件實現 IsModified介面,來簡化快取。Spring中要使用Introduction, 可有通過DelegatingIntroductionInterceptor來實現通知,通過DefaultIntroductionAdvisor來配置Advice和代理類要實現的介面。
6、目標物件(Target Object): 包含連線點的物件。也被稱作被通知或被代理物件。POJO。
7、AOP代理(AOP Proxy): AOP框架建立的物件,包含通知。 在Spring中,AOP代理可以是JDK動態代理或者CGLIB代理。
8、織入(Weaving): 組裝方面來建立一個被通知物件。這可以在編譯時完成(例如使用AspectJ編譯器),也可以在執行時完成。Spring和其他純Java AOP框架一樣,在執行時完成織入。
- 前置通知(Before advice): 在某連線點(join point)之前執行的通知,但這個通知不能阻止連線點前的執行(除非它丟擲一個異常)。
- 後置通知(After advice): 當某連線點退出的時候執行的通知(不論是正常返回還是異常退出)。
- 環繞通知(Around Advice): 包圍一個連線點(join point)的通知,如方法呼叫。這是最強大的一種通知型別。 環繞通知可以在方法呼叫前後完成自定義的行為。它也會選擇是否繼續執行連線點或直接返回它們自己的返回值或丟擲異常來結束執行。
- 返回後通知(After returning advice): 在某連線點(join point)正常完成後執行的通知,例如,一個方法沒有丟擲任何異常,正常返回。
- 丟擲異常後通知(After throwing advice): 在方法丟擲異常退出時執行的通知。
Spring AOP實現的四種方式:
1、使用proxyFactoryBean和對應的介面實現AOP
2、使用XML配置AOP
3、使用@AspectJ註解驅動切面
4、使用AspectJ注入切面
多切面的情況:
(1)aspect裡面有一個order屬性,order屬性的數字就是橫切關注點的順序。
(2)Spring預設以aspect的定義順序作為織入順序。
(三)Spring事務管理
1、事務管理器
Spring並不直接管理事務,而是提供了多種事務管理器,他們將事務管理的職責委託給Hibernate或者JTA等持久化機制所提供的相關平臺框架的事務來實現。Spring事務管理器的介面是org.springframework.transaction.PlatformTransactionManager,通過這個介面,Spring為各個平臺如JDBC、Hibernate等都提供了對應的事務管理器。
2、事務屬性的定義
(1)傳播行為:
Spring定義了七種傳播行為,以下為常見型別:
PROPAGATION_REQUIRED:表示當前方法必須執行在事務中。如果當前事務存在,方法將會在該事務中執行。否則,會啟動一個新的事務
PROPAGATION_SUPPORTS:表示當前方法不需要事務上下文,但是如果存在當前事務的話,那麼該方法會在這個事務中執行
PROPAGATION_MANDATORY:表示該方法必須在事務中執行,如果當前事務不存在,則會丟擲一個異常
(2)隔離級別
隔離級別定義了一個事務可能受其他併發事務影響的程度。
- ISOLATION_DEFAULT:使用後端資料庫預設的隔離級別
- ISOLATIONREADUNCOMMITTED:最低的隔離級別,允許讀取尚未提交的資料變更,可能會導致髒讀、幻讀或不可重複讀.
- ISOLATIONREADCOMMITTED:允許讀取併發事務已經提交的資料,可以阻止髒讀,但是幻讀或不可重複讀仍有可能發生
- ISOLATIONREPEATABLEREAD:對同一欄位的多次讀取結果都是一致的,除非資料是被本身事務自己所修改,可以阻止髒讀和不可重複讀,但幻讀仍有可能發生
- ISOLATION_SERIALIZABLE:最高的隔離級別,完全服從ACID的隔離級別,確保阻止髒讀、不可重複讀以及幻讀,也是最慢的事務隔離級別,因為它通常是通過完全鎖定事務相關的資料庫表來實現的
(3)只讀:通過將事務設定為只讀,你就可以給資料庫一個機會,讓它應用它認為合適的優化措施。
(4)事務超時:事務超時就是事務的一個定時器,在特定時間內事務如果沒有執行完畢,那麼就會自動回滾,而不是一直等待其結束。
(5)回滾規則:這些規則定義了哪些異常會導致事務回滾而哪些不會。
3、程式設計式和宣告式事務的區別
Spring提供了對程式設計式事務和宣告式事務的支援,程式設計式事務允許使用者在程式碼中精確定義事務的邊界,而宣告式事務(基於AOP)有助於使用者將操作與事務規則進行解耦。
簡單地說,程式設計式事務侵入到了業務程式碼裡面,但是提供了更加詳細的事務管理;而宣告式事務由於基於AOP,所以既能起到事務管理的作用,又可以不影響業務程式碼的具體實現。
宜信技術學院 作者:姚遠