Автор оригинала: Loredana Crusoveanu.
1. Обзор
Spring 5 поставляется с поддержкой регистрации функциональных компонентов в контексте приложения.
Проще говоря, это можно сделать с помощью перегруженных версий нового registermbean() метода , определенного в классе GenericApplicationContext|/.
Давайте рассмотрим несколько примеров этой функциональности в действии.
2. Зависимости Maven
Самый быстрый способ настроить проект Spring 5 -это использовать Spring Boot , добавив зависимость spring-boot-starter-parent в pom.xml:
org.springframework.boot spring-boot-starter-parent 2.4.0
Нам также нужны spring-boot-starter-web и spring-boot-starter-test для нашего примера, чтобы использовать контекст веб-приложения в тесте JUnit :
org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-test test
Конечно, Spring Boot не является необходимым для того, чтобы использовать новый функциональный способ регистрации компонента. Мы также могли бы просто добавить зависимость spring-core напрямую:
org.springframework spring-core 5.3.3
3. Регистрация функциональных компонентов
API registerBean() может принимать в качестве параметров два типа функциональных интерфейсов :
- a Поставщик аргумент используется для создания объекта
- BeanDefinitionCustomizer vararg , который может использоваться для предоставления одного или нескольких лямбда-выражений для настройки BeanDefinition ; этот интерфейс имеет один customize() метод
Во-первых, давайте создадим очень простое определение класса, которое мы будем использовать для создания компонентов:
public class MyService { public int getRandomNumber() { return new Random().nextInt(10); } }
Давайте также добавим класс @SpringBootApplication , который мы можем использовать для запуска теста JUnit :
@SpringBootApplication public class Spring5Application { public static void main(String[] args) { SpringApplication.run(Spring5Application.class, args); } }
Затем мы можем настроить наш тестовый класс с помощью аннотации @SpringBootTest для создания экземпляра GenericWebApplicationContext :
@RunWith(SpringRunner.class) @SpringBootTest(classes = Spring5Application.class) public class BeanRegistrationIntegrationTest { @Autowired private GenericWebApplicationContext context; //... }
В вашем примере мы используем тип GenericWebApplicationContext , но любой тип контекста приложения можно использовать таким же образом для регистрации компонента.
Давайте посмотрим, как мы можем зарегистрировать боб, используя лямбда-выражение для создания экземпляра :
context.registerBean(MyService.class, () -> new MyService());
Давайте убедимся, что теперь мы можем извлечь боб и использовать его:
MyService myService = (MyService) context.getBean("com.baeldung.functional.MyService"); assertTrue(myService.getRandomNumber() < 10);
В этом примере мы видим, что если имя компонента явно не определено, оно будет определено из имени класса в нижнем регистре. Тот же метод, описанный выше, также можно использовать с явным именем компонента:
context.registerBean("mySecondService", MyService.class, () -> new MyService());
Далее давайте посмотрим, как мы можем зарегистрировать компонент, добавив лямбда-выражение для его настройки :
context.registerBean("myCallbackService", MyService.class, () -> new MyService(), bd -> bd.setAutowireCandidate(false));
Этот аргумент является обратным вызовом, который мы можем использовать для установки свойств компонента, таких как autowire-candidate flag или primary flag.
4. Заключение
В этом кратком руководстве мы рассмотрели, как мы можем использовать функциональный способ регистрации компонента.
Исходный код для примера можно найти на GitHub .