我有一个自定义密钥生成器,只有在"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 );
}
}
答案 0 :(得分:0)
要记住的一点是,如果您在Cacheable批注中定义了一个键,则不会使用键生成器。确保将其删除以进行验证