Spring Boot中默认不使用自定义密钥生成器

时间:2018-05-06 02:03:02

标签: java spring spring-boot spring-cache spring-config

我有一个自定义密钥生成器,只有在"keyGenerator"注释中使用@Cachehable属性时才会调用它。

我创建它的配置类作为gradle依赖项被拉入(并且已加载并且我的密钥生成器已创建。)。

配置:

@EnableCaching
@Configuration
public class CacheKeyConfig extends CachingConfigurerSupport
{
    private static final Logger LOGGER = LoggerFactory.getLogger( CacheKeyConfig.class );

    @Bean
    @Primary
    public KeyGenerator keyGenerator(@Autowired( required = false ) List<CacheKeyGenerator> keyGenerators)
    {
        return new DynamicCacheKeyGenerator( keyGenerators );
    }
}

我传递的列表是开发人员可以创建的一组密钥生成器(作为bean),可用于特定的缓存解析器/管理器。因此它允许为MemCache或Redis或EhCache使用不同的密钥生成器(如果您在一个项目中使用多个)。但这可能是一个空列表。

密钥生成器:

public class DynamicCacheKeyGenerator implements KeyGenerator
{
    private static Logger LOGGER = LoggerFactory.getLogger( DynamicCacheKeyGenerator.class );

    private Map<Method, CacheKeyGenerator> keyGenerators = new HashMap<>();

    @Autowired
    public DynamicCacheKeyGenerator(List<CacheKeyGenerator> keyGenerators)
    {
        //Map the generators to the resolvers
        mapGeneratorsToResolvers( CacheResolverFinder.getMethodCacheResolvers(), keyGenerators );
    }

    //...elided...

    @Override
    public Object generate(Object target, Method method, Object... params)
    {
        //Try to get the cache key handler for this method
        CacheKeyGenerator generator = keyGenerators.get( method );

        //...elided...

        return generator.generate( target, method, params );
    }
}

以下内容永远不会使用我的密钥生成器:

@Cacheable( value = "MyCache", cacheResolver = "MyResolver" )

但以下确实使用它:

@Cacheable( value = "MyCache", cacheResolver = "MyResolver", keyGenerator = "keyGenerator" )

我如何让我的默认?

编辑:即使更改为以下内容也不会使用我的密钥生成器:

@EnableCaching
@Configuration
public class CacheKeyConfig extends CachingConfigurerSupport
{
    private static final Logger LOGGER = LoggerFactory.getLogger( CacheKeyConfig.class );

    @Autowired
    private List<CacheKeyGenerator> myKeyGenerators;    

    //This DOES get called
    @Override
    public KeyGenerator keyGenerator()
    {
        return new DynamicCacheKeyGenerator( myKeyGenerators );
    }
}

1 个答案:

答案 0 :(得分:0)

要记住的一点是,如果您在Cacheable批注中定义了一个键,则不会使用键生成器。确保将其删除以进行验证