<1> 导入AOP依赖
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.9</version>
</dependency>
<2> 添加需要被增强的业务方法
@RestController
@RequestMapping("/demo")
public class Demo {
@PostMapping("/save")
public void save() {
System.out.println(System.currentTimeMillis());
System.out.println("我是业务方法 ...");
}
}
<3> 定义通知类,制作通知
@Component // 定义通知类受Spring容器管理
@Aspect // 定义当前类为切面类
public class MyAdvice {
@Before("pt()")
public void before() {
System.out.println("before方法在save()被调方法前执行了");
}
@After("pt()")
public void after() {
System.out.println("after方法在被调方法之后执行了");
}
/**
* 说明:切入点定义依托一个不具有实际意义的方法进行,
* 即无参数,无返回值,方法体无实际逻辑
* execution() 第一个参数:原需增强方法的返回值类型
* 第一个参数:被增强方法的路径,直到具体的方法名
*/
@Pointcut("execution(void com.example.sentinel_demo.controller.Demo.save())")
private void pt(){}
}
总结:
AOP的实现原方法并无感知,所有的操作都是在切面类中定义和实现的,这也正是spring官方所描述的,在不改变原有方法的前提下,实现业务的增强