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-web
和spring-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上找到。