1.添加如下依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2.直接创建一个Aspect 包,包里面存放如下代码
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 {
/**
* execution(com.cd.layui.*.*(..) ):代表在com.cd.layui包下的所有类的所有方法上(忽略 参数)上执行,execution只能作用在方法上
* within(com.cd.layui.service.impl.*):作用在类上面,代表作用在com.cd.layui.service.impl下的所有类的所有方法上
* joinPoint连接点,可以通过它获取到当前在哪个类,哪个方法,哪个
*/
@Before("execution(com.cd.layui.*.*(..) )")
public void before(JoinPoint joinPoint)){
sout("==============前置附加操作")
System.out.println("目标方法名称:"+joinPoint.getSignature().getName());
System.out.println("目标方法参数:"+joinPoint.getArgs());
System.out.println("目标对象:"+joinPoint.getTarget());
}
@After("execution(com.cd.layui.*.*(..) )")
public void before(){
sout("==============后置附加操作")
}
/**
* 环绕通知, 当目标方法执行时会先进入环绕通知,然后在环绕通知放行
* 之后进入目标方法,然后执行目标方法,目标方法执行完成之后回到环绕
* 通知
*/
@Around("within(com.cd.layui.service.impl.*ProductServiceImpl)")
public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
System.out.println("进入环绕通知业务处理··");
System.out.println("目标方法名称"+proceedingJoinPoint.getSignature().getName());
System.out.println("目标对象"+proceedingJoinPoint.getTarget());
Object proceed = proceedingJoinPoint.proceed();//放行执行业务方法
System.out.println("业务方法执行之后的业务处理··");
return proceed;
}
//前置通知方法 在目标方法执行之前执行操作
@Before("within(com.cd.layui.service.impl.*ProductServiceImpl)")
public void bofore(JoinPoint joinPoint){
System.out.println("目标方法名称:"+joinPoint.getSignature().getName());
System.out.println("目标方法参数:"+joinPoint.getArgs());
System.out.println("目标对象:"+joinPoint.getTarget());
System.out.println("前置通知业务处理");
}
// 后置方法 在目标方法执行之后的操作
@After("within(com.cd.layui.service.impl.*ProductServiceImpl)")
public void after(JoinPoint joinPoint){ // JoinPoint joinPoint
System.out.println("后置通知的业务");
System.out.println("目标方法名称"+joinPoint.getSignature().getName());
System.out.println("目标方法参数:"+joinPoint.getArgs());
System.out.println("目标对象"+joinPoint.getTarget());
}
}
假设我们平时在写业务逻辑的时候,需要按照先后顺序使用切面,这个时候,Spring为我们提供了@Order这个注解
但是在springboot中我们需要创建两个不同的切面类,在切面类上面添加@Order这个注解(springboot中加在方法上无效),@Order()里面的值越小,越先执行这个切面。
基于自定义注解的切点表达式(常用)
1.新建自定义注解
2.在切面类中编写注解形式切入表达式
这样之后代表以后再任何类的方法上面面只要看到了该注解就知道该方法要被切入