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.