我需要你的专业知识:)
我正在开发一个应用程序,其中对服务的方法调用需要进行身份验证。这意味着我希望每个方法调用都使用包含用户名的键进行缓存(以避免未经授权的用户检索由授权用户缓存的信息)。
使用个性化的KeyGenerator,一切都可以正常工作。
我的密钥示例:用户名:username . appversion:VERSION.METHOD.PARAM1.etc
但是在某些位置,我得到了检索国家内容的方法:这个对于每个用户都是相同的。并且我想避免每个请求此内容的用户都有一个缓存键。
示例:appVersion:VERSION.METHOD.PARAM1.etc
所以当我定位我的@Cacheable注释,有没有办法设置一个新的参数?密钥生成器将能够捕获它,并知道他是否必须在缓存密钥名称前加上用户信息。
谢谢你的帮助:)
照顾我真的不明白你说的"set a new parameter in it"是什么意思。这个参数应该来自某个地方,对吧?
KeyGenerator
允许您访问Method
、实际实例和方法参数。您可能想要为这个特定的缓存操作有一个特定的KeyGenerator
,这将从Spring 4.1开始可用,但同时您可以实现一个基于方法调用正确的KeyGenerator
实例的组合,或者,例如,您创建的标记它的注释。
谢谢你snicoll,你说得很清楚,你真的帮了我很多。
等待Spring 4.1,我和我的团队决定使用一个自定义的@SharedCache注释。
这里是一些代码示例,以帮助如果有人在相同的情况。
-
给定一个现有的自定义GenericKeyGenerator(他正在为每个缓存的方法调用构建一个自定义缓存键)
-
我们有一个新的自定义AuthenticatedGenericKeyGenerator:他继承了GenericKeyGenerator和简单的前缀缓存密钥与用户信息
应用程序现在默认使用AuthenticatedGenericKeyGenerator:
<cache:annotation-driven key-generator="keyGenerator"/>
<bean id="keyGenerator" class="your.package.AuthenticatedGenericKeyGenerator" />
AuthenticatedGenericKeyGenerator.java详细信息:
public class AuthenticatedGenericKeyGenerator extends GenericKeyGenerator {
public AuthenticatedGenericKeyGenerator() {
super(...);
}
@Override
public Object generate(final Object target, final Method method, final Object... params) {
String cacheKey = super.generate(target, method, params).toString();
if(!method.isAnnotationPresent(SharedCache.class)) {
cacheKey = "user:" + some user information + "." + cacheKey;
}
return cacheKey;
}
}
我们的自定义@SharedCache注释:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface SharedCache {
}
现在我们只需要用一个额外的@SharedCache注释@Cacheable方法,如果我们希望缓存键是共享的,而不是唯一的(例如,与用户id)。