Spring Framework: Функциональная регистрация компонентов

В Spring Framework 5 была добавлена возможность функциональной регистрации компонентов (бинов) в контексте приложения.

Функциональная регистрация компонентов позволяет создавать компоненты контекста приложения без применения рефлексии, благодаря чему можно сократить время запуска приложения.

Для функциональной регистрации компонентов достаточно создать класс, реализующий интерфейс ApplicationContextInitializer, в методе initialize которого происходит регистрация компонентов.

Описание и регистрация компонентов

Регистрация компонентов в контексте приложения выполняется при помощи вызова метода registerBean класса GenericApplicationContext.

Этот метод принимает аргументы:

  • Имя компонента, может быть null
  • Тип компонента, единственный обязательный аргумент, не может быть null
  • Объект типа Supplier, создающий компонент, если требуются какие-либо дополнительные действия при его создании, может быть null
  • Объекты типа BeanDefinitionCustomizer, если требуются дополнительные настройки компонента

Пример регистрации двух компонентов:

Обратите внимание, что тип компонента может быть как классом, так и интерфейсом.

Использование инициализаторов

В отличии от классов, отмеченных аннотациями Spring вроде @Configuration или @Component, классы-инициализаторы не подключаются автоматически и должны быть подключены вручную.

Допускается использование нескольких классов-инициализаторов контекста, что позволяет, например, разделять регистрацию компонентов в зависимости от их функциональности или использовать типы, имеющие ограниченную область видимости.

Первый вариант — при помощи файла META-INF/spring.factories:

Данный вариант работает и для интеграционных тестов. Если требуется использование нескольких классов-инициализаторов контекста, то их полные имена перечисляются через запятую.

Второй вариант — при помощи SpringApplicationBuilder:

Но в этом случае для интеграционных тестов потребуется указание класса-инициализатора:

Полезные ссылки