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

Spring Aop 常見注解和執行順序

開發 后端
Spring 一開始最強大的就是 IOC / AOP 兩大核心功能,我們今天一起來學習一下 Spring AOP 常見注解和執行順序。

Spring 一開始最強大的就是 IOC / AOP 兩大核心功能,我們今天一起來學習一下 Spring AOP 常見注解和執行順序。Spring Aop 的常用注解

首先我們一起來回顧一下 Spring Aop 中常用的幾個注解:

  • @Before 前置通知:目標方法之前執行
  • @After 后置通知:目標方法之后執行(始終執行)
  • @AfterReturning 返回之后通知:執行方法結束之前執行(異常不執行)
  • @AfterThrowing 異常通知:出香異常后執行
  •  @Around 環繞通知:環繞目標方法執行

常見問題

1、你肯定知道 Spring  , 那說說 Aop 的去全部通知順序, Spring Boot 或者 Spring Boot 2 對 aop 的執行順序影響?

2、說說你在 AOP 中遇到的那些坑?

示例代碼

下面我們先快速構建一個 spring aop 的 demo 程序來一起討論 spring aop 中的一些細節。

配置文件

為了方便我直接使用 spring-boot 進行快速的項目搭建,大家可以使用 idea 的spring-boot 項目快速創建功能,或者去 start.spring.io 上面去快速創建spring-boot 應用。

因為本人經常手動去網上貼一些依賴導致,依賴沖突服務啟動失敗等一些問題。

plugins {
id 'org.springframework.boot' version '2.6.3'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
}
group 'io.zhengsh'
version '1.0-SNAPSHOT'
repositories {
mavenCentral()
maven { url 'https://repo.spring.io/milestone' }
maven { url 'https://repo.spring.io/snapshot' }
}
dependencies {
# 其實這里也可以不增加 web 配置,為了試驗簡單,大家請忽略
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.boot:spring-boot-starter-aop'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
tasks.named('test') {
useJUnitPlatform()
}

接口類

首先我們需要定義一個接口。我們這里可以再來回顧一下 JDK 的默認代理實現的選擇:

  • 如果目標對象實現了接口,則默認采用JDK動態代理
  • 如果目標對象沒有實現接口,則采用進行動態代理
  • 如果目標對象實現了接口,且強制Cglib,則使用cglib代理

這塊的邏輯在 DefaultAopProxyFactory 大家有興趣可以去看看。

public interface CalcService {
public int div(int x, int y);
}

實現類

這里我門就簡單一點做一個除法操作,可以模擬正常也可以很容易的模擬錯誤。

@Service
public class CalcServiceImpl implements CalcService {
@Override
public int div(int x, int y) {
int result = x / y;
System.out.println("====> CalcServiceImpl 被調用了,我們的計算結果是:" + result);
return result;
}
}

aop 攔截器

申明一個攔截器我們要為當前對象增加 @Aspect 和 @Component ,筆者之前也是才踩過這樣的坑,只加了一個。

其實這塊我剛開始也不是很理解,但是我看了 Aspect 注解的定義我就清楚了

這里面根本就沒有 Bean 的定義。所以我們還是乖乖的加上兩個注解。

還有就是如果當測試的時候需要開啟Aop 的支持為配置類上增加@EnableAspectJAutoProxy 注解。

其實 Aop 使用就三個步驟:

  • 定義 Aspect 定義切面
  • 定義 Pointcut 就是定義我們切入點
  • 定義具體的通知,比如: @After, @Before 等。
@Aspect
@Component
public class MyAspect {
@Pointcut("execution(* io.zhengsh.spring.service.impl..*.*(..))")
public void divPointCut() {
}
@Before("divPointCut()")
public void beforeNotify() {
System.out.println("----===>> @Before 我是前置通知");
}
@After("divPointCut")
public void afterNotify() {
System.out.println("----===>> @After 我是后置通知");
}
@AfterReturning("divPointCut")
public void afterReturningNotify() {
System.out.println("----===>> @AfterReturning 我是前置通知");
}
@AfterThrowing("divPointCut")
public void afterThrowingNotify() {
System.out.println("----===>> @AfterThrowing 我是異常通知");
}
@Around("divPointCut")
public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
Object retVal;
System.out.println("----===>> @Around 環繞通知之前 AAA");
retVal = proceedingJoinPoint.proceed();
System.out.println("----===>> @Around 環繞通知之后 BBB");
return retVal;
}
}

