SpringAOP 私有方法 private 导致注入失败导致Service 空指针 null 的问题
https://blog.csdn.net/jy00733505/article/details/107524688
在工程中
/**
* 判断此角色是否已经分配给用户
* @param id
* @return
*/
@GetMapping("/existsUserByRoleId")
@ResponseBody
private R existsUserByRoleId(String id) {
try {
Map<String, Object> map = new HashMap<>();
boolean exists = roleService.existsUserByRoleId(id);
map.put("exists",exists);
return R.ok(map);
} catch (Exception e) {
e.printStackTrace();
return R.error(e.getMessage());
}
}
测试用例roleService是有实例的,而在
/**
* 判断此机构下是否已经分配了用户或角色
* @param id
* @return
*/
@GetMapping("/existsUserOrRoleByOrgId")
@ResponseBody
private R existsUserOrRoleByOrgId(String id) {
try {
boolean exists = managementService.existsUserOrRoleByOrgId(id);
Map<String, Object> map = new HashMap<>();
map.put("exists",exists);
return R.ok(map);
} catch (Exception e) {
e.printStackTrace();
return R.error(e.getMessage());
}
}
之中,managementService则成为了null,没有加载。
通过分析后发现,roleService为直接的普通类,并不需要实现,所以方法声明为private是可以的,而在managementService中,managementService是接口,其实现类为ManagementServiceImpl,在接口声明中使用private会导致:
因为 springboot 的缓存机制是通过切面编程 aop来实现的,对于SpringAOP的cglib是不会拦截private方法的(而JDK动态代理是基于接口的更不可能对private方法生效),因此不进切面逻辑,aop是拦截不到的。
由此导致managementService注入失败为null,当把接口声明改为public问题便解决了。
public R existsUserOrRoleByOrgId(String id) {
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端