qq_39360085 2022-04-10 22:00 采纳率: 50%
浏览 69
已结题

使用springboot集成ehcache使用时,被@Cacheable注解的方法所在的类,使用@autowired自动注入时缓存无效,使用getbean时缓存生效

问题遇到的现象和发生背景

初次搭建springboot+ehcache项目,为方便运维,将所有配置文件都提取到了外层config下,但是测试时,ehcache不生效

问题相关代码,请勿粘贴截图

@EnableCaching
@SpringBootApplication
public class App
{

private static ApplicationContext context;

public static void main( String[] args )
{
    context = new FileSystemXmlApplicationContext("E:\\eclipseworkspace\\Ehcache-01\\config\\applicationContext.xml");
    SpringApplication.run(App.class, args);
}


/**
 * 
 * @return
 */
public static ApplicationContext getContext() {
    return context;
}

}

@RestController
@RequestMapping("hello2")
public class HelloController {

@Autowired
private HelloService helloService;

@RequestMapping("")
public String hello() {

// helloService = (HelloService) App.getContext().getBean("server");
return helloService.getTime();
}

}

@Service
public class HelloService {

@Cacheable(value="GoodsType")
public String getTime() {
    return String.valueOf(System.currentTimeMillis());
}

}

  <!-- 1、启用缓存注解开关, cache-manager 属性用来指定当前所使用的CacheManager对应的bean的名称,默认是cacheManager -->
  <cache:annotation-driven cache-manager="springCacheManager"/>
      
  <!-- 2、映射到ehcacheManager -->
  <bean id="springCacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
    <property name="cacheManager" ref="ehcacheManager"/>
  </bean>
  
  <!-- 3、Ehcache实现, 对应 ehcache/ehcache.xml  -->
  <bean id="ehcacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
      <!-- 指定配置文件的位置 -->
    <property name="configLocation" value="E:\eclipseworkspace\Ehcache-01\config\ehcache.xml"/>
  </bean>
  
  
  <!-- <bean id="server" class="com.zhangzhen.Ehcache_01.HelloService"></bean> -->
  

<defaultCache 
    maxElementsInMemory="10000" 
    eternal="false"
    timeToIdleSeconds="120" 
    timeToLiveSeconds="120" 
    maxElementsOnDisk="10000000"
    diskExpiryThreadIntervalSeconds="120" 
    memoryStoreEvictionPolicy="LRU">

    <persistence strategy="localTempSwap" />
</defaultCache>

<!-- 测试 -->
<cache name="GoodsType" 
    eternal="false" 
    timeToIdleSeconds="2"
    timeToLiveSeconds="2" 
    maxEntriesLocalHeap="10000"
    maxEntriesLocalDisk="10000000" 
    diskExpiryThreadIntervalSeconds="120"
    overflowToDisk="false" 
    memoryStoreEvictionPolicy="LRU">
</cache>
运行结果及报错内容

我的解答思路和尝试过的方法
使用@Lazy+@autowired进行懒加载也同样无效

我想要达到的结果

  • 写回答

2条回答 默认 最新

  • 波波老师 Java领域新星创作者 2022-04-11 10:24
    关注

    img


    还能这么用的?你这不是自己new了一个Context,然后springboot创建了一个context,相当于两个context么,而且两个context并没有什么关系,你的applicationContext.xml根本就没有被springboot加载到,它怎么帮你注入?

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月19日
  • 已采纳回答 4月11日
  • 创建了问题 4月10日

悬赏问题

  • ¥20 有关esp8266连接阿里云
  • ¥15 C# 调用Bartender打印机打印
  • ¥100 华为ens111111111111
  • ¥15 我这个代码哪里有问题 acm 平台上显示错误 90%,我自己运行好像没什么问题
  • ¥50 C#编程中使用printDocument类实现文字排版打印问题
  • ¥15 找会编程的帅哥美女 可以用MATLAB里面的simulink编程,用Keil5编也可以。
  • ¥15 已知隐函数其中一个变量τ的具体值,求另一个变量
  • ¥15 r语言Hurst指数
  • ¥15 Acrn IVSHMEM doorbell问题
  • ¥15 yolov5中的val测试集训练时数量变小问题