this 导致 aop 失效
情况说明
在springboot中,常存在this 导致 aop 失效的情况
//这个方法有注解 @DataScope
@Override
@DataScope(deptAlias = "d", userAlias = "u")
public List<SysUser> selectUserList(SysUser user) {
return userMapper.selectUserList(user);
}
//这个方法无注解 @DataScope,但调用有注解的方法 selectUserList 时,如果使用 this,会导致aop失效,无法增强这个方法
@Override
@Transactional(rollbackFor = Exception.class)
public String importUserPhotos(MultipartFile file, String userType, LoginUser loginUser) throws Exception {
SysUser sysUser = new SysUser();
sysUser.setUserType(userType);
//ISysUserService service = (ISysUserService) AopContext.currentProxy();
//List<SysUser> sysUsers = service.selectUserList(sysUser);
List<SysUser> sysUsers = this.selectUserList(sysUser);
}
解决方案:
//用这种方式获取代理对象
ISysUserService service = (ISysUserService) AopContext.currentProxy();
List<SysUser> sysUsers = service.selectUserList(sysUser);
//配置类种开启下面的设置(启动类中应该也行),表示通过aop框架暴露该代理对象,AopContext能够访问
@EnableAspectJAutoProxy(exposeProxy = true)
现直接做一个调试说明记录
当使用
ISysUserService service = (ISysUserService) AopContext.currentProxy()
如图所示
获取的是CGLIB代理对象,所以能走到增强的方法中
---------------分割线-----------------
如果直接使用this,如下图所示,就只是会调实现类自己,实现类中就没有增加的那些代码,所以注解失效:
如果有用多点赞,或者也可以提供其他方案哈