日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

batch spring 重复执行_Spring源码高级笔记之——Spring AOP应用

發(fā)布時間:2024/8/5 javascript 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 batch spring 重复执行_Spring源码高级笔记之——Spring AOP应用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Spring AOP應(yīng)用

AOP本質(zhì):在不改變原有業(yè)務(wù)邏輯的情況下增強橫切邏輯,橫切邏輯代碼往往是權(quán)限校驗代碼、日志代碼、事務(wù)控制代碼、性能監(jiān)控代碼。

第1節(jié)AOP相關(guān)術(shù)語

1.1業(yè)務(wù)主線

在講解AOP術(shù)語之前,我們先來看一下下面這兩張圖,它們就是第三部分案例需求的擴展(針對這些擴展的需求,我們只進行分析,在此基礎(chǔ)上去進一步回顧AOP,不進行實現(xiàn))

上圖描述的就是未采用AOP思想設(shè)計的程序,當我們紅色框中圈定的方法時,會帶來大量的重復(fù)勞動。程序中充斥著大量的重復(fù)代碼,使我們程序的獨立性很差。而下圖中是采用了AOP思想設(shè)計的程序,它把紅框部分的代碼抽取出來的同時,運用動態(tài)代理技術(shù),在運行期對需要使用的業(yè)務(wù)邏輯方法進行增強。

1.2 AOP 術(shù)語

連接點:方法開始時、結(jié)束時、正常運行完畢時、方法異常時等這些特殊的時機點,我們稱之為連接點,項目中每個方法都有連接點,連接點是一種候選點

切入點:指定AOP思想想要影響的具體方法是哪些,描述感興趣的方法

Advice增強:

第一個層次:指的是橫切邏輯

第二個層次︰方位點(在某一些連接點上加入橫切邏輯,那么這些連接點就叫做方位點,描述的是具體的特殊時機)

Aspect切面:切面概念是對上述概念的一個綜合

Aspect切面=切入點+增強=切入點(鎖定方法)+方位點(鎖定方法中的特殊時機)+橫切邏輯

眾多的概念,目的就是為了鎖定要在哪個地方插入什么橫切邏輯代碼

Spring中AOP的代理選擇

Spring 實現(xiàn)AOP思想使用的是動態(tài)代理技術(shù)

默認情況下,Spring會根據(jù)被代理對象是否實現(xiàn)接口來選擇使用JDK還是CGLIB。當被代理對象沒有實現(xiàn)任何接口時,Spring會選擇CGLIB。當被代理對象實現(xiàn)了接口,Spring會選擇JDK官方的代理技術(shù),不過我們可以通過配置的方式,讓Spring強制使用CGLIB。

Spring中AOP的配置方式

在Spring的AOP配置中,也和loC配置一樣,支持3類配置方式。

第一類:使用XML配置

第二類:使用XML+注解組合配置

第三類:使用純注解配置

Spring中AOP實現(xiàn)

需求∶橫切邏輯代碼是打印日志,希望把打印日志的邏輯織入到目標方法的特定位置(service層transfer方法)

XML模式

Spring是模塊化開發(fā)的框架,使用aop就引入aop的jar

  • 坐標
  • AOP核心配置
  • 細節(jié)
  • 關(guān)于切入點表達式

上述配置實現(xiàn)了對TransferServiceImpl 的updateAccountByCardNo方法進行增強,在其執(zhí)行之前,輸出了記錄日志的語句。這里面,我們接觸了一個比較陌生的名稱:切入點表達式,它是做什么的呢?我們往下看。

  • 概念及作用

切入點表達式,也稱之為AspectJ切入點表達式,指的是遵循特定語法結(jié)構(gòu)的字符串,其作用是用于對符合語法格式的連接點進行增強。它是AspectJ表達式的一部分。

  • 關(guān)于AspectJ

AspectJ是一個基于Java語言的AOP框架,Spring框架從2.0版本之后集成了AspectJ框架中切入點表達式的部分,開始支持AspectJ切入點表達式。

  • 切入點表達式使用示例
  • 改變代理方式的配置

在前面我們已經(jīng)說了,Spring在選擇創(chuàng)建代理對象時,會根據(jù)被代理對象的實際情況來選擇的。被代理對象實現(xiàn)了接口,則采用基于接口的動態(tài)代理。當被代理對象沒有實現(xiàn)任何接口的時候,Spring會自動切換到基于子類的動態(tài)代理方式。

但是我們都知道,無論被代理對象是否實現(xiàn)接口,只要不是final修飾的類都可以采用cglib提供的方式創(chuàng)建代理對象。所以Spring也考慮到了這個情況,提供了配置的方式實現(xiàn)強制使用基于子類的動態(tài)代理(即cglib的方式),配置的方式有兩種

  • 使用aop:config標簽配置
  • 使用aop:aspectj-autoproxy標簽配置
  • 五種通知類型
  • 前置通知

