Понимание @Enable... параллелизма аннотаций

У нас есть проект, который использует spring-boot-cache-starter, регистрируя ehCacheCacheManager реализация и распространение @Cacheables через код.

Затем какая-то другая команда создала стартер, который в основном полагается на конфигурацию по умолчанию, автоматически настроенную spring-boot-cache стартер (hashmap) для собственной обработки @Cacheable методы.

Оба кода содержат @EnableCaching аннотации, и наша проблема в том, что поведение будет другим, если мы прокомментируем аннотацию @EnableCaching нашего основного проекта.

  1. Если мы не комментируем @EnableCaching В нашем проекте, когда мы используем пользовательский стартер, все работает нормально. @Cacheables от стартера индексируются и разрешаются в области стартера, но@Cacheables из нашего домена разрешены в нашем ehcache,
  2. Если мы прокомментируем @EnableCaching в нашем проекте, то и стартер, и наш проект @Cacheables пытаются решить против нашего ehCache реализация.

Это разрушает многие предвзятые мнения, которые у меня были до сих пор:

  1. Я всегда думал, что аннотация, такая как @Enable... применяется ко всему контексту, независимо от места размещения (конфигурации для начинающих / приложения) и независимо от того, был ли он найден один или два раза при сканировании всех @Configuration классы.

  2. Почему дело работает, когда есть обе аннотации, я думаю, CacheManager в Spring-boot-cache-starter является @ConditionalOnBeanтак что в этом случае я ожидаю, что оба проекта используют ehcache бин для разрешения, а не домен каждого

PS: @EnableCaching найденный в нашем основном проекте размещен во внутреннем статическом классе @Configuration. Может ли это быть значительным?

1 ответ

Очень сложно ответить на ваш вопрос, если вы не раскрываете, что делает пользовательский стартер. В частности, это выглядит странно для меня:

@Cacheables из начального каталога индексируются и разрешаются в начальном объеме, но @Cacheables из нашего домена разрешаются в нашем ehcache.

Ваши предусловия 1 действительны: не имеет значения, куда вы положили аннотацию или добавили ли вы ее более одного раза. Это просто включит кэширование для всего ApplicationContext, В случае Spring Boot, это вызовет автоматическую настройку, если пользовательский CacheManager Боб определяется в конфигурации пользователя.

"Домен каждого" звучит для меня сломанным. Вы уверены, что это то, что происходит? Если вы хотите хранить в нескольких кеш-менеджерах, есть не так много разных способов:

  1. Вы должны определить CacheResolver и обратитесь к нему в @Cacheable аннотации (или @CacheConfig)
  2. Вам нужен особый CacheManager который знает, где найти кеши в каждом нижележащем магазине

Если каждый домен имеет стандартное использование @Cacheable это пойдет против CacheManager, Если вы замечаете поведение, которое вы описываете, это не имеет ничего общего с @EnableCaching совсем.

Другие вопросы по тегам