Как избавиться от ненужного бина из сторонней библиотеки в Spring
Что проверяют
Понимаете ли вы, откуда бин вообще берётся: из автоконфигурации Spring Boot, из сканирования пакетов или из чужого @Configuration, подключённого через @Import. От источника зависит способ. Следом обычно спрашивают, как убедиться, что бин действительно исчез, и что сломается у тех, кто от него зависел.
Как отвечать
Сначала найдите источник: запуск с --debug печатает отчёт об условиях автоконфигурации, а Actuator показывает то же в /actuator/conditions и список бинов в /actuator/beans. Дальше по ситуации:
- автоконфигурация:
@SpringBootApplication(exclude = XxxAutoConfiguration.class)или свойствоspring.autoconfigure.exclude. Отключается весь класс конфигурации, а не один бин; - условия самой библиотеки: многие автоконфигурации помечены
@ConditionalOnPropertyили@ConditionalOnMissingBean. Выключите их свойством или объявите свой бин того же типа, и библиотечный не создастся; - сканирование пакетов:
excludeFiltersв@ComponentScanсFilterType.ASSIGNABLE_TYPEилиREGEX; - жёсткий
@Import, который не отключить:BeanDefinitionRegistryPostProcessorиregistry.removeBeanDefinition("имя"). Метод, объявляющий такой постпроцессор, делаютstatic, иначе он тянет за собой раннюю инициализацию конфигурации; - библиотека не нужна вовсе: исключите транзитивную зависимость в Maven или Gradle, это чище любой настройки контекста.
Удаление определения срабатывает до создания экземпляров, поэтому конструктор и @PostConstruct не выполнятся, соединения не откроются.
Где спотыкаются
Предлагают @Primary. Он лишь выбирает кандидата при внедрении, а ненужный бин всё равно создаётся и живёт в контексте со всеми своими пулами и потоками.
Возвращают null из своего @Bean-метода с тем же именем. В Spring Boot переопределение определений бинов по умолчанию запрещено (spring.main.allow-bean-definition-overriding=false), и приложение просто упадёт на старте.
Вырезают бин, не проверив, кто на него ссылается. Соседние бины из той же библиотеки получат NoSuchBeanDefinitionException, поэтому часто правильнее отключить автоконфигурацию целиком.