配置方式: aop:before標簽

執(zhí)行時機

前置通知永遠都會在切入點方法(業(yè)務(wù)核心方法)執(zhí)行之前執(zhí)行。

細節(jié)

前置通知可以獲取切入點方法的參數(shù),并對其進行增強。

  • 正常執(zhí)行時通知

配置方式

  • 異常通知

配置方式

執(zhí)行時機

異常通知的執(zhí)行時機是在切入點方法(業(yè)務(wù)核心方法)執(zhí)行產(chǎn)生異常之后,異常通知執(zhí)行。如果切入點方法執(zhí)行沒有產(chǎn)生異常,則異常通知不會執(zhí)行。

細節(jié)

異常通知不僅可以獲取切入點方法執(zhí)行的參數(shù),也可以獲取切入點方法執(zhí)行產(chǎn)生的異常信息。

  • 最終通知

配置方式

執(zhí)行時機

最終通知的執(zhí)行時機是在切入點方法(業(yè)務(wù)核心方法)執(zhí)行完成之后,切入點方法返回之前執(zhí)行。換句話說,無論切入點方法執(zhí)行是否產(chǎn)生異常,它都會在返回之前執(zhí)行。

細節(jié)

最終通知執(zhí)行時,可以獲取到通知方法的參數(shù)。同時它可以做一些清理操作。

  • 環(huán)繞通知

配置方式

XML+注解模式

  • XML中開啟Spring對注解AOP的支持
  • 示例

注解模式

在使用注解驅(qū)動開發(fā)aop時,我們要明確的就是,是注解替換掉配置文件中的下面這行配置:

在配置類中使用如下注解進行替換上述配置

Spring聲明式事務(wù)的支持

編程式事務(wù):在業(yè)務(wù)代碼中添加事務(wù)控制代碼,這樣的事務(wù)控制機制就叫做編程式事務(wù)聲明式事務(wù):通過xml或者注解配置的方式達到事務(wù)控制的目的,叫做聲明式事務(wù)

事務(wù)回顧

事務(wù)的概念

事務(wù)指邏輯上的一組操作,組成這組操作的各個單元,要么全部成功,要么全部不成功。從而確保了數(shù)據(jù)的準確與安全。

例如:A——B轉(zhuǎn)帳,對應(yīng)于如下兩條sql語句:

這兩條語句的執(zhí)行,要么全部成功,要么全部不成功。

事務(wù)的四大特性

原子性(Atomicity)原子性是指事務(wù)是一個不可分割的工作單位,事務(wù)中的操作要么都發(fā)生,要么都不發(fā)生。

從操作的角度來描述,事務(wù)中的各個操作要么都成功要么都失敗

一致性(Consistency)事務(wù)必須使數(shù)據(jù)庫從一個一致性狀態(tài)變換到另外一個一致性狀態(tài)。例如轉(zhuǎn)賬前A有1000,B有1000。轉(zhuǎn)賬后A+B也得是2000。

一致性是從數(shù)據(jù)的角度來說的,(1000,1000)(900,1100),不應(yīng)該出現(xiàn)(900,1000)

隔離性(lsolation)事務(wù)的隔離性是多個用戶并發(fā)訪問數(shù)據(jù)庫時,數(shù)據(jù)庫為每一個用戶開啟的事務(wù),每個事務(wù)不能被其他事務(wù)的操作數(shù)據(jù)所干擾,多個并發(fā)事務(wù)之間要相互隔離。

比如:事務(wù)1給員工漲工資2000,但是事務(wù)1尚未被提交,員工發(fā)起事務(wù)2查詢工資,發(fā)現(xiàn)工資漲了2000塊錢,讀到了事務(wù)1尚未提交的數(shù)據(jù)(臟讀)

持久性(Durability)

持久性是指一個事務(wù)一旦被提交,它對數(shù)據(jù)庫中數(shù)據(jù)的改變就是永久性的,接下來即使數(shù)據(jù)庫發(fā)生故障也不應(yīng)該對其有任何影響。

事務(wù)的隔離級別

不考慮隔離級別,會出現(xiàn)以下情況:(以下情況全是錯誤的),也即為隔離級別在解決事務(wù)并發(fā)問題

臟讀:一個線程中的事務(wù)讀到了另外一個線程中未提交的數(shù)據(jù)。

不可重復(fù)讀:一個線程中的事務(wù)讀到了另外一個線程中已經(jīng)提交的update的數(shù)據(jù)(前后內(nèi)容不一樣)

場景:

