回顧Spring(二)

動態代理

代理設計模式的原理:使用一個代理將本來對象包裝起來,而後用該代理對象取代原始對象。任何對原始對象的調用都要經過代理。代理對象決定是否以及什麼時候將方法調用轉到原始對象上。spring

動態代理的方式

  1. 基於接口實現動態代理: JDK動態代理
  2. 基於繼承實現動態代理: CglibJavassist動態代理

 

AOP概述

  1. AOP(Aspect-Oriented Programming面向切面編程):是一種新的方法論,是對傳 OOP(Object-Oriented Programming,面向對象編程)的補充。
  2. AOP編程操做的主要對象是切面(aspect),而切面用於模塊化橫切關注點(公共功能)
  3. 在應用AOP編程時,仍然須要定義公共功能,但能夠明確的定義這個功能應用在哪裏,以什麼方式應用,而且沒必要修改受影響的類。這樣一來橫切關注點就被模塊化到特殊的類裏——這樣的類咱們一般稱之爲切面
  4. AOP的好處:
  •  每一個事物邏輯位於一個位置,代碼不分散,便於維護和升級
  • 業務模塊更簡潔,只包含核心業務代碼
  • AOP圖解

AOP術語

橫切關注點:從每一個方法中抽取出來的同一類非核心業務。數據庫

切面(Aspect):封裝橫切關注點信息的類,每一個關注點體現爲一個通知方法。express

通知(Advice):切面必需要完成的各個具體工做編程

目標(Target):被通知的對象設計模式

代理(Proxy):向目標對象應用通知以後建立的代理對象服務器

鏈接點(Joinpoint):橫切關注點在程序代碼中的具體體現,對應程序執行的某個特定位置。例如:類某個方法調用前、調用後、方法捕獲到異常後等。併發

切入點(pointcut):定位鏈接點的方式。每一個類的方法中都包含多個鏈接點,因此鏈接點是類中客觀存在的事物。框架

AspectJ

AspectJJava社區裏最完整最流行的AOP框架。Spring2.0以上版本中,可使用基於AspectJ註解或基於XML配置的AOP模塊化

1.Spring中啓用AspectJ註解支持

1.導入JAR性能

  • com.springsource.net.sf.cglib-2.2.0.jar
  • com.springsource.org.aopalliance-1.0.0.jar
  • com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar 
  • spring-aop-4.0.0.RELEASE.jar
  • spring-aspects-4.0.0.RELEASE.jar
  •  

2.引入aop名稱空間

3.配置

<aop:aspectj-autoproxy>

         當Spring IOC容器偵測到bean配置文件中的<aop:aspectj-autoproxy>元素時,會自動爲    AspectJ切面匹配的bean建立代理

2.AspectJ註解聲明切面

  1. 要在Spring中聲明AspectJ切面,只須要在IOC容器中將切面聲明爲bean實例。
  2. 當在Spring IOC容器中初始化AspectJ切面以後,Spring IOC容器就會爲那些與 AspectJ切面相匹配的bean建立代理。
  3. AspectJ註解中,切面只是一個帶有@Aspect註解的Java類,它每每要包含不少通知。
  4. 通知是標註有某種註解的簡單的Java方法。
  5. AspectJ支持5種類型的通知註解:
  • @Before:前置通知,在方法執行以前執行
  • @After:後置通知,在方法執行以後執行
  • @AfterRunning:返回通知,在方法返回結果以後執行
  • @AfterThrowing:異常通知,在方法拋出異常以後執行
  • @Around:環繞通知,圍繞着方法執行

AOP細節

切入點表達式的語法格式

execution([權限修飾符] [返回值類型] [簡單類名/全類名] [方法名]([參數列表]))

 <!-- 【攔截全部public方法】 -->
       <aop:pointcut expression="execution(public * *(..))" id="pt"/>

       <!-- 【攔截全部save開頭的方法 】 -->
       <aop:pointcut expression="execution(* save*(..))" id="pt"/>

       <!-- 【攔截指定類的指定方法, 攔截時候必定要定位到方法】 -->
       <aop:pointcut expression="execution(public * cn.itcast.g_pointcut.OrderDao.save(..))" id="pt"/>

       <!-- 【攔截指定類的全部方法】 -->
       <aop:pointcut expression="execution(* cn.itcast.g_pointcut.UserDao.*(..))" id="pt"/>

       <!-- 【攔截指定包,以及其自包下全部類的全部方法】 -->
       <aop:pointcut expression="execution(* cn..*.*(..))" id="pt"/>

       <!-- 【取非值】 -->
       <aop:pointcut expression="!execution(* cn.itcast.g_pointcut.OrderDao.save())" id="pt"/>

切入點表達式應用到實際的切面類中

事務

JavaEE企業級開發的應用領域,爲了保證數據的完整性一致性,必須引入數據庫事務的概念,因此事務管理是企業級應用程序開發中必不可少的技術。

事務就是一組因爲邏輯上緊密關聯而合併成一個總體(工做單元)的多個數據庫操做,這些操做要麼都執行要麼都不執行

