1

我们有一个使用 spring-boot-cache-starter 的项目,注册一个实现,并在代码中ehCache CacheManager传播。@Cacheables

然后,其他一些团队创建了一个 starter,它基本上依赖于spring-boot-cachestarter (hashmap) 自动配置的默认配置来处理自己的@Cacheable方法。

两个代码都包含@EnableCaching注释,我们的问题是,如果我们注释主项目的 @EnableCaching 注释,行为会有所不同。

  1. 如果我们不在@EnableCaching我们的项目中评论,当我们使用自定义启动器时,一切正常。@Cacheablesfrom the starter 在 starter 范围内被索引和解析,但从 @Cacheables我们的域被解析在我们的ehcache.
  2. 如果我们@EnableCaching在我们的项目中发表评论,那么启动器和我们的项目都会@Cacheables尝试针对我们的ehCache实现来解决。

这打破了我迄今为止的许多先入之见:

  1. 我一直认为诸如@Enable... 之类的注释适用于所有上下文,无论放置(启动器/应用程序配置)如何,也无论在扫描所有@Configuration类时是否找到一次或两次。

  2. 为什么当两个注释都存在时案例会起作用,我猜CacheManagerspring-boot-cache-starter 中的 是 a @ConditionalOnBean,所以在这种情况下,我希望两个项目都使用ehcachebean 进行解析,而不是每个项目的域

PS@EnableCaching在我们的主项目中找到的放在一个内部静态@Configuration 类上。这可能很重要吗?

4

1 回答 1

1

如果您不透露自定义启动器的作用,则很难回答您的问题。特别是,这对我来说看起来很奇怪:

来自 starter 的 @Cacheables 在 starter 范围内被索引和解析,但来自我们域的 @Cacheables 在我们的 ehcache 中解析。

您的先入之见 1 是有效的:无论您在何处放置注释或多次添加注释都无关紧要。它只会为整个ApplicationContext. 在 Spring Boot 的情况下,除非CacheManager在用户配置中定义了自定义 bean,否则这将触发自动配置。

“每个人的领域”对我来说听起来很糟糕。你确定这是怎么回事?如果要存储在多个缓存管理器中,则没有很多不同的方法:

  1. 您需要定义 a并在注释CacheResolver中引用它(或)@Cacheable@CacheConfig
  2. 您需要一个CacheManager知道在每个底层存储中的哪里可以找到缓存的特殊功能

如果每个域都有一个标准使用,@Cacheable它将违反 CacheManager. 如果您注意到您所描述的行为,那根本与它无关@EnableCaching

于 2017-12-25T11:29:55.257 回答