Spring 5功能性Bean註冊

1.概述

Spring 5附帶了對在應用程序上下文中進行功能性bean註冊的支持。

簡而言之,可以通過GenericApplicationContext類中定義的新registerBean()方法的重載版本來完成此操作

讓我們看一下實際使用此功能的一些示例。

2. Maven依賴

設置Spring 5項目的最快方法是通過將spring-boot-starter-parent依賴項添加到pom.xml:來使用Spring Boot pom.xml:

<parent>

 <groupId>org.springframework.boot</groupId>

 <artifactId>spring-boot-starter-parent</artifactId>

 <version>2.2.2.RELEASE</version>

 </parent>

對於我們的示例,我們還需要spring-boot-starter-webspring-boot-starter-test ,以便在JUnit測試中使用Web應用程序上下文:

<dependency>

 <groupId>org.springframework.boot</groupId>

 <artifactId>spring-boot-starter-web</artifactId>

 </dependency>

 <dependency>

 <groupId>org.springframework.boot</groupId>

 <artifactId>spring-boot-starter-test</artifactId>

 <scope>test</scope>

 </dependency>

當然,為了使用新的功能方式註冊Bean, Spring Boot不是必需的。我們還可以直接添加spring-core依賴項:

<dependency>

 <groupId>org.springframework</groupId>

 <artifactId>spring-core</artifactId>

 <version>5.2.2.RELEASE</version>

 </dependency>

3.功能性Bean註冊

registerBean() API可以接收兩種類型的功能接口作為參數

  • 用於創建對象Supplier參數
  • BeanDefinitionCustomizer vararg ,可用於提供一個或多個lambda表達式以自定義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。

讓我們看看如何使用lambda表達式註冊實例的bean

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

讓我們驗證一下我們現在可以檢索並使用它了:

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



 assertTrue(myService.getRandomNumber() < 10);

在此示例中,我們可以看到,如果未顯式定義Bean名稱,則將由該類的小寫名稱來確定。上面的相同方法也可以與顯式bean名稱一起使用:

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

接下來,讓我們看看如何通過添加lambda表達式對其進行自定義來註冊bean

context.registerBean("myCallbackService", MyService.class,

 () -> new MyService(), bd -> bd.setAutowireCandidate(false));

此參數是一個回調,可用於設置bean屬性,例如autowire-candidate標誌或primary標誌。

4。結論

在本快速教程中,我們已經看到瞭如何使用註冊Bean的功能方法。

該示例的源代碼可以在GitHub上找到