今天写代码突然发现了一个问题,如果我定义了一个切面里面有@AfterReturning的切面,定义切点是被@Hh注解注释的方法那么被@Hh注释的方法如果有事务,那么切面会被当前事务包含在内吗? 直接上代码
// 定义切面
@Aspect
@Component
public class MyAspect {
@AfterReturning(pointcut =
"@annotation(com.example.aop.Hh)",
returning = "result")
public void show(JoinPoint joinPoint,
Object result){
// 打印切点方法的返回值
System.out.println(result);
MethodSignature signature =
(MethodSignature)joinPoint.getSignature();
Hh annotation = signature.getMethod().
getAnnotation(Hh.class);
String status = annotation.status();
// 打印自定义注解上面的传参
System.out.println(status);
}
}
// 定义pojo
@Data
@Table(name = "mytable")
public class User implements Serializable {
@Column(name = "name")
private String name;
@Column(name = "age")
private int age;
}
// 定义dao层
@Repository
public interface TestDao extends Mapper<User> {
int updateById(String id);
}
// 定义controller
@RequestMapping(value = "/testShow",
method = RequestMethod.GET)
@Transactional
@Hh(status = "666")
public String testShow(){
testDao.updateById("1");
return "切点方法return了";
}
下面查看日志的记录
- 22:20:39.850 的时候开启了事务
- 22:20:40.068 执行了update的sql
- 接着就是两段话的打印 1:切点方法return了 2: 666
- 22:20:40.112 最后就是commit事务了
结论
注解里面的前置或者后置方法是包含在事务里面的