gpt4 book ai didi

java - 理解@Enable...注解并发

转载 作者:行者123 更新时间:2023-11-30 06:22:01 25 4
gpt4 key购买 nike

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

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

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

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

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

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

  2. 为什么当两个注解都存在时,这个案例就可以工作,我猜 spring-boot-cache-starter 中的 CacheManager 是一个 @ConditionalOnBean,所以在这种情况下,我希望两个项目都使用 ehcache bean 进行解析,而不是每个项目的域

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

最佳答案

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

@Cacheables from the starter are indexed and resolved in the starter scope but @Cacheables from our domain are resolved in our ehcache.

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

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

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

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

关于java - 理解@Enable...注解并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47930149/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com