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

时间:2014-03-20 21:25:50

标签: spring caching key-generator spring-cache

我需要你的专长:))

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

使用个性化的KeyGenerator,一切正常。

我的密钥示例:用户名:USERNAME.appVersion:VERSION.METHOD.PARAM1.etc

但是在某个地方,我获得了检索国家内容的方法:这个方法对每个用户都是一样的。我想避免每个用户要求此内容的缓存密钥。

示例: appVersion:VERSION.METHOD.PARAM1.etc

所以当我定位@Cacheable注释时,有没有办法在其中设置新参数?密钥生成器将能够捕获它并知道他是否必须在缓存密钥名称前加上用户信息。

感谢您的帮助:)

小心

2 个答案:

答案 0 :(得分:1)

我真的不明白你在说什么"在其中设置一个新参数"。该参数应该来自某个地方吗?

KeyGenerator使您可以访问Method,实际实例和方法参数。您可能希望为此特定缓存操作设置特定KeyGenerator,这是will be available as from Spring 4.1,但同时您可以实现基于该方法调用正确KeyGenerator实例的复合或者,例如,您创建的用于标记它的注释。

答案 1 :(得分:1)

谢谢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)。