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