1. 簡(jiǎn)介Spring AOP是Spring框架的一個(gè)重要組成部分,它允許開發(fā)者定義跨多個(gè)模塊的橫切關(guān)注點(diǎn),例如日志記錄、事務(wù)管理、安全等。控制流切入和引" />

日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁(yè) > 科技  > 軟件

漲知識(shí)!Spring AOP還能這么玩,看看你的項(xiàng)目能否用上

來(lái)源: 責(zé)編: 時(shí)間:2024-01-02 09:31:49 235觀看
導(dǎo)讀環(huán)境:Spring5.3.23本篇文章將介紹兩個(gè)主題:控制流切入點(diǎn)(動(dòng)態(tài)切入點(diǎn))引介通知
1. 簡(jiǎn)介Spring AOP是Spring框架的一個(gè)重要組成部分,它允許開發(fā)者定義跨多個(gè)模塊的橫切關(guān)注點(diǎn),例如日志記錄、事務(wù)管理、安全等。控制流切入和引

環(huán)境:Spring5.3.231bj28資訊網(wǎng)——每日最新資訊28at.com

本篇文章將介紹兩個(gè)主題:1bj28資訊網(wǎng)——每日最新資訊28at.com

  • 控制流切入點(diǎn)(動(dòng)態(tài)切入點(diǎn))
  • 引介通知

1. 簡(jiǎn)介

Spring AOP是Spring框架的一個(gè)重要組成部分,它允許開發(fā)者定義跨多個(gè)模塊的橫切關(guān)注點(diǎn),例如日志記錄、事務(wù)管理、安全等。控制流切入和引介通知是Spring AOP中的兩個(gè)關(guān)鍵特性,它們能夠增強(qiáng)程序的可維護(hù)性和可讀性。本文將深入探討這兩個(gè)特性的工作原理和使用方法。1bj28資訊網(wǎng)——每日最新資訊28at.com

控制流切入

控制流切入允許我們根據(jù)方法調(diào)用的控制流來(lái)定義切入點(diǎn)。控制流切入點(diǎn)與當(dāng)前調(diào)用堆棧匹配。例如,如果連接點(diǎn)被com.pack.service包中的方法或PersonService類調(diào)用,它可能會(huì)觸發(fā)。控制流切入點(diǎn)是通過(guò)使用org.springframework.aop.support.ControlFlowPointcut類指定的。1bj28資訊網(wǎng)——每日最新資訊28at.com

引介通知

引介通知能夠聲明被建議的對(duì)象實(shí)現(xiàn)給定的接口,并代表這些對(duì)象提供該接口的實(shí)現(xiàn)。簡(jiǎn)單說(shuō):你有個(gè)PersonService類,引介通知能夠讓你不修改代碼的情況下去實(shí)現(xiàn)你給定的任意接口(CommonDAO)。1bj28資訊網(wǎng)——每日最新資訊28at.com

2. 實(shí)戰(zhàn)案例

2.1 控制流切入點(diǎn)

準(zhǔn)備基礎(chǔ)類

@Componentpublic class PersonDAO {  public void save(String name) {    System.out.println("PersonDAO save method invoke...") ;  }}@Componentpublic class PersonService {  @Resource  private PersonDAO dao ;  public void save(String name) {    System.out.println("PersonService save method inovke...") ;    this.dao.save(name) ;  }}

定義切面類Advisor

低級(jí)切面Advisor,平時(shí)使用的@Aspect算是高級(jí)切面類,而這些高級(jí)切面類最終會(huì)被轉(zhuǎn)換為Advisor低級(jí)切面類。1bj28資訊網(wǎng)——每日最新資訊28at.com

@Componentpublic class PackControlFlowAdvisor extends DefaultPointcutAdvisor {  private static MethodInterceptor logInterceptor = invocation -> {    System.out.println("before log...") ;    Object ret = invocation.proceed() ;    System.out.println("after log...") ;    return ret ;  } ;  // 要進(jìn)行匹配的類  private static Class<?> clazz = PersonService.class ;  // 要進(jìn)行匹配的方法(可以為null,這樣指定類中的所有方法都會(huì)被匹配攔截)  private static String methodName = "save" ;  private static ControlFlowPointcut pointcut = new ControlFlowPointcut(clazz, methodName) ;  public PackControlFlowAdvisor() {    super(pointcut, logInterceptor) ;  }}

測(cè)試1bj28資訊網(wǎng)——每日最新資訊28at.com

PersonService ps = context.getBean(PersonService.class) ;ps.save("王五") ;

控制臺(tái)輸出1bj28資訊網(wǎng)——每日最新資訊28at.com

PersonService save method inovke...before log...PersonDAO save method invoke...after log...

PersonDAO中的save方法被攔截了。什么意思?怎么PersonDAO就被攔截了,先來(lái)看上面切點(diǎn)的定義ControlFlowPointcut1bj28資訊網(wǎng)——每日最新資訊28at.com

public class ControlFlowPointcut implements Pointcut, ClassFilter, MethodMatcher {  public boolean matches(Class<?> clazz) {    return true;  }  public boolean matches(Method method, Class<?> targetClass) {    return true;  }  public boolean isRuntime() {    return true;  }  public boolean matches(Method method, Class<?> targetClass, Object... args) {    // 取得當(dāng)前線程的整個(gè)執(zhí)行棧(方法的調(diào)用)    for (StackTraceElement element : new Throwable().getStackTrace()) {      if (element.getClassName().equals(this.clazz.getName()) &&          (this.methodName == null || element.getMethodName().equals(this.methodName))) {        return true;      }    }    return false;  }}

通過(guò)在這個(gè)切點(diǎn)類能知道:1bj28資訊網(wǎng)——每日最新資訊28at.com

