Понимание @Enable... параллелизма аннотаций
У нас есть проект, который использует spring-boot-cache-starter, регистрируя ehCache
CacheManager
реализация и распространение @Cacheables
через код.
Затем какая-то другая команда создала стартер, который в основном полагается на конфигурацию по умолчанию, автоматически настроенную spring-boot-cache
стартер (hashmap) для собственной обработки @Cacheable
методы.
Оба кода содержат @EnableCaching
аннотации, и наша проблема в том, что поведение будет другим, если мы прокомментируем аннотацию @EnableCaching нашего основного проекта.
- Если мы не комментируем
@EnableCaching
В нашем проекте, когда мы используем пользовательский стартер, все работает нормально.@Cacheables
от стартера индексируются и разрешаются в области стартера, но@Cacheables
из нашего домена разрешены в нашемehcache
, - Если мы прокомментируем
@EnableCaching
в нашем проекте, то и стартер, и наш проект@Cacheables
пытаются решить против нашегоehCache
реализация.
Это разрушает многие предвзятые мнения, которые у меня были до сих пор:
Я всегда думал, что аннотация, такая как
@Enable
... применяется ко всему контексту, независимо от места размещения (конфигурации для начинающих / приложения) и независимо от того, был ли он найден один или два раза при сканировании всех@Configuration
классы.Почему дело работает, когда есть обе аннотации, я думаю,
CacheManager
в Spring-boot-cache-starter является@ConditionalOnBean
так что в этом случае я ожидаю, что оба проекта используютehcache
бин для разрешения, а не домен каждого
PS: @EnableCaching
найденный в нашем основном проекте размещен во внутреннем статическом классе @Configuration. Может ли это быть значительным?
1 ответ
Очень сложно ответить на ваш вопрос, если вы не раскрываете, что делает пользовательский стартер. В частности, это выглядит странно для меня:
@Cacheables из начального каталога индексируются и разрешаются в начальном объеме, но @Cacheables из нашего домена разрешаются в нашем ehcache.
Ваши предусловия 1 действительны: не имеет значения, куда вы положили аннотацию или добавили ли вы ее более одного раза. Это просто включит кэширование для всего ApplicationContext
, В случае Spring Boot, это вызовет автоматическую настройку, если пользовательский CacheManager
Боб определяется в конфигурации пользователя.
"Домен каждого" звучит для меня сломанным. Вы уверены, что это то, что происходит? Если вы хотите хранить в нескольких кеш-менеджерах, есть не так много разных способов:
- Вы должны определить
CacheResolver
и обратитесь к нему в@Cacheable
аннотации (или@CacheConfig
) - Вам нужен особый
CacheManager
который знает, где найти кеши в каждом нижележащем магазине
Если каждый домен имеет стандартное использование @Cacheable
это пойдет против CacheManager
, Если вы замечаете поведение, которое вы описываете, это не имеет ничего общего с @EnableCaching
совсем.