使用Sping Boot + Spring Cache时,显式CacheManager bean定义是强制性的吗?

qgelzfjb  于 2022-12-18  发布在  Spring
关注(0)|答案(1)|浏览(157)

从文档中,如果我们没有定义自己的CacheManager bean定义,Sping Boot 默认使用ConcurrentMapCacheManager作为CacheManager实现。但是我一直收到“没有类型为”org.springframework.cache.CacheManager“可用”的合格bean“错误,即使有spring-boot-starter-cache和@EnableCaching。
任何帮助都将不胜感激。
此致,
设置核

w1e3prcc

w1e3prcc1#

简单的说......不。
我怀疑您在(集成)测试时遇到了问题?如果是这样,那么您可能需要声明适当的“测试切片注解”,即@AutoConfigureCache;参见Javadoc
为了进行演示,我创建了一个简单的示例,其中test class包含在我的SO repositorymodule中,即使您的测试是@SpringBootTest,您也必须在配置中声明@AutoConfigureCache注解(请参见此处)。
正如Sping Boot 文档所述,Spring Boot的所有 * 自动配置 *(这是相当广泛的)可能有点多的测试。因此,没有一个Sping Boot 的 * 自动配置 * 是默认启用。因此,你必须显式地启用你想要的,或者,你可以声明你想要整个Spring启动的 * 自动配置 * 启用,方法是将@AutoConfigureCache注解声明替换为Sping Boot 的@EnableAutoConfiguration注解。
Sping Boot 将自动配置一个“Simple”缓存提供程序(即ConcurrentMapCacheManager,或者换句话说,由java.util.concurent.ConcurrentHashMap支持的Spring CacheManager实现;见此处),当没有其他缓存提供者实现(例如Redis)存在或显式声明时。
然而, Boot * 自动配置 * 仅在您的SpringBoot应用程序是一个“应用程序”时有效,我已经展示了here
当然,如果您的测试按照描述找到了您的@SpringBootApplication注解类(在classpath组件扫描中),那么它也将启用缓存,而无需任何显式注解,例如,甚至无需显式声明@AutoConfigureCache测试切片注解。
注:在我的示例中,我故意没有根据建议的结构打包源代码,因此,如果我将测试配置中的@AutoConfigureCache注解声明替换为@Import(SpringBootDefaultCachingApplication.class),并从应用程序类中注解掉此Assert,那么测试也将通过。以这种方式使用@Import注解类似地工作,就好像测试类和应用类在同一个包中一样,或者应用类在相对于测试类的父包中。
最后一个技巧...您可以始终启用Sping Boot 调试(参见Baeldung的blog),以查看在运行应用程序时,甚至在运行测试时应用了什么 * 自动配置 *。

相关问题