Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在SpringCache中配置缓存名称?_Java_Spring_Caching_Dependency Injection - Fatal编程技术网

Java 如何在SpringCache中配置缓存名称?

Java 如何在SpringCache中配置缓存名称?,java,spring,caching,dependency-injection,Java,Spring,Caching,Dependency Injection,我们使用SpringCache框架进行缓存,我们希望能够支持缓存的多个名称空间,例如“book”或“isbn”,缓存名称空间是可配置的,而不是在类中硬编码的,例如,而不是 @Cacheable({ "book","isbn"}) public Book findBook(ISBN isbn) {...} 我们希望能够以某种方式从属性文件中注入缓存名称,以便可以动态设置缓存名称,如: @Cacheable({ #cachename1, #cachename2}) public Book find

我们使用SpringCache框架进行缓存,我们希望能够支持缓存的多个名称空间,例如“book”或“isbn”,缓存名称空间是可配置的,而不是在类中硬编码的,例如,而不是

@Cacheable({ "book","isbn"})
public Book findBook(ISBN isbn) {...}
我们希望能够以某种方式从属性文件中注入缓存名称,以便可以动态设置缓存名称,如:

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

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

不,@Cacheable注释的cache name(
value
)属性不支持动态(SpEL或其他)表达式。您必须实现自己版本的
org.springframework.cache.annotation.SpringCacheAnnotationParser
,并将其注入到框架中。

您还可以直接使用缓存,使所有这些都更加可预测

EhCacheCacheManager cacheManager = (EhCacheCacheManager) CDBBeanFactory.instance().getBean("cacheManager");
CacheManager manager cacheManager.getCacheManager();
manager.getCache("cacheBin").get("key");
manager.getCache("cacheBin").put(new Element(key, obj));

etc..

Spring4.1引入了
CacheResolver
,并使用自定义的
CacheResolver
选择
Cache
,然后可以是动态的

离开的答案

我希望通过spring环境变量解析CacheName,比如
@Cacheable(${my.config.property.name}”)
。我通过一个定制的
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());
    }
}

谢谢,我在哪里可以找到一些关于如何使用IMElement SpringCacheAnnotationParser的文档或示例?我认为您必须深入研究实际代码并找出答案。这实际上不是一个文档化的“特性”,而是对核心功能的修改/扩展。
@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);
    }
}