如何使Spring缓存中的缓存名称可配置? [英] How can I make the cache name in Spring cache configurable?

查看:680
本文介绍了如何使Spring缓存中的缓存名称可配置?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我们使用Spring缓存框架进行缓存,并且我们希望能够支持多种缓存名称空间,例如"book"或"isbn",并且缓存名称空间是可配置的,而不是在类中进行硬编码,喜欢,而不是拥有

We use Spring cache framework for caching, and we'd like to able to support multiple namespaces for caches, such as "book", or "isbn", with the cache namespaces being configurable, rather than hardcoded in the class, like, instead of having

@Cacheable({ "book","isbn"})
public Book findBook(ISBN isbn) {...}

我们希望能够以某种方式从属性文件中注入缓存名称,以便可以动态设置缓存名称,例如:

we want to be able somehow inject the cache name from a properties file, so that the cache name can be dynamically set, like:

@Cacheable({ #cachename1, #cachename2})
public Book findBook(ISBN isbn) {...}

我在这里使用SpEL,但根本不知道这是否可行.

I'm using SpEL here, but don't know if this is doable at all.

推荐答案

关闭 smartwjw 的答案...

我一直希望通过Spring环境变量(例如@Cacheable("${my.config.property.name}"))来解析cacheName.我通过自定义CacheResolver

I was looking to have cacheNames resolved via spring environment variables, such as @Cacheable("${my.config.property.name}"). I accomplished this via a custom CacheResolver

import java.util.Collection;
import java.util.stream.Collectors;

import org.springframework.cache.CacheManager;
import org.springframework.cache.interceptor.CacheOperationInvocationContext;
import org.springframework.cache.interceptor.SimpleCacheResolver;
import org.springframework.core.env.PropertyResolver;

public class PropertyResolvingCacheResolver
    extends SimpleCacheResolver {

    private final PropertyResolver propertyResolver;

    protected PropertyResolvingCacheResolver(CacheManager cacheManager, PropertyResolver propertyResolver) {
        super(cacheManager);
        this.propertyResolver = propertyResolver;
    }

    @Override
    protected Collection<String> getCacheNames(CacheOperationInvocationContext<?> context) {
        Collection<String> unresolvedCacheNames = super.getCacheNames(context);
        return unresolvedCacheNames.stream()
            .map(unresolvedCacheName -> propertyResolver.resolveRequiredPlaceholders(unresolvedCacheName)).collect(Collectors.toList());
    }
}

然后,您当然必须将其配置为CacheResolver,以与扩展org.springframework.cache.annotation.CachingConfigurerSupport@Configuration一起使用.

And then of course you must configure it as THE CacheResolver to use with a @Configuration that extends org.springframework.cache.annotation.CachingConfigurerSupport.

@Configuration
@EnableCaching
public class CacheConfig extends CachingConfigurerSupport {

    public static final String PROPERTY_RESOLVING_CACHE_RESOLVER_BEAN_NAME = "propertyResolvingCacheResolver";

    @Autowired
    private CacheManager cacheManager;
    @Autowired
    private Environment springEnv;

    @Bean(PROPERTY_RESOLVING_CACHE_RESOLVER_BEAN_NAME)
    @Override
    public CacheResolver cacheResolver() {
        return new PropertyResolvingCacheResolver(cacheManager, springEnv);
    }
}

这篇关于如何使Spring缓存中的缓存名称可配置?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