【问题标题】:Understanding @Enable... annotations concurrency理解@Enable...注解并发
【发布时间】:2017-12-21 17:44:25
【问题描述】:

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

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

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

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

这打破了我迄今为止的许多成见:

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

  2. 为什么当两个注释都存在时这种情况才有效,我猜 spring-boot-cache-starter 中的 CacheManager@ConditionalOnBean,所以在这种情况下,我希望两个项目都使用 @ 987654338@ bean 用于解析,不是每个人的域

P.S:在我们的主项目中找到的@EnableCaching 被放置在一个内部静态@Configuration 类中。这会很重要吗?

【问题讨论】:

    标签: java spring-boot spring-cache spring-boot-starter jsr107


    【解决方案1】:

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

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

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

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

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

    如果每个域都有@Cacheable 的标准用法,它将违反 CacheManager。如果您注意到您所描述的行为,它与@EnableCaching 完全无关。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-24
      • 1970-01-01
      • 2016-01-15
      • 2011-02-17
      • 2016-10-03
      • 2013-05-11
      • 2018-02-22
      相关资源
      最近更新 更多