@Cacheable:如何传递一个可以在我自己的KeyGenerator中使用的新属性



我需要你的专业知识:)

我正在开发一个应用程序,其中对服务的方法调用需要进行身份验证。这意味着我希望每个方法调用都使用包含用户名的键进行缓存(以避免未经授权的用户检索由授权用户缓存的信息)。

使用个性化的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)。

相关内容

  • 没有找到相关文章

最新更新