Java 在Spring中设置并使用ehcache后,缓存为空

Java 在Spring中设置并使用ehcache后,缓存为空,java,spring,annotations,ehcache,spring-annotations,Java,Spring,Annotations,Ehcache,Spring Annotations,下面是我的代码,当我到达末尾并试图从缓存中打印出一些内容时,密钥列表是空的 @Configuration @EnableCaching public class EhcacheConfiguration implements CachingConfigurer { CacheConfiguration cacheConfiguration = new CacheConfiguration(); cacheConfiguration.setName("DataCache");

下面是我的代码,当我到达末尾并试图从缓存中打印出一些内容时,密钥列表是空的

@Configuration
@EnableCaching
public class EhcacheConfiguration implements CachingConfigurer
{
    CacheConfiguration cacheConfiguration = new CacheConfiguration();
    cacheConfiguration.setName("DataCache");
    cacheConfiguration.setMemoryStoreEvictionPolicy("LRU");
    cacheConfiguration.setMaxEntiresLocalHeap(1000);
    cacheConfiguration.setEternal(false);

    net.sf.ehcache.config.Configuration config = new net.sf.ehcache.config.Configuration();
    config.addCache(cacheConfiguration);
    return net.sf.ehcache.CacheManager.newInstance(config);
} 

@Bean
@Override
public CacheManager cacheManager()
{
    return new EhCacheManager(ehCacheManager());
}

@Override
public CacheResolver cacheResolver()
{
    return new SimpleCacheResolver();
}

@Bean
@Override
public KeyGenerator keyGenerator()
{
    return new SimpleKeyGenerator();
}

@Override public CacheErrorHandler errorHandler()
{
    return new SimpleCacheErrorHandler();
}

@Service
public class DataCalculationsDataServiceImp implements DataSubcalculationsDataService
{
    .
    .
    .
@Cacheable("DataCache")
public ThreadSafeList<float[]> createCacheableDataList()
{
    return new ThreadSafeList<float[]>();
}

@Override
public void readData(DataCalculationEtity dataCalculationEntity, InputStream inputStream)
{
    .
    .
    .
    ThreadSafeList<float[]> dataList = createCacheableDataList();
    .
    .
    (dataList is eventually assigned data)
    .
    .
    EhCacheCacheManager manager = new (EhCacheCacheManager)applicationContext.getBean("cacheManager");
    Cache dataListCache = cacheManager.getCache("DataCache");
    net.sf.ehcache.Ehcache ehCache = (net.sf.ehcache.Ehcache) dataListCache.getNativeCache();
    LOG.info("Size of dataListCache: " + ehCache.getSize());
}
@配置
@启用缓存
公共类EhcacheConfiguration实现cachingconfiguer
{
CacheConfiguration CacheConfiguration=新的CacheConfiguration();
setName(“数据缓存”);
cacheConfiguration.setMemoryStorejectionPolicy(“LRU”);
cacheConfiguration.setMaxEntiresLocalHeap(1000);
cacheConfiguration.setexternal(false);
net.sf.ehcache.config.Configuration config=new net.sf.ehcache.config.Configuration();
config.addCache(cacheConfiguration);
返回net.sf.ehcache.CacheManager.newInstance(配置);
} 
@豆子
@凌驾
公共缓存管理器缓存管理器()
{
返回新的EhCacheManager(EhCacheManager());
}
@凌驾
公共CacheResolver CacheResolver()
{
返回新的SimpleCacheSolver();
}
@豆子
@凌驾
公钥生成器KeyGenerator()
{
返回新的SimpleKeyGenerator();
}
@重写公共CacheErrorHandler errorHandler()
{
返回新的SimpleCacherRorHandler();
}
@服务
公共类DataCalculationDataServiceImp实现DataSubCalculationDataService
{
.
.
.
@可缓存(“数据缓存”)
public ThreadSafeList createCacheableDataList()
{
返回新的ThreadSafeList();
}
@凌驾
public void readData(dataCalculationEntity dataCalculationEntity,InputStream InputStream)
{
.
.
.
ThreadSafeList dataList=createCacheableDataList();
.
.
(数据列表最终分配给数据)
.
.
ehcachemanager=new(ehcachemanager)applicationContext.getBean(“cacheManager”);
Cache dataListCache=cacheManager.getCache(“DataCache”);
net.sf.ehcache.ehcache ehcache=(net.sf.ehcache.ehcache)dataListCache.getNativeCache();
LOG.info(“dataListCache的大小:+ehCache.getSize());
}
大小打印为零,我不知道为什么。我做了一些更新,比如按照一个答案中的建议将@Cacheable方法公开。我不明白为什么会忽略对注释为@Cacheable的方法的调用

这两个链接强化了John R

我不确定错误消息,但您在一个私有方法上有
@Cacheable
。由于您是从同一个类中进行调用,因此Spring不会拦截该调用,因此缓存不会发生

Spring通常的工作方式是针对每个
@服务
(或
@组件
@控制器
,等等)。当有东西调用服务时,它实际上会命中代理。代理查看实际目标上的注释(例如,
@Cacheable
@Transactional
)然后在调用实际的目标方法之前/之后执行一些操作

我刚才描述的方法有点简化,Spring还可以使用其他方法。在接口未指定代理方法的情况下,Spring可以动态生成目标类(您的服务)的子类还有编译时和加载时的编织,其中实现注释的字节码被注入到编译的类文件中


如果您以前没有遇到过这种情况,我强烈建议您阅读Spring文档中有关AOP的部分。

警告最终是一个假警报。我现在使用Spring应用程序上下文查找bean并检查它。我使用.getBean(“cacheManager”)和cacheManager.getCache(“SpectrumCache”)接收的bean仍然不包含任何条目。不幸的是,创建@Cacheable方法并没有改变结果…从我在调试程序中看到的结果来看,它仍然是空的。我相信你已经找到了答案,尽管我仍然坚持到底…我将我的可缓存方法移动到了一个带有@Component的新类中。然后,我将变量自动连接到m我将在我的问题中添加两个链接来强化你的答案。