事務的四個關鍵屬性(ACID):

原子性(atomicity)原子的本意是不可再分,事務的原子性表現爲一個事務中涉及到的多個操做在邏輯上缺一不可。事務的原子性要求事務中的全部操做要麼都執行,要麼都不執行。

一致性(consistency)一致指的是數據的一致,具體是指:全部數據都處於知足業務規則的一致性狀態。一致性原則要求:一個事務中無論涉及到多少個操做,都必須保證事務執行以前數據是正確的,事務執行以後數據仍然是正確的。若是一個事務在執行的過程當中,其中某一個或某幾個操做失敗了,則必須將其餘全部操做撤銷,將數據恢復到事務執行以前的狀態,這就是回滾

隔離性(isolation):在應用程序實際運行過程當中,事務每每是併發執行的,因此頗有可能有許多事務同時處理相同的數據,所以每一個事務都應該與其餘事務隔離開來,防止數據損壞。隔離性原則要求多個事務在併發執行過程當中不會互相干擾

 ④持久性(durability):持久性原則要求事務執行完成後,對數據的修改永久的保存下來,不會因各類系統錯誤或其餘意外狀況而受到影響。一般狀況下,事務對數據的修改應該被寫入到持久化存儲器中。

Spring提供的事務管理器

  • Spring從不一樣的事務管理API中抽象出了一整套事務管理機制,讓事務管理代碼從特定的事務技術中獨立出來。開發人員經過配置的方式進行事務管理,而沒必要了解其底層是如何實現的。
  • Spring的核心事務管理抽象是它爲事務管理封裝了一組獨立於技術的方法。不管使用Spring的哪一種事務管理策略(編程式或聲明式),事務管理器都是必須的。
  • 事務管理器能夠以普通的bean的形式聲明在Spring IOC容器中。

事務管理器的主要實現

  1. DataSourceTransactionManager:在應用程序中只須要處理一個數據源,並且經過JDBC存取。
  2. JtaTransactionManager:在JavaEE應用服務器上用JTA(Java Transaction API)進行事務管理
  3. HibernateTransactionManager:用Hibernate框架存取數據庫

事務的傳播行爲

當事務方法被另外一個事務方法調用時,必須指定事務應該如何傳播。例如:方法可能繼續在現有事務中運行,也可能開啓一個新事務,並在本身的事務中運行。

事務的傳播行爲能夠由傳播屬性指定。Spring定義了7種類傳播行爲。

事務傳播屬性能夠在@Transactional註解的propagation屬性中定義。

事務的隔離級別

數據庫併發問題

         假設如今有兩個事務:Transaction01Transaction02併發執行。

  1. 髒讀

         ①Transaction01將某條記錄的AGE值從20修改成30

         ②Transaction02讀取了Transaction01更新後的值:30

         ③Transaction01回滾,AGE值恢復到了20

         ④Transaction02讀取到的30就是一個無效的值。

2.不可重複讀

         ①Transaction01讀取了AGE值爲20

         ②Transaction02AGE值修改成30

         ③Transaction01再次讀取AGE值爲30,和第一次讀取不一致。

  1. 幻讀

         ①Transaction01讀取了STUDENT表中的一部分數據。

         ②Transaction02STUDENT表中插入了新的行。

         ③Transaction01讀取了STUDENT表時,多出了一些行。

隔離級別

數據庫系統必須具備隔離併發運行各個事務的能力,使它們不會相互影響,避免各類併發問題。一個事務與其餘事務隔離的程度稱爲隔離級別SQL標準中規定了多種事務隔離級別,不一樣隔離級別對應不一樣的干擾程度,隔離級別越高,數據一致性就越好,但併發性越弱。

1.讀未提交READ UNCOMMITTED

容許Transaction01讀取Transaction02未提交的修改。

2.讀已提交READ COMMITTED

            要求Transaction01只能讀取Transaction02已提交的修改。

3.可重複讀REPEATABLE READ

            確保Transaction01能夠屢次從一個字段中讀取到相同的值,即Transaction01執行期間禁止其它事務對這個字段進行更新。

4.串行化SERIALIZABLE

            確保Transaction01能夠屢次從一個表中讀取到相同的行,在Transaction01執行期間,禁止其它事務對這個表進行添加、更新、刪除操做。能夠避免任何併發問題,但性能十分低下。

5.各個隔離級別解決併發問題的能力見下表

 

髒讀

不可重複讀

幻讀

READ UNCOMMITTED

READ COMMITTED

REPEATABLE READ

SERIALIZABLE

6.各類數據庫產品對事務隔離級別的支持程度

 

Oracle

MySQL

READ UNCOMMITTED

false

true

READ COMMITTED

true(默認)

true

REPEATABLE READ

false

true(默認)

SERIALIZABLE

true true

 

Spring中指定事務隔離級別

  1. 註解

@Transactional註解聲明式地管理事務時能夠在@Transactionalisolation屬性中設置隔離級別

  1. XML

Spring 2.x事務通知中,能夠在<tx:method>元素中指定隔離級別

相關文章
相關標籤/搜索