  1. 當(dāng)前容器中的所有類都會(huì)被代理;因?yàn)檫@里的類匹配直接返回true,2個(gè)參數(shù)的matches直接返回true,最后isRuntime返回true,最終執(zhí)行3個(gè)參數(shù)的matches方法。
  2. 每個(gè)類中方法的調(diào)用都會(huì)獲取當(dāng)前執(zhí)行的棧,都會(huì)進(jìn)行判斷類及方法是否被匹配。

結(jié)合上面的測(cè)試輸出結(jié)果,PersonDAO#save方法被攔截了,因?yàn)樗掀ヅ錀l件,在PersonService#save方法中調(diào)用了PersonDAO#save方法,那PersonDAO#save方法執(zhí)行棧中就包含了PersonService#save正好匹配了我們定義的切點(diǎn)。1bj28資訊網(wǎng)——每日最新資訊28at.com

簡(jiǎn)單說(shuō):某個(gè)類中的某個(gè)方法調(diào)用時(shí)會(huì)判斷當(dāng)前整個(gè)執(zhí)行棧中是否有設(shè)定好的類及方法,如果有則攔截當(dāng)前的方法(執(zhí)行通知)。
1bj28資訊網(wǎng)——每日最新資訊28at.com

注意:控制流切入點(diǎn)比正常切入點(diǎn)慢10-15倍,但在某些情況下它們是有用的。所以大家還是慎重使用吧,畢竟所有的類都被代理了(當(dāng)然這里我們可以自定義matches來(lái)控制)。1bj28資訊網(wǎng)——每日最新資訊28at.com

2.2 引介通知

引介通知相對(duì)比較簡(jiǎn)單直接可以在@Aspect切面類中定義1bj28資訊網(wǎng)——每日最新資訊28at.com

注備基礎(chǔ)類

// 這個(gè)接口是我們準(zhǔn)備讓其它類實(shí)現(xiàn)的public interface CommonManager {  void calc(int a, int b) ;}// 默認(rèn)實(shí)現(xiàn)public class DefaultCommonManager implements CommonManager {  @Override  public void calc(int a, int b) {    System.out.printf("計(jì)算a + b = %d%n", (a + b)) ;  }}// 該類是我們將要通過(guò)引介增強(qiáng)讓其實(shí)現(xiàn)CommonManager類@Component("us")public class UserService {  public void save() {    System.out.println("UserService save...") ;  }}

切面類1bj28資訊網(wǎng)——每日最新資訊28at.com

@Aspectpublic static class CommonAspect {  /**   * 這樣聲明后,匹配的類就會(huì)自動(dòng)的實(shí)現(xiàn)這里指定的CommonManager接口,默認(rèn)的實(shí)現(xiàn)類是使用DefaultCommonManager   * value:該值決定了哪些類會(huì)被增強(qiáng)(實(shí)現(xiàn)指定的CommonManager接口)   */  @DeclareParents(value = "com.pack.main.aop_introductionadviser.IntructionDeclareMain2.*+", defaultImpl = DefaultCommonManager.class)  public static CommonManager mixin;}

注意:在這個(gè)切面類中我們并沒(méi)有定義@Before,@Around等同志。1bj28資訊網(wǎng)——每日最新資訊28at.com

測(cè)試
1bj28資訊網(wǎng)——每日最新資訊28at.com

CommonManager c = (CommonManager) context.getBean("us") ;c.calc(10, 20) ;

控制臺(tái)輸出1bj28資訊網(wǎng)——每日最新資訊28at.com

計(jì)算a + b = 30

UserService能正確的轉(zhuǎn)換為CommonManager類,這說(shuō)明UserService生成的代理類實(shí)現(xiàn)了CommonManager接口類,同時(shí)在執(zhí)行方法調(diào)用的時(shí)候使用的是我們制定的默認(rèn)實(shí)現(xiàn)類DefaultCommonManager。1bj28資訊網(wǎng)——每日最新資訊28at.com

總結(jié):控制流切入點(diǎn)(ControlFlowPointcut)和引介通知(@DeclareParents)是Spring AOP的兩個(gè)重要概念。控制流切入點(diǎn)用于在特定的控制流條件下切入代碼,而引介通知?jiǎng)t讓目標(biāo)類具有更加強(qiáng)大的能力。1bj28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-55297-0.html漲知識(shí)!Spring AOP還能這么玩,看看你的項(xiàng)目能否用上

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 代碼分析利器,你值得擁有

下一篇: 漲知識(shí)!Spring AOP還能這么玩,看看你的項(xiàng)目能否用上

標(biāo)簽:
  • 熱門焦點(diǎn)
  • 7月安卓手機(jī)性能榜:紅魔8S Pro再奪榜首

