В Spring Framework 5 была добавлена возможность функциональной регистрации компонентов (бинов) в контексте приложения.
Функциональная регистрация компонентов позволяет создавать компоненты контекста приложения без применения рефлексии, благодаря чему можно сократить время запуска приложения.
Для функциональной регистрации компонентов достаточно создать класс, реализующий интерфейс ApplicationContextInitializer, в методе initialize которого происходит регистрация компонентов.
Описание и регистрация компонентов
Регистрация компонентов в контексте приложения выполняется при помощи вызова метода registerBean класса GenericApplicationContext.
Этот метод принимает аргументы:
- Имя компонента, может быть null
- Тип компонента, единственный обязательный аргумент, не может быть null
- Объект типа Supplier, создающий компонент, если требуются какие-либо дополнительные действия при его создании, может быть null
- Объекты типа BeanDefinitionCustomizer, если требуются дополнительные настройки компонента
Пример регистрации двух компонентов:
Обратите внимание, что тип компонента может быть как классом, так и интерфейсом.
Использование инициализаторов
В отличии от классов, отмеченных аннотациями Spring вроде @Configuration или @Component, классы-инициализаторы не подключаются автоматически и должны быть подключены вручную.
Допускается использование нескольких классов-инициализаторов контекста, что позволяет, например, разделять регистрацию компонентов в зависимости от их функциональности или использовать типы, имеющие ограниченную область видимости.
Первый вариант — при помощи файла META-INF/spring.factories:
Данный вариант работает и для интеграционных тестов. Если требуется использование нескольких классов-инициализаторов контекста, то их полные имена перечисляются через запятую.
Второй вариант — при помощи SpringApplicationBuilder:
Но в этом случае для интеграционных тестов потребуется указание класса-инициализатора: