1、业务场景:为一个TaskService.commit方法定义一个后置切面通知(发送邮件、推送待办等),每次commit方法后执行切面方法,现在commit方法中递归调用commit(当前service对象获取的是Springboot容器中的代理对象TaskService currProxy = ApplicationContextHolder.getBean(TaskService.class)),此时切面方法执行次数与commit方法调用次数是一样的。
2、要求:在同一个事务中,多次commit方法执行,控制第一次commit方法执行切面方法逻辑,后续commit方法调用无需执行。
3、解决方案:commit方法另外再加一个后置切面commitJudge,通过使用ThreadLocal保存当前线程的一个boolean值,boolean值初始化为false,执行完切面方法后将值置为true;commit方法的两个后置切面执行顺序通过注解@Order控制,设置的值越小,优先级越高
4、伪代码
4.1 需要添加切面的commit方法
4.2 commit方法递归
4.3 commit方法的3个后置切面,切面执行顺序按照@Order设置的值执行,我的切面之后