一、主要设计注解: @Aspect @After @before @Pointcut @Around
pom文件引入
<!--用于aop切面编程-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
</dependency>
二、AOP核心概念
1、横切关注点
对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点
2、切面(aspect)
类是对物体特征的抽象,切面就是对横切关注点的抽象
3、连接点(joinpoint)
被拦截到的点,因为Spring只支持方法类型的连接点,所以在Spring中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器
4、切入点(pointcut)
对连接点进行拦截的定义
5、通知(advice)
所谓通知指的就是指拦截到连接点之后要执行的代码,通知分为前置、后置、异常、最终、环绕通知五类
6、目标对象
代理的目标对象
7、织入(weave)
将切面应用到目标对象并导致代理对象创建的过程
8、引入(introduction)
在不修改代码的前提下,引入可以在运行期为类动态地添加一些方法或字段
execution后面参数的定义
eg.
第一个*表示匹配任意的方法返回值execution(* , ..(两个点)表示零个或多个参数,第一个..表示service包及其子包,第二个*表示所有类, 第三个*表示所有方法,第二个..表示方法的任意参数个数
注解实现:
1、引入注解
2、顶一个切面类LogAspect ,要对下面Controller下面所有类进行切面
具体代码:
@Aspect @Order(1)//指定切面的优先级 @Component @EnableAspectJAutoProxy //使aspect起作用 自动匹配代理对象 public class LogAspect { @Pointcut("execution(* com.example.springbootproject.Controller.*.*(..))")//定义在Controller包里所有类,所有的方法的任意方法的执行 public void apilog() { } @Before("apilog()") public void doBefore() { System.out.printf("Before方法执行"); } @After("apilog()") public void doAfter() { System.out.printf("after方法执行"); } @Around("apilog()") //这里必须有返回对象,否则切面接口 void就会出现无返回 public Object logArround(ProceedingJoinPoint joinPoint) throws Throwable { Object[] args = joinPoint.getArgs(); System.out.println("环绕前入参:"+JSON.toJSONString(args[0])); System.out.println(joinPoint.getSignature()); Object proceed = joinPoint.proceed(); System.out.println("出参:"+JSON.toJSONString(proceed)); System.out.println("环绕后"); return proceed; } }
执行结果: