@ConditionalOnThreading註解Spring
一、簡介
在這個快速教學中,我們將研究一個相對較新的 Spring Boot 註釋,稱為@ConditionalOnThreading
。
我們將了解此註釋的條件是什麼以及如何滿足它以建立 bean。
2. 條件註釋
儘管我們已經介紹了 Spring Boot 中的條件註釋,但還是值得再次簡要回顧它們。
條件註解提供了一種僅在滿足各種特定條件時才在BeanFactory
中註冊 Bean 的方法。開發人員使用Condition
介面為每個註解單獨定義這些條件。
Spring Boot 附帶了一系列針對常見用例的預先定義條件註解。常見的範例有@ ConditionalOnProperty
、@ ConditionalOnBean,
和ConditionalOnClass
。
3. @ConditionalOnThreading
理論
@ConditionalOnThreading
只是 Spring Boot 中另一個預先定義的條件註解。它是在 3.2 版本中添加的,該版本本身在創建本文時就是一個候選版本。為了儘早存取這個候選版本,我們應該使用專用的Spring
工件儲存庫。
僅當Spring
配置為在內部使用特定類型的執行緒時, @ConditionalOnThreading
註解才允許建立 bean 。線程類型意味著平台線程或虛擬線程。回想一下,自 Java 21 以來,我們已經能夠使用虛擬線程而不是平台線程。
因此,要將 Spring 配置為在內部使用虛擬線程,我們使用名為spring.threads.virtual.enabled
的屬性。如果此屬性為true
並且我們在 Java 21 或更高版本上運行,則@ConditionalOnThreading
註解將允許建立 bean。
4. 註解使用範例
現在讓我們嘗試編寫一些範例來演示此註釋的用例。假設我們有兩個用@ConditionalOnThreading
註解的 bean:
@Configuration
static class CurrentConfig {
@Bean
@ConditionalOnThreading(Threading.PLATFORM)
ThreadingType platformBean() {
return ThreadingType.PLATFORM;
}
@Bean
@ConditionalOnThreading(Threading.VIRTUAL)
ThreadingType virtualBean() {
return ThreadingType.VIRTUAL;
}
}
enum ThreadingType {
PLATFORM, VIRTUAL
}
因此,透過ConditionalOnThreading
註釋,我們將建立這兩個 bean 之一: platformBean
或virtualBean
。現在讓我們建立一些測試來檢查此註釋的工作原理:
ApplicationContextRunner applicationContextRunner = new ApplicationContextRunner()
.withUserConfiguration(CurrentConfig.class);
@Test
@EnabledForJreRange(max = JRE.JAVA_20)
public void whenJava20AndVirtualThreadsDisabled_thenThreadingIsPlatform() {
applicationContextRunner.withPropertyValues("spring.threads.virtual.enabled=false").run(context -> {
Assertions.assertThat(context.getBean(ThreadingType.class)).isEqualTo(ThreadingType.PLATFORM);
});
}
@Test
@EnabledForJreRange(min = JRE.JAVA_21)
public void whenJava21AndVirtualThreadsEnabled_thenThreadingIsVirtual() {
applicationContextRunner.withPropertyValues("spring.threads.virtual.enabled=true").run(context -> {
Assertions.assertThat(context.getBean(ThreadingType.class)).isEqualTo(ThreadingType.VIRTUAL);
});
}
@Test
@EnabledForJreRange(min = JRE.JAVA_21)
public void whenJava21AndVirtualThreadsDisabled_thenThreadingIsPlatform() {
applicationContextRunner.withPropertyValues("spring.threads.virtual.enabled=false").run(context -> {
Assertions.assertThat(context.getBean(ThreadingType.class)).isEqualTo(ThreadingType.PLATFORM);
});
}
在這裡,我們有一個ApplicationContextRunner
實例,它為測試建立一個輕量級應用程式上下文。我們用它來設定spring
屬性spring.threads.virtual.enabled
的值。我們也使用@EnabledForJreRange
註解對測試進行了註解。該註解允許我們僅在某些 Java 版本上執行測試。
我們可以注意到,要讓ThreadingType
bean 為Virtual
,我們必須將該屬性設為true
且至少為 Java 21。在其他情況下,註解條件為false
。
5. 結論
在這篇短文中,我們探索了一個新的 Spring 註釋 – @ConditionalOnThreading
。它作為 Spring Boot 3.2 的一部分提供。僅當 Spring 配置為透過屬性在內部使用特殊類型的執行緒時,此註解才允許建立 bean。
與往常一樣,本文的源代碼可以在 GitHub 上取得。