Как сделать конфигурацию условной для другой конфигурации?

Я хочу сделать мой класс конфигурации весенней загрузки A зависит от другого класса конфигурации Bт.е. A конфигурация оценивается только если B Конфигурация оценивается.

В реальном контексте у меня есть сотни Ai конфигурации и только одна Bи я хочу реализовать способ исключить все Ai конфиги исключая только B во время испытаний.

Я попробовал следующее:

@Configuration
@ConditionalOnBean(type = "org.my.B")
public class A1AutoConfiguration {
// ...
}

куда B это безусловный класс конфигурации.

Но когда я бегу mvn spring-boot:run -Ddebug=true я вижу это A никогда не оценивается, потому что B пропал, отсутствует. В то время как бобы созданы внутри B находятся в контексте приложения, B само по себе нет.

Я хотя я могу сделать Ai классы конфигурации зависят от bean-компонентов, созданных внутри B но мне не очень нравится это решение.

Есть ли более чистый (и работающий) способ реализации такого механизма зависимости?

2 ответа

Решение

Ключ должен убедиться, что все упорядочено правильно. Нет смысла просить А подать заявление, только если присутствует Б, если вы не можете убедиться, что Б оценивается первым.

Сотня часть меня немного пугает. Если As и B являются автоконфигурацией, вы можете использовать следующее

@AutoconfigureAfter(B.class)
@ConditionalOnBean(B.class)
public class A123AutoConfiguration { ...}

Если As и B не являются автоконфигурациями, вам необходимо убедиться, что B обрабатывается первым, чтобы вы не могли полагаться на обычное сканирование пути к классам.

Я бы сказал, что такая группа бинов подходит для отдельной библиотеки или подмодуля, поэтому они независимы. В том числе механизмом может быть компонентное сканирование корневого пакета такой библиотеки или субмодуля.

Другой вариант - использовать пружинные профили. Пометьте свои бобы @Profile аннотация и использование @ActiveProfiles включить определенную группу бинов во время теста.

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