概述
SpringBoot是对原有项目中Spring框架和SpringMVC框架的进一步封装,因此在SpringBoot中同样支持Spring框架的AOP切面编程,不过在SpringBoot中为了快速开发,仅需要注解就可以开发切面编程。
使用
- 引入依赖
1 2 3 4 5
| <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
|
- 自定义通知
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| package com.buubiu.aspects;
import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.context.annotation.Configuration; import org.springframework.core.annotation.Order;
@Aspect @Configuration @Order(1) public class MyAspect {
@Before("within(com.buubiu.service.*ServiceImpl)") public void before(JoinPoint joinPoint) { System.out.println("前置通知业务处理~~"); System.out.println("目标方法名称:" + joinPoint.getSignature().getName()); System.out.println("目标方法参数:" + joinPoint.getArgs()); System.out.println("目标方法对象:" + joinPoint.getTarget()); }
@After("within(com.buubiu.service.*ServiceImpl)") public void after(JoinPoint joinPoint) { System.out.println("后置通知业务处理~~"); System.out.println("目标方法名称:" + joinPoint.getSignature().getName()); System.out.println("目标方法对象:" + joinPoint.getTarget()); }
@Around("execution(* com.buubiu.service.*ServiceImpl.*(..))") public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { System.out.println("进入环绕通知~~"); Object proceed = proceedingJoinPoint.proceed(); System.out.println("目标方法名称:" + proceedingJoinPoint.getSignature().getName()); System.out.println("目标方法参数:" + proceedingJoinPoint.getArgs()); System.out.println("目标方法对象:" + proceedingJoinPoint.getTarget()); return proceed; }
}
|
- 相关注解解释
@Aspect:
用来类上,代表这个类是一个切面
@Before:
用在方法上代表这个方法是一个前置通知方法
@After:
用在方法上代表这个方法是一个后置通知方法
@Around:
用在方法上代表这个方法是一个环绕的方法
@Order(1):
切面的执行顺序,数字越小,优先级越高