这是有问题的代码:
public interface WeatherDao {
public Weather getWeather(String zipCode);
public List<Location> findLocations(String locationSearch);
}
public class DefaultWeatherDao implements WeatherDao {
@Cacheable(cacheName="weatherCache")
public Weather getWeather(String zipCode) {
//Some Code
}
@Cacheable(cacheName="locationSearchCache")
public List<Location> findLocations(String locationSearch) {
//Some Code
}
}
我不太明白你关于static变量的观点。本质上,有一张from to和类似 from to的地图。此映射可以来自数据库、文件、外部 API 等。zipCodeWeatherlocationSearchList<Location>
你想创建一个所有可能的参数作为键和对应值的映射吗?当然可以,但它有几个缺点:
你给你的堆施加了很大的压力。在许多情况下,数据量可能永远无法放入内存,甚至无法放入磁盘(想想:通过存储每个可能的搜索查询和命中列表来缓存 Google 搜索引擎)
很可能您永远不会使用大多数密钥。为什么要将它们存储在内存中?
驱逐呢?我敢打赌,随着时间的推移,这些方法往往会为相同的邮政编码返回不同的天气......
由于我不完全理解您的论点,让我简要解释一下调用时幕后发生的情况getWeather():
透明代理拦截getWeather()呼叫并查找weatherCache
在该缓存中,它使用zipCode参数作为缓存键
如果存在这样的条目(类型Weather),则立即返回
如果不是上述情况,则将控制权委托给真实getWeather()方法。它可以调用一些 API、运行数据库查询或进行一些冗长的计算
的结果getWeather()被放置在以weatherCache备将来参考。
这里不static涉及。
BTW Spring 3.1 引入了缓存抽象层,这可能会使这个 Google Code 项目过时。它看起来相同,并允许与不同的缓存实现无缝集成。