    7月份的手機(jī)市場(chǎng)風(fēng)平浪靜,除了紅魔和努比亞帶來(lái)了兩款搭載驍龍8Gen2領(lǐng)先版處理器的新機(jī)之外,別的也想不到有什么新品了,這也正常,通常6月7月都是手機(jī)廠商修整的時(shí)間,進(jìn)入8月份之
  • 5月iOS設(shè)備好評(píng)榜:iPhone 14僅排第43?

    來(lái)到新的一月,安兔兔的各個(gè)榜單又重新匯總了數(shù)據(jù),像安卓陣營(yíng)的榜單都有著比較大的變動(dòng),不過(guò)iOS由于設(shè)備的更新?lián)Q代并沒(méi)有那么快,所以相對(duì)來(lái)說(shuō)變化并不大,特別是iOS好評(píng)榜,老款設(shè)
  • 不容錯(cuò)過(guò)的MSBuild技巧,必備用法詳解和實(shí)踐指南

    一、MSBuild簡(jiǎn)介MSBuild是一種基于XML的構(gòu)建引擎,用于在.NET Framework和.NET Core應(yīng)用程序中自動(dòng)化構(gòu)建過(guò)程。它是Visual Studio的構(gòu)建引擎,可在命令行或其他構(gòu)建工具中使用
  • 企業(yè)采用CRM系統(tǒng)的11個(gè)好處

    客戶關(guān)系管理(CRM)軟件可以為企業(yè)提供很多的好處,從客戶保留到提高生產(chǎn)力。  CRM軟件用于企業(yè)收集客戶互動(dòng),以改善客戶體驗(yàn)和滿意度。  CRM軟件市場(chǎng)規(guī)模如今超過(guò)580
  • 量化指標(biāo)是與非:挽救被量化指標(biāo)扼殺的技術(shù)團(tuán)隊(duì)

    作者 | 劉新翠整理 | 徐杰承本文整理自快狗打車技術(shù)總監(jiān)劉新翠在WOT2023大會(huì)上的主題分享,更多精彩內(nèi)容及現(xiàn)場(chǎng)PPT,請(qǐng)關(guān)注51CTO技術(shù)棧公眾號(hào),發(fā)消息【W(wǎng)OT2023PPT】即可直接領(lǐng)取
  • 虛擬鍵盤 API 的妙用

    你是否在遇到過(guò)這樣的問(wèn)題:移動(dòng)設(shè)備上有一個(gè)固定元素,當(dāng)激活虛擬鍵盤時(shí),該元素被隱藏在了鍵盤下方?多年來(lái),這一直是 Web 上的默認(rèn)行為,在本文中,我們將探討這個(gè)問(wèn)題、為什么會(huì)發(fā)生
  • 微軟邀請(qǐng) Microsoft 365 商業(yè)用戶,測(cè)試視頻編輯器 Clipchamp

    8 月 1 日消息,微軟近日宣布即將面向 Microsoft 365 商業(yè)用戶,開放 Clipchamp 應(yīng)用,邀請(qǐng)用戶通過(guò)該應(yīng)用來(lái)編輯視頻。微軟于 2021 年收購(gòu) Clipchamp,隨后開始逐步整合到 Microsof
  • 重估百度丨“晚熟”的百度云,能等到春天嗎?

    &copy;自象限原創(chuàng)作者|程心排版|王喻可2016年7月13日,百度云計(jì)算戰(zhàn)略發(fā)布會(huì)在北京舉行,宣告著百度智能云的正式啟程。彼時(shí)的會(huì)場(chǎng)座無(wú)虛席,甚至排隊(duì)排到了門外,在場(chǎng)的所有人幾乎都
  • AI藝術(shù)欣賞體驗(yàn)會(huì)在上海梅賽德斯奔馳中心音樂(lè)俱樂(lè)部上演

    光影交錯(cuò)的鏡像世界,虛實(shí)幻化的視覺(jué)奇觀,虛擬偶像與真人共同主持,這些場(chǎng)景都出現(xiàn)在2019世界人工智能大會(huì)的舞臺(tái)上。8月29日至31日,“AI藝術(shù)欣賞體驗(yàn)會(huì)”在上海
Top 主站蜘蛛池模板: 七台河市| 工布江达县| 汤原县| 重庆市| 周口市| 盐边县| 茌平县| 壤塘县| 忻州市| 太仓市| 张北县| 南岸区| 民勤县| 滨海县| 兴宁市| 西乌珠穆沁旗| 客服| 朝阳市| 莱芜市| 潼南县| 凌云县| 英德市| 神木县| 洛南县| 丁青县| 眉山市| 贵阳市| 灌云县| 东平县| 历史| 米易县| 东乡县| 凉城县| 普安县| 襄城县| 永靖县| 余江县| 天峻县| 农安县| 山东省| 宣威市|