AOP(Aspect Oriented Programming),面向切面编程,他是一种编程范式。
作用: 在不改变原始设计的的基础上对其进行功能增强。
几个基本概念:
连接点:所有的方法
切入点:追加功能的方法
通知:追加的功能
切面:通知和切入点之间的绑定关系
入门demo:
AOPFunc.java:
@Component
@Aspect
public class AOPFunc {
@Pointcut("execution (* com.example.demo.Controller.AOPController.sayHello())")
public void pt(){}
@After("pt()")
public void method() {
System.out.println(System.currentTimeMillis());
}
}
AOPController.java
@RestController
public class AOPController {
@RequestMapping("/hello")
public String sayHello() {
System.out.println("hello");
return "hello";
}
}
访问localhost:运行的端口/hello,结果如下图所示,可以看到AOP已生效:
Spring事务失效的场景?
情况一:异常捕获处理
原因是,事务通知只有捕捉到了目标抛出的异常,才能进行后续的回滚处理,如果目标自己处理掉异常,那么事务通知就无法知悉。(自己处理了异常没给抛出去)
解决方法:在catch块中添加throw new RuntimeException(e)抛出异常 (手动抛出)
情况二:抛出检查异常
原因:Spring默认只会回滚检查异常(RuntimeExcaption)
解决方法:配置rollbackFor 配置
情况三:非public方法导致的事务失效
原因:Spring为方法创建代理,添加事务通知,前提条件都是该方法必须是public的。
解决方案:把方法改成public方法即可。