員工A發(fā)起事務(wù)1,查詢工資,工資為1w,此時事務(wù)1尚未關(guān)閉財務(wù)人員發(fā)起了事務(wù)2,給員工A張了2000塊錢,并且提交了事務(wù)

員工A通過事務(wù)1再次發(fā)起查詢請求,發(fā)現(xiàn)工資為1.2w,原來讀出來1w讀不到了,叫做不可重復(fù)讀虛讀〈幻讀)︰一個線程中的事務(wù)讀到了另外一個線程中已經(jīng)提交的insert或者delete的數(shù)據(jù)〈前后條數(shù)不一樣)

場景:

事務(wù)1查詢所有工資為1w的員工的總數(shù),查詢出來了10個人,此時事務(wù)尚未關(guān)閉

事務(wù)2財務(wù)人員發(fā)起,新來員工,工資1 w,向表中插入了2條數(shù)據(jù),并且提交了事務(wù)

事務(wù)1再次查詢工資為1w的員工個數(shù),發(fā)現(xiàn)有12個人,見了鬼了

數(shù)據(jù)庫共定義了四種隔離級別:

Serializable(串行化)︰可避免臟讀、不可重復(fù)讀、虛讀情況的發(fā)生。(串行化)最高

Repeatable read(可重復(fù)讀)︰可避免臟讀、不可重復(fù)讀情況的發(fā)生。(幻讀有可能發(fā)生)第二該機制下會對要update的行進行加鎖

Read committed(讀已提交)︰可避免臟讀情況發(fā)生。不可重復(fù)讀和幻讀一定會發(fā)生。第三

Read uncommitted(讀未提交)︰最低級別,以上情況均無法保證。(讀未提交)最低

注意:級別依次升高,效率依次降低

MySQL的默認隔離級別是:REPEATABLE READ

查詢當前使用的隔離級別:select @@tx_isolation;

設(shè)置MySQL事務(wù)的隔離級別: set session transaction isolation level xxx;(設(shè)置的是當前mysql連接會話的,并不是永久改變的)

事務(wù)的傳播行為

事務(wù)往往在service層進行控制,如果出現(xiàn)service層方法A調(diào)用了另外一個service層方法B,A和B方法本身都已經(jīng)被添加了事務(wù)控制,那么A調(diào)用B的時候,就需要進行事務(wù)的一些協(xié)商,這就叫做事務(wù)的傳播行為。

A調(diào)用B,我們站在B的角度來觀察來定義事務(wù)的傳播行為

Spring中事務(wù)的API

mybatis: sqlSession.commit();

hibernate: session.commit();

PlatformTransactionManager

作用

此接口是Spring的事務(wù)管理器核心接口。Spring本身并不支持事務(wù)實現(xiàn),只是負責提供標準,應(yīng)用底層支持什么樣的事務(wù),需要提供具體實現(xiàn)類。此處也是策略模式的具體應(yīng)用。在Spring框架中,也為我們內(nèi)置了一些具體策略,例如:DataSourceTransactionManager,HibernateTransactionManager等等。(和HibernateTransactionManager事務(wù)管理器在spring-orm-5.1.12.RELEASE.jar中)Spring JdbcTemplate(數(shù)據(jù)庫操作工具)、Mybatis (mybatis-spring.jar)—-——>

DataSourceTransactionManager

Hibernate框架——————> HibernateTransactionManager

DataSourceTransactionManager歸根結(jié)底是橫切邏輯代碼,聲明式事務(wù)要做的就是使用Aop(動態(tài)代理)來將事務(wù)控制邏輯織入到業(yè)務(wù)代碼

Spring聲明式事務(wù)配置

  • 純xml模式
  • 導(dǎo)入jar
  • xml配置
  • 基于XML+注解
  • xml配置
  • 在接口、類或者方法上添加@Transactional注解
  • 基于純注解

Spring基于注解驅(qū)動開發(fā)的事務(wù)控制配置,只需要把xml配置部分改為注解實現(xiàn)。只是需要一個注解替換掉xml配置文件中的

manager="transactionManager" />配置。

在Spring的配置類上添加@EnableTransactionManagement注解即可

今天的分享就先到這里,可以關(guān)注小編獲得第一手資料哦!

往期推薦閱讀:

Spring源碼高級筆記之——Spring概述

Spring源碼高級筆記之——Spring核心思想

Spring源碼高級筆記之——銀行案例手寫IOC和AOP

Spring源碼高級筆記之——Spring IOC 應(yīng)用

Spring源碼高級筆記——Spring IOC源碼深度剖析

總結(jié)

以上是生活随笔為你收集整理的batch spring 重复执行_Spring源码高级笔记之——Spring AOP应用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。