成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

當心!SpringBoot在這幾種情況下將導致代理失效

開發 前端
Pointcut定義了哪些方法會被增強,而切點通常通過表達式來定義,這些表達式可以基于方法名、參數類型、注解等多種條件。

環境:SpringBoot2.7.18

1. 簡介

Spring AOP(面向切面編程)是Spring框架的核心特性之一,它以一種非侵入式的方式增強了應用程序的模塊性和可維護性。通過AOP,開發者能夠將橫切關注點(如日志記錄、事務管理、安全控制等)從業務邏輯中分離出來,形成獨立的切面,從而實現了關注點的模塊化。這種分離不僅簡化了代碼結構,還提高了代碼的重用性和靈活性。Spring AOP利用代理機制在運行時動態地將切面織入到目標對象中,無需修改原有代碼,極大降低了系統間的耦合度。

實現代理的核心元素

  • 切入點

Pointcut定義了哪些方法會被增強,而切點通常通過表達式來定義,這些表達式可以基于方法名、參數類型、注解等多種條件。

  • 通知類

通知則是你需要增強的邏輯,這其中包括了前置通知(Before Advice)、后置通知(After Advice)、環繞通知(Around Advice)、異常通知(Throws Advice)和引介通知(Introduction Advice)。

  • 處理器

有了上面2個關鍵元素后,那如何才能創建代理呢?這時候的BeanPostProcessor就是最為關鍵的類了,它會根據切入點來判斷你當前的bean是否符合條件,對于符合條件的則進行代理的創建最終返回給Spring容器。Spring容器中保存的是代理對象。而在Spring中我們最常見的幾種注冊處理器的方式是:通過下面3個注解

@Configuration
// 開啟事務(針對的事務注解@Transactional)
@EnableTransactionManagement
// 開啟AOP代理(只要具備上面的1,2條件即可)
@EnableAspectJAutoProxy
// 開啟異步支持(針對的是@Async注解)
@EnableAsync
public class AppConfig {}

具備了上面3個核心元素后,是否就一定能為bean對象創建代理呢?這將是接下來要介紹的內容。

2. 不創建代理情況

2.1 環境準備

先準備基礎環境進行接下來的測試使用

@Service
public class Service {
  public void save() {
    System.out.println("Service save...") ;
  }
}

將圍繞該Service創建代理

@Component
@Aspect
public class LogAspect {
  @Pointcut("execution(* com.pack..*.*(..))")
  private void log() {
  }
  @Before("log()")
  public void recordLog() {
    System.out.println("before log...") ;
  }
}

該切面定義了一個前置通知,切入點匹配com.pack包及其子包下的所有方法。

2.2 正常創建代理

到此,以上定義沒有任何特殊的程序能正常的創建代理,如下示例:

ConfigurableApplicationContext context = SpringApplication.run(App.class, args) ;
Service service = context.getBean(Service.class);
System.out.println(service.getClass()) ;
service.save();

輸出結果

class com.pack.Service$$SpringCGLIB$$0
before log...
Service save ...

正常通過cglib創建代理對象。

2.3 不創建代理

  • Service實現Advice接口
public class Service implements Advice {}

再次運行后,輸出結果

class com.pack.Service
Service save...

沒有創建代理,沒有執行通知方法。

  • Service實現Pointcut接口
public class Service implements Pointcut {


  // 該接口需要實現下面2個方法
  // 這里無所謂,默認實現即可
  public ClassFilter getClassFilter() {
    return null;
  }
  public MethodMatcher getMethodMatcher() {
    return null;
  }
}

輸出結果:

class com.pack.Service
Service save...

同樣,沒有創建代理:

  • Service實現AopInfrastructureBean接口
public class Service implements AopInfrastructureBean {}

該接口沒有任何方法標記接口基礎設施類,輸出結果

class com.pack.Service
Service save...

沒有創建代理

  • Service實現Advisor接口

Spring創建代理對象,底層實現即使你通過注解@Aspect方式聲明的切面都會將其轉換為Advisor這種低級切面。

Advisor接口只有一個抽象方法。

public class Service implements Advisor {
  // 空實現即可
  public Advice getAdvice() {
    return null ;
  }
}

輸出結果與上面一樣,同樣不會創建代理。

  • 特殊的beanName

給Service一個特殊的beanName。

@Component("com.pack.Service.ORIGINAL")
public class Service {}

這個beanName以當前的完整包名+類名+.ORIGINAL命名,輸出結果:

class com.pack.Service
Service save...

沒有創建代理,修改beanName:

@Component("xxxooo.ORIGINAL")

當修改成上面的名稱后,再次運行:

class com.pack.Service$$SpringCGLIB$$0
before log...
Service save ...

被代理了,這說明beanName只有是"完整包名+類名+.ORIGINAL"才不會創建代理對象。

  • 特殊的Advisor

該情況非常特殊也比較復雜,直接上代碼:

@Component
public class LogAdvisor extends AspectJPointcutAdvisor {


  public LogAdvisor(AbstractAspectJAdvice advice) {
    super(advice);
  }
  @Override
  public String getAspectName() {
    return "service" ;
  }
}

只要上面getAspectName方法返回值與對應Service的beanName一致也將不會創建代理。

責任編輯:武曉燕 來源: Spring全家桶實戰案例源碼
相關推薦

2021-04-15 08:01:27

Spring聲明式事務

2024-11-29 11:01:25

2020-12-08 09:45:07

MySQL數據庫索引

2022-09-14 19:50:22

事務場景流程

2022-06-27 07:23:44

MySQL常量優化

2017-12-05 13:25:40

PHP開發服務器內存

2023-11-23 23:52:06

options請求瀏覽器

2020-04-02 11:16:28

Linux進程高并發

2023-08-10 17:23:39

2019-07-26 11:51:20

云計算IT系統

2023-03-27 13:00:13

Javascript前端

2013-09-12 10:41:39

VDI部署

2009-12-09 10:41:26

配置靜態路由

2010-07-30 15:32:23

2015-06-01 06:39:18

JavaJava比C++

2020-11-18 09:26:52

@property裝飾器代碼

2022-07-02 00:05:21

漏洞Debriked依賴樹

2010-04-25 17:34:30

負載均衡實現

2010-10-22 17:26:55

SQL Server刪

2022-09-05 10:01:19

VueReact
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人av一区 | 欧美日韩在线一区二区三区 | 久久国产区 | 一级毛片视频 | 一区二区三区四区国产 | 国产伊人久久久 | 91亚洲国产成人精品一区二三 | 亚洲在线一区 | 免费1区2区3区 | 99精品一区二区三区 | 91麻豆产精品久久久久久 | 亚洲视频三区 | 国产大毛片 | 日韩精品一区二区三区中文在线 | 综合久久99 | 天天影视色综合 | 日韩国产中文字幕 | 亚洲成人三区 | 国产精品视频一 | 99re在线视频观看 | 亚洲天堂成人在线视频 | 亚洲欧美日韩国产综合 | 国产欧美日韩一区 | 亚洲精品3 | 亚洲成av片人久久久 | 午夜视频在线免费观看 | 国产高清精品一区二区三区 | 精品麻豆剧传媒av国产九九九 | 91亚洲国产 | 国产精品一区网站 | 精品九九久久 | www天天操| 亚洲 一区 | 99re国产精品 | 久久久久久久久一区 | 国产视频精品视频 | 亚洲视频在线一区 | 亚洲国产成人精品女人久久久 | 国产一级毛片视频 | 久久久久久久91 | 婷婷综合五月天 |