【问题标题】:@Cacheable : how to pass a new attribute that can be used in my own KeyGenerator?@Cacheable:如何传递可以在我自己的 KeyGenerator 中使用的新属性?
【发布时间】:2014-03-20 21:25:49
【问题描述】:

我需要你的专业知识:)

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

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

我的密钥示例:username:USERNAME.appVersion:VERSION.METHOD.PARAM1.etc

但是在某个位置,我得到了检索国家内容的方法:每个用户都将使用相同的方法。而且我想避免为每个请求此内容的用户使用缓存键。

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

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

感谢您的帮助:)

保重

【问题讨论】:

    标签: spring caching key-generator spring-cache


    【解决方案1】:

    我真的不明白您所说的“在其中设置一个新参数”是什么意思。那个参数应该来自某个地方吧?

    KeyGenerator 让您可以访问Method、实际实例和方法参数。您可能希望为这个特定的缓存操作指定一个特定的KeyGenerator,这与will be available as from Spring 4.1 相同,但同时您可以实现一个组合,该组合基于该方法调用正确的KeyGenerator 实例,例如,一个您为标记它而创建的注释。

    【讨论】:

      【解决方案2】:

      谢谢你,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 {
      
      }
      

      现在,如果我们想要共享缓存键而不是唯一的(例如使用用户 ID),我们只需使用额外的 @SharedCache 注释 @Cacheable 方法。

      【讨论】:

      • 是的,这就是我的意思,很好!我正在谈论的功能现在在最新的4.1.0.BUILD-SNAPSHOT 中可用,因此如果这些仅与某些类相关,您现在也可以在类级别自定义密钥生成器(即@CacheConfig(keyGenerator = "authGenericKeyGenerator")
      猜你喜欢
      • 2021-07-14
      • 2016-04-14
      • 2019-08-27
      • 1970-01-01
      • 2015-10-16
      • 2010-11-03
      • 2012-01-04
      • 1970-01-01
      • 2020-05-23
      相关资源
      最近更新 更多