javascript
batch spring 重复执行_Spring源码高级笔记之——Spring AOP应用
Spring AOP應用
AOP本質:在不改變原有業務邏輯的情況下增強橫切邏輯,橫切邏輯代碼往往是權限校驗代碼、日志代碼、事務控制代碼、性能監控代碼。
第1節AOP相關術語
1.1業務主線
在講解AOP術語之前,我們先來看一下下面這兩張圖,它們就是第三部分案例需求的擴展(針對這些擴展的需求,我們只進行分析,在此基礎上去進一步回顧AOP,不進行實現)
上圖描述的就是未采用AOP思想設計的程序,當我們紅色框中圈定的方法時,會帶來大量的重復勞動。程序中充斥著大量的重復代碼,使我們程序的獨立性很差。而下圖中是采用了AOP思想設計的程序,它把紅框部分的代碼抽取出來的同時,運用動態代理技術,在運行期對需要使用的業務邏輯方法進行增強。
1.2 AOP 術語
連接點:方法開始時、結束時、正常運行完畢時、方法異常時等這些特殊的時機點,我們稱之為連接點,項目中每個方法都有連接點,連接點是一種候選點
切入點:指定AOP思想想要影響的具體方法是哪些,描述感興趣的方法
Advice增強:
第一個層次:指的是橫切邏輯
第二個層次︰方位點(在某一些連接點上加入橫切邏輯,那么這些連接點就叫做方位點,描述的是具體的特殊時機)
Aspect切面:切面概念是對上述概念的一個綜合
Aspect切面=切入點+增強=切入點(鎖定方法)+方位點(鎖定方法中的特殊時機)+橫切邏輯
眾多的概念,目的就是為了鎖定要在哪個地方插入什么橫切邏輯代碼
Spring中AOP的代理選擇
Spring 實現AOP思想使用的是動態代理技術
默認情況下,Spring會根據被代理對象是否實現接口來選擇使用JDK還是CGLIB。當被代理對象沒有實現任何接口時,Spring會選擇CGLIB。當被代理對象實現了接口,Spring會選擇JDK官方的代理技術,不過我們可以通過配置的方式,讓Spring強制使用CGLIB。
Spring中AOP的配置方式
在Spring的AOP配置中,也和loC配置一樣,支持3類配置方式。
第一類:使用XML配置
第二類:使用XML+注解組合配置
第三類:使用純注解配置
Spring中AOP實現
需求∶橫切邏輯代碼是打印日志,希望把打印日志的邏輯織入到目標方法的特定位置(service層transfer方法)
XML模式
Spring是模塊化開發的框架,使用aop就引入aop的jar
- 坐標
- AOP核心配置
- 細節
- 關于切入點表達式
上述配置實現了對TransferServiceImpl 的updateAccountByCardNo方法進行增強,在其執行之前,輸出了記錄日志的語句。這里面,我們接觸了一個比較陌生的名稱:切入點表達式,它是做什么的呢?我們往下看。
- 概念及作用
切入點表達式,也稱之為AspectJ切入點表達式,指的是遵循特定語法結構的字符串,其作用是用于對符合語法格式的連接點進行增強。它是AspectJ表達式的一部分。
- 關于AspectJ
AspectJ是一個基于Java語言的AOP框架,Spring框架從2.0版本之后集成了AspectJ框架中切入點表達式的部分,開始支持AspectJ切入點表達式。
- 切入點表達式使用示例
- 改變代理方式的配置
在前面我們已經說了,Spring在選擇創建代理對象時,會根據被代理對象的實際情況來選擇的。被代理對象實現了接口,則采用基于接口的動態代理。當被代理對象沒有實現任何接口的時候,Spring會自動切換到基于子類的動態代理方式。
但是我們都知道,無論被代理對象是否實現接口,只要不是final修飾的類都可以采用cglib提供的方式創建代理對象。所以Spring也考慮到了這個情況,提供了配置的方式實現強制使用基于子類的動態代理(即cglib的方式),配置的方式有兩種
- 使用aop:config標簽配置
- 使用aop:aspectj-autoproxy標簽配置
- 五種通知類型
- 前置通知
配置方式: aop:before標簽
執行時機
前置通知永遠都會在切入點方法(業務核心方法)執行之前執行。
細節
前置通知可以獲取切入點方法的參數,并對其進行增強。
- 正常執行時通知
配置方式
- 異常通知
配置方式
執行時機
異常通知的執行時機是在切入點方法(業務核心方法)執行產生異常之后,異常通知執行。如果切入點方法執行沒有產生異常,則異常通知不會執行。
細節
異常通知不僅可以獲取切入點方法執行的參數,也可以獲取切入點方法執行產生的異常信息。
- 最終通知
配置方式
執行時機
最終通知的執行時機是在切入點方法(業務核心方法)執行完成之后,切入點方法返回之前執行。換句話說,無論切入點方法執行是否產生異常,它都會在返回之前執行。
細節
最終通知執行時,可以獲取到通知方法的參數。同時它可以做一些清理操作。
- 環繞通知
配置方式
XML+注解模式
- XML中開啟Spring對注解AOP的支持
- 示例
注解模式
在使用注解驅動開發aop時,我們要明確的就是,是注解替換掉配置文件中的下面這行配置:
在配置類中使用如下注解進行替換上述配置
Spring聲明式事務的支持
編程式事務:在業務代碼中添加事務控制代碼,這樣的事務控制機制就叫做編程式事務聲明式事務:通過xml或者注解配置的方式達到事務控制的目的,叫做聲明式事務
事務回顧
事務的概念
事務指邏輯上的一組操作,組成這組操作的各個單元,要么全部成功,要么全部不成功。從而確保了數據的準確與安全。
例如:A——B轉帳,對應于如下兩條sql語句:
這兩條語句的執行,要么全部成功,要么全部不成功。
事務的四大特性
原子性(Atomicity)原子性是指事務是一個不可分割的工作單位,事務中的操作要么都發生,要么都不發生。
從操作的角度來描述,事務中的各個操作要么都成功要么都失敗
一致性(Consistency)事務必須使數據庫從一個一致性狀態變換到另外一個一致性狀態。例如轉賬前A有1000,B有1000。轉賬后A+B也得是2000。
一致性是從數據的角度來說的,(1000,1000)(900,1100),不應該出現(900,1000)
隔離性(lsolation)事務的隔離性是多個用戶并發訪問數據庫時,數據庫為每一個用戶開啟的事務,每個事務不能被其他事務的操作數據所干擾,多個并發事務之間要相互隔離。
比如:事務1給員工漲工資2000,但是事務1尚未被提交,員工發起事務2查詢工資,發現工資漲了2000塊錢,讀到了事務1尚未提交的數據(臟讀)
持久性(Durability)
持久性是指一個事務一旦被提交,它對數據庫中數據的改變就是永久性的,接下來即使數據庫發生故障也不應該對其有任何影響。
事務的隔離級別
不考慮隔離級別,會出現以下情況:(以下情況全是錯誤的),也即為隔離級別在解決事務并發問題
臟讀:一個線程中的事務讀到了另外一個線程中未提交的數據。
不可重復讀:一個線程中的事務讀到了另外一個線程中已經提交的update的數據(前后內容不一樣)
場景:
員工A發起事務1,查詢工資,工資為1w,此時事務1尚未關閉財務人員發起了事務2,給員工A張了2000塊錢,并且提交了事務
員工A通過事務1再次發起查詢請求,發現工資為1.2w,原來讀出來1w讀不到了,叫做不可重復讀虛讀〈幻讀)︰一個線程中的事務讀到了另外一個線程中已經提交的insert或者delete的數據〈前后條數不一樣)
場景:
事務1查詢所有工資為1w的員工的總數,查詢出來了10個人,此時事務尚未關閉
事務2財務人員發起,新來員工,工資1 w,向表中插入了2條數據,并且提交了事務
事務1再次查詢工資為1w的員工個數,發現有12個人,見了鬼了
數據庫共定義了四種隔離級別:
Serializable(串行化)︰可避免臟讀、不可重復讀、虛讀情況的發生。(串行化)最高
Repeatable read(可重復讀)︰可避免臟讀、不可重復讀情況的發生。(幻讀有可能發生)第二該機制下會對要update的行進行加鎖
Read committed(讀已提交)︰可避免臟讀情況發生。不可重復讀和幻讀一定會發生。第三
Read uncommitted(讀未提交)︰最低級別,以上情況均無法保證。(讀未提交)最低
注意:級別依次升高,效率依次降低
MySQL的默認隔離級別是:REPEATABLE READ
查詢當前使用的隔離級別:select @@tx_isolation;
設置MySQL事務的隔離級別: set session transaction isolation level xxx;(設置的是當前mysql連接會話的,并不是永久改變的)
事務的傳播行為
事務往往在service層進行控制,如果出現service層方法A調用了另外一個service層方法B,A和B方法本身都已經被添加了事務控制,那么A調用B的時候,就需要進行事務的一些協商,這就叫做事務的傳播行為。
A調用B,我們站在B的角度來觀察來定義事務的傳播行為
Spring中事務的API
mybatis: sqlSession.commit();
hibernate: session.commit();
PlatformTransactionManager
作用
此接口是Spring的事務管理器核心接口。Spring本身并不支持事務實現,只是負責提供標準,應用底層支持什么樣的事務,需要提供具體實現類。此處也是策略模式的具體應用。在Spring框架中,也為我們內置了一些具體策略,例如:DataSourceTransactionManager,HibernateTransactionManager等等。(和HibernateTransactionManager事務管理器在spring-orm-5.1.12.RELEASE.jar中)Spring JdbcTemplate(數據庫操作工具)、Mybatis (mybatis-spring.jar)—-——>
DataSourceTransactionManager
Hibernate框架——————> HibernateTransactionManager
DataSourceTransactionManager歸根結底是橫切邏輯代碼,聲明式事務要做的就是使用Aop(動態代理)來將事務控制邏輯織入到業務代碼
Spring聲明式事務配置
- 純xml模式
- 導入jar
- xml配置
- 基于XML+注解
- xml配置
- 在接口、類或者方法上添加@Transactional注解
- 基于純注解
Spring基于注解驅動開發的事務控制配置,只需要把xml配置部分改為注解實現。只是需要一個注解替換掉xml配置文件中的
manager="transactionManager" />配置。
在Spring的配置類上添加@EnableTransactionManagement注解即可
今天的分享就先到這里,可以關注小編獲得第一手資料哦!
往期推薦閱讀:
Spring源碼高級筆記之——Spring概述
Spring源碼高級筆記之——Spring核心思想
Spring源碼高級筆記之——銀行案例手寫IOC和AOP
Spring源碼高級筆記之——Spring IOC 應用
Spring源碼高級筆記——Spring IOC源碼深度剖析
總結
以上是生活随笔為你收集整理的batch spring 重复执行_Spring源码高级笔记之——Spring AOP应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hssfworkbook 单元格合并后宽
- 下一篇: c# ioc 单例模式_Spring-I