目标对象中的本地调用将无法使用AOP的拦截,如下的例子:
public interface UserService {
List<User> queryAllUsers();
void updateUserByName(String username);
}
@Service
public class UserServiceTr implements UserService {
@Override
@Transactional(propagation = Propagation.REQUIRED)
public List<User> queryAllUsers() {
updateUserByName("xxx");
return null;
}
@Override
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void updateUserByName(String username) {
}
}
此处this指向目标对象,因此调用updateUserByName()方法不会执行updateUserByName的事物切面,即不会执行事务增强,因此updateUserByName的事务@Transactional(propagation = Propagation.REQUIRES_NEW)不会执行。
解决方法:1.开启CGLIB代理。(springboot默认开启)
2.使用代理类去调用即可。
((UserService)AopContext.currentProxy()).updateUserByName("xxx");
本文探讨了Spring AOP中目标对象本地调用不触发事务增强的问题,并提供了两种解决方案:开启CGLIB代理或使用代理类调用。
216

被折叠的 条评论
为什么被折叠?



