package com.hxkr.util;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
/**
*
AOP的一些相关概念
切面(Aspect):是切入点和通知的结合;
连接点(Joinpoint):类里面可以被增强的方法,这些方法称为连接点;
增强处理(Advice):指拦截到Joinpoint之后所要做的事情就是通知.
通知分为前置通知(@Before),后置通知(@After),异常通知(@AfterThrowing),最终通知(@AfterReturning),环绕通知(切面要完成的功能)(@Around);
切入点(Pointcut):指我们要对哪些Joinpoint进行拦截的定义
*
*/
@Aspect
@Component
public class LogInterceptor {
/**
* 使用方法:springboot为例
* 第一步:引入AOP依赖
* <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
第二步:使用@Aspect和@Component注解将一个java类定义为切面类
第三步:使用@Pointcut定义一个切入点(定义在哪个方法里使用)
第四步:根据需要在切入点不同位置的切入内容
使用@Before在切入点开始处切入内容
使用@After在切入点结尾处切入内容
使用@AfterReturning在切入点return内容之后切入内容(可以用来对处理返回值做一些加工处理)
使用@Around在切入点前后切入内容,并自己控制何时执行切入点自身的内容
使用@AfterThrowing用来处理当切入内容部分抛出异常之后的处理逻辑
*
*/
/* 定义一个切入点 */
/**
* AspectJ语法
"execution(* cn.youyinian.controller.v1.*.*(..))"
指定在执行 cn.youyinian.controller.v1 包中任意类的任意方法之前执行方法增强;
第一个星号表示返回值不限;
第二个星号表示类名不限;
第三个星号表示方法名不限;
圆括号中的 .. 表示任意个数、类型不限的形参。
*/
@Pointcut("execution(* com.hxkr.service.*.*(..))")
private void log() {
}
/**
* 切入点之前的操作
*/
@Before("log()")
/**
* 在切入点前的操作,按order的值由小到大执行
* 在切入点后的操作,按order的值由大到小执行
*/
@Order(2)
private void before() {
System.out.println("[定时任务] >>>>>>>>>>>>>>>>>>> 开始");
}
@Before("log()")
@Order(1)
private void after() {
System.out.println("[定时任务] >>>>>>>>>>>>>>>>>>> 结束");
}
}