測試類

其實我這個測試類,雖然用了 @Test 注解,但是我這個類更加像一個 main 方法把:如下所示:

執行結論

結果記錄:spring 4.x, spring-boot 1.5.9

無法現在依賴,所以無法試驗

我直接說一下結論:Spring 4 中環繞通知是在最里面執行的

結果記錄:spring 版本5.3.15 springboot 版本2.6.3

多切面的情況

多個切面的情況下,可以通過@Order指定先后順序,數字越小,優先級越高。如下圖所示:

代理失效場景

下面一種場景會導致 aop 代理失效,因為我們在執行 a 方法的時候其實本質是執行 AServer#a 的方法攔截器(MethodInterceptor)鏈, 當我們在 a 方法內直接執行b(), 其實本質就相當于 this.b() , 這個時候由執行 a方法是調用到 a 的原始對象相當于是 this 調用,那么會導致 b() 方法的代理失效。這個問題也是我們開發者在開發過程中最常遇到的一個問題。

@Service
public class AService {
public void a() {
System.out.println("...... a");
b();
}
public void b() {
System.out.println("...... b");
}
}


責任編輯:龐桂玉 來源: Java知音
相關推薦

2020-10-16 09:40:18

順序Spring AOPHTTP

2009-06-19 13:28:30

Spring AOPSpring 2.0

2024-06-11 00:04:00

對象AdvisorAdvice

2022-06-07 07:58:45

SpringSpring AOP

2021-06-26 14:59:13

SpringTransaction執行

2021-05-06 18:17:52

SpringAOP理解

2009-06-22 10:41:34

Spring.AOP

2022-02-17 13:39:09

AOP接口方式

2024-06-14 09:30:58

2022-06-08 08:04:28

Springservicerepository

2009-06-19 11:09:27

Spring AOP

2009-09-29 10:00:40

Spring AOP框

2009-07-03 16:33:13

Tapestry函數執

2022-01-21 08:50:15

Promise任務隊列前端

2025-02-11 09:39:00

2023-03-29 08:24:30

2024-12-24 14:01:10

2021-10-31 19:39:11

注解Spring 核心類

2012-05-16 13:45:24

Java構造器

2021-03-01 23:26:41

日志Spring BootAOP
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲精品自在在线观看 | 人碰人操 | 国产精品揄拍一区二区 | 在线日韩视频 | 亚洲精品国产成人 | 国产在线区| 日韩伦理一区二区 | 91视频导航 | 国产免费一区二区 | 国产精品毛片一区二区在线看 | 国产一级免费视频 | 亚洲一区二区中文字幕在线观看 | 91原创视频 | 夜夜夜久久 | 欧美一区二区三区久久精品视 | 亚洲一区二区在线 | 欧洲妇女成人淫片aaa视频 | 91最新在线视频 | 久久久久久亚洲精品不卡 | k8久久久一区二区三区 | 国产日韩精品一区二区三区 | 欧美色综合 | 国产一区91精品张津瑜 | 欧美a v在线 | 国产 欧美 日韩 一区 | 国产精品久久久久国产a级 欧美日本韩国一区二区 | 国产精品久久久久久久久久久免费看 | 亚洲精品国产电影 | 亚洲视频1区 | 日韩国产在线 | 精品久久影院 | 日韩中文字幕在线观看视频 | 欧美精品一区二区在线观看 | 日韩靠逼 | 亚洲午夜精品久久久久久app | 精品国产一区二区 | 午夜激情免费 | 国产午夜精品一区二区三区四区 | 国产一级淫片免费视频 | 国产欧美精品在线观看 | 免费v片 |