目标对象中的本地调用将无法使用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");