AopContext.currentProxy() 解决 cache不生效

本文探讨了在Spring框架中,当UserService类的create()方法调用findById(Long id)时,若直接使用this或直接调用,可能导致缓存失效的问题。通过配置expose-proxy=true并使用AopContext.currentProxy()方法,可以正确利用代理,确保缓存机制正常工作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

比如:UserService 类的某个方法create()调用了 findById(Long id) 方法,并且findById(Long id) 方法用了spring的缓存。
如果直接用this,或者直接调用,缓存就会失效。这时候可以在UserService内使用 ((UserService)AopContext.currentProxy()) 获取当前类的代理,强制转换为当前类。使用方式如下:

  1. 配置 expose-proxy="true"
    <aop:aspectj-autoproxy proxy-target-class="true" expose-proxy="true" />

2、使用代理。代码类型下面。

public class UserServiceImpl implements UserService {
	
	public void create(){
		//使用代理
		((UserService)AopContext.currentProxy()).findById(1110);
	}
	@Cacheable(cacheNames=, key="#某个key", unless="#result == null")
	public User findById(Long id){
		return User
	}
}

参考文档: https://blog.youkuaiyun.com/weixin_35796363/article/details/86306291

转载于:https://my.oschina.net/kunBlog/blog/3089755

Caffeine是一个流行的Java库,用于创建本地内存中的高速缓存(Local Cache)。如果在使用Caffeine的缓存功能时发现它并没有像预期那样生效,可能是以下几个原因导致: 1. **初始化问题**:确保你在应用程序启动时正确地初始化了Cache。通常通过`LoadingCache`或`CacheBuilder`构建并注册。 ```java LoadingCache<Key, Graph> graphs = Caffeine.newBuilder() .expireAfterWrite(60, TimeUnit.MINUTES) // 缓存数据存活时间 .build(key -> loadGraphFromDatabase(key)); ``` 2. **缓存配置错误**:检查缓存策略是否设置正确,比如并发限制、缓存容量等。如果没有正确的配置,可能会导致缓存无法存储数据或数据过期被清理。 3. **加载函数异常**:`loadGraphFromDatabase`这个函数如果抛出异常,Caffeine默认不会将该键值对放入缓存。需要确认其能处理潜在的异常,并使用`ExceptionHandlingPolicy`进行定制。 4. **并发访问**:如果你的应用程序有多个线程同时读写缓存,确保已经考虑并发安全。Caffeine提供了多种并发策略,如`ForkJoinPool`或`ConcurrentHashMap`。 5. **依赖注入问题**:如果你是在Spring框架下使用Caffeine,确保已正确配置Spring Caching支持。 如果以上都检查过了还是无法解决问题,可以尝试添加日志调试信息,查看具体是何时缓存插入失败,或者哪些操作触发了缓存失效。另外,也可以查阅官方文档或社区论坛寻求帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值