Рубрики
Без рубрики

Весна 5 Функциональная Регистрация Бобов

Смотрите, как зарегистрировать бобы с использованием функционального подхода в Spring 5.

Автор оригинала: 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 .