知識庫 / Spring RSS 訂閱

@ConditionalOnThreading 註解 Spring 多線程支持

Spring
HongKong
9
11:22 AM · Dec 06 ,2025

1. 簡介

在本快速教程中,我們將深入瞭解一個相對較新的 Spring Boot 註解:<em >@ConditionalOnThreading</em>

我們將發現該註解的條件是什麼,以及如何滿足該條件以創建 Bean。

2. 條件註解

雖然我們之前已經涵蓋了 Spring Boot 中的條件註解,但還是值得簡要回顧一下。

條件註解提供了一種機制,可以在滿足特定條件下僅在 BeanFactory 中註冊一個 Bean。開發者通過使用 Condition 接口為每個註解定義這些條件。

Spring Boot 提供了許多預定義的條件註解,用於常見的用例。常見的例子包括 @ConditionalOnProperty, @ConditionalOnBean, 和 @ConditionalOnClass

3. <em @ConditionalOnThreading</em> 理論

<em @ConditionalOnThreading</em> 只是 Spring Boot 中一種預定義的條件註解。它是在 3.2 版本中添加的,當時該版本還處於候選發佈階段。為了獲得該候選發佈版本的早期訪問權限,我們應該使用專門的 <em Spring 倉庫。

<em @ConditionalOnThreading</em> 註解允許僅在 Spring 配置為內部使用特定類型的線程時才創建 Bean。這裏的“線程類型”指的是平台線程或虛擬線程。 值得注意的是,自 Java 21 以來,我們就可以使用虛擬線程而不是平台線程。

要配置 Spring 內部使用虛擬線程,我們使用名為 <em spring.threads.virtual.enabled</em> 的屬性。如果此屬性設置為 <em true</em> 並且我們正在運行 Java 21 或更高版本,則 <em @ConditionalOnThreading</em> 註解將允許創建 Bean。

4. 註解使用示例

現在我們來編寫一些示例,以演示該註解的使用用例。假設我們有兩個 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 註解——。它作為 Spring Boot 3.2 的一部分提供,允許通過配置屬性,使 Spring 內部使用特定類型的線程。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.