博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring的Bean内部方法调用无法使用AOP切面(CacheAble注解失效)
阅读量:4599 次
发布时间:2019-06-09

本文共 2298 字,大约阅读时间需要 7 分钟。

今天在使用Spring cache的Cacheable注解的过程中遇见了一个Cacheable注解失效的问题,检查问题发生的原因是因为Spring的Cacheable注解是基于Spring AOP实现的,但是类内部方法互相调用时不会被Spring AOP拦截的,所以导致被调用方法的Cacheable注解失效,特此记录。

问题复现

@Servicepublic class UserServiceImpl{ @Override public User detail(Long id) { // 校验信息 if (id == null || id == 0) { return ApiResult.instance().fail(UserResultEnum.USER_ID_NULL); } User user = this.selectById(id); if (user == null) { return ApiResult.instance().fail(UserResultEnum.USER_NULL); } return user; } @Override @Cacheable(value = "user",condition = "#id != null", key = "'user'.concat(#id.toString())") public User selectById(Serializable id){ return super.selectById(id); } }

上述代码在使用this.selectById的时候Cacheable注解是无效的,解决办法如下:

  • 写一个工具类SpringContextUtil实现ApplicationContextAware接口
public class SpringContextUtil implements ApplicationContextAware { private static ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext){ SpringContextUtil.applicationContext = applicationContext; } public static ApplicationContext getApplicationContext(){ return applicationContext; } public static Object getBean(Class var1) throws BeansException { return applicationContext.getBean(var1); } }
  • 在Spring Boot启动的时候将ApplicationContext注入SpringContextUtil
public class AuthServiceApplication {    public static void main(String[] args) { SpringContextUtil springContextUtil = new SpringContextUtil(); ApplicationContext applicationContext = SpringApplication.run(AuthServiceApplication.class, args); springContextUtil.setApplicationContext(applicationContext); } }
  • 在UserServiceImpl方法中使用
@Servicepublic class UserServiceImpl{ @Override public User detail(Long id) { // 校验信息 if (id == null || id == 0) { return ApiResult.instance().fail(UserResultEnum.USER_ID_NULL); } //注入当前Bean使得调用内部方法也被SpringAOP拦截 IUserService userService = (IUserService) SpringContextUtil.getBean(this.getClass()); User user = userService.selectById(id); if (user == null) { return ApiResult.instance().fail(UserResultEnum.USER_NULL); } return user; } @Override @Cacheable(value = "user",condition = "#id != null", key = "'user'.concat(#id.toString())") public User selectById(Serializable id){ return super.selectById(id); } }

这样就可以解决Bean内部方法调用不被Spring AOP拦截的问题

转载于:https://www.cnblogs.com/dudadi/p/8087664.html

你可能感兴趣的文章
第二次站立会议1
查看>>
Linux进程调度分析
查看>>
C++布隆过滤器
查看>>
前端优化
查看>>
【转】Javascript 中的false,零值,null,undefined和空字符串对象
查看>>
记事本APP之Alpha报告
查看>>
bellman ford优先队列优化简介模板
查看>>
TCP三次握手
查看>>
ASP.NET AJAX调用 WebService
查看>>
大学三年的反思
查看>>
Get和Post的区别(转)
查看>>
数据库sql中distinct用法注意事项
查看>>
linux系统下单节点hadoop2的配置
查看>>
PAT (Basic Level) Practise 1006. 换个格式输出整数
查看>>
Ubuntu Eclipse 提示颜色
查看>>
温习 数据结构之HuffmanTree
查看>>
dva reduxRouter 跳转路由的参数
查看>>
Code Pages
查看>>
How do I force my .NET application to run as administrator?
查看>>
应该知道的30个jQuery代码开发技巧
查看>>