Вот упрощенный пример bean-компонента, который я хочу инициализировать первым:
Код: Выделить всё
@Component
public class MyEarlyBean {
public MyEarlyBean() {
System.out.println("MyEarlyBean initialized");
// some important setup
}
}
Что я пробовал
- Использование @DependsOn в DataSource bean – для этого мне потребуется определить свой собственный bean-компонент DataSource (или исключить автоматическую настройку), чтобы я мог аннотировать его с помощью @DependsOn("myEarlyBean").
Это работает, но я теряю удобство автоматической настройки и мне приходится вручную настраивать DataSource (пул соединений, свойства и т. д.). - Использование @AutoConfigureBefore – я создал класс автоконфигурации с помощью @AutoConfigureBefore(DataSourceAutoConfiguration.class) и определил внутри него MyEarlyBean.
Это гарантирует раннюю обработку класса автоконфигурации, но экземпляр самого компонента все равно может быть создан после DataSource, потому что @AutoConfigureBefore заказывает только классы автоконфигурации, а не компоненты, которые они содержат. - Реализация BeanFactoryPostProcessor – я написал собственный BeanFactoryPostProcessor, который сканирует компоненты с пользовательской аннотацией и добавляет их в зависимость источника данных боб. Это работает, но кажется, что это набор шаблонов для того, что кажется общей потребностью.
Существует ли более простой встроенный способ объявить, что компонент должен быть инициализирован перед конкретным автоматически настроенным компонентом (например, DataSource) без необходимости вручную определять этот целевой компонент или писать собственный постпроцессор?
Я ищу что-то, что работает декларативно, аналогично тому, как работает @DependsOn, но с предварительным условием – т.е. способ сказать «этот компонент должен быть готов до начала компонента X», а не изменять определение компонента X.
Почему я считаю это полезным
- Многие реальные приложения имеют установочные компоненты, которые должны запускаться перед инфраструктурными компонентами, такими как DataSource, JdbcTemplate и т. д.
- Автоконфигурация — это основная функция Spring Boot, и возможность влиять на порядок инициализации, не нарушая его, была бы очень полезна.
Я подумываю предложить такую функцию, как @RequiredBy, команде Spring, но сейчас мне нужно практическое решение. Если у вас есть опыт работы с подобными требованиями, поделитесь своим подходом.