Регистрация функциональных бинов Spring 5

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

1. обзор

Spring 5 поставляется с поддержкой регистрации функциональных компонентов в контексте приложения.

Проще говоря,this can be done through overloaded versions of a new registerBean() method определен в классеGenericApplicationContext.

Давайте посмотрим на несколько примеров этой функции в действии.

2. Maven Зависимости

Самый быстрый способ настроить проектSpring 5 - использоватьSpring Boot, добавив зависимостьspring-boot-starter-parent кpom.xml:


    org.springframework.boot
    spring-boot-starter-parent
    2.0.0.RELEASE

Нам также нужны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 не требуется для использования нового функционального способа регистрации bean-компонента. Мы также могли бы просто добавить зависимостьspring-core напрямую:


    org.springframework
    spring-core
    5.0.2.RELEASE

3. Функциональная регистрация компонентов

The registerBean() API can receive two types of functional interfaces as parameters:

  • a Supplier argument используется для создания объекта

  • a BeanDefinitionCustomizer vararg, который может использоваться для предоставления одного или нескольких лямбда-выражений для настройкиBeanDefinition; этот интерфейс имеет единственный методcustomize()

Во-первых, давайте создадим очень простое определение класса, которое мы будем использовать для создания bean-компонентов:

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, но любой тип контекста приложения может использоваться таким же образом для регистрации bean-компонента.

Посмотрим, какwe can register a bean using a lambda expression for creating the instance:

context.registerBean(MyService.class, () -> new MyService());

Давайте проверим, что теперь мы можем получить компонент и использовать его:

MyService myService = (MyService) context.getBean("com.example.functional.MyService");

assertTrue(myService.getRandomNumber() < 10);

В этом примере мы видим, что если имя компонента не определено явно, оно будет определяться из имени класса в нижнем регистре. Тот же самый метод выше может также использоваться с явным именем компонента:

context.registerBean("mySecondService", MyService.class, () -> new MyService());

Затем давайте посмотрим, какwe can register a bean by adding a lambda expression to customize it:

context.registerBean("myCallbackService", MyService.class,
  () -> new MyService(), bd -> bd.setAutowireCandidate(false));

Этот аргумент является обратным вызовом, который мы можем использовать для установки свойств компонента, таких как флагautowire-candidate или флагprimary.

4. Заключение

В этом кратком руководстве мы увидели, как можно использовать функциональный способ регистрации bean-компонента.

Исходный код для примера можно найтиover on GitHub.