亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

SpringBoot中@Conditional注解的介紹及實踐

 更新時間:2025年03月25日 08:41:50   作者:拾荒的小海螺  
在 Spring Boot 中,@Conditional 注解用于實現(xiàn) 條件化 Bean 裝配,本文將詳細(xì)介紹 @Conditional 相關(guān)的注解,并結(jié)合實際應(yīng)用示例講解其使用方式,感興趣的小伙伴可以了解下

1、簡述

在 Spring Boot 中,@Conditional 注解用于實現(xiàn) 條件化 Bean 裝配,即根據(jù)特定的條件來決定是否加載某個 Bean。它是 Spring 框架中的一個擴展機制,常用于實現(xiàn)模塊化、可配置的組件加載。

本文將詳細(xì)介紹 @Conditional 相關(guān)的注解,包括 @ConditionalOnClass、@ConditionalOnMissingBean、@ConditionalOnProperty 等,并結(jié)合實際應(yīng)用示例講解其使用方式。

2、@Conditional 注解概述

@Conditional 是 Spring 4 引入的條件裝配注解,它可以根據(jù)外部環(huán)境或配置的狀態(tài),決定是否創(chuàng)建 Bean。

其核心接口是:

public interface Condition {
    boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);
}

任何實現(xiàn) Condition 接口的類,都可以用于自定義條件判斷。

@Configuration
public class MyConfig {

    @Bean
    @Conditional(MyCondition.class) 
    public MyService myService() {
        return new MyService();
    }
}

其中 MyCondition.class 需要實現(xiàn) Condition 接口,并提供判斷邏輯。

3、Spring Boot 內(nèi)置 @Conditional 相關(guān)注解

Spring Boot 提供了一些常見的 @Conditional 注解,簡化了條件判斷的邏輯:

注解作用
@ConditionalOnClass類路徑下存在某個類時,才加載該 Bean
@ConditionalOnMissingClass類路徑下不存在某個類時,才加載該 Bean
@ConditionalOnBean當(dāng)容器中存在指定 Bean 時,才加載當(dāng)前 Bean
@ConditionalOnMissingBean當(dāng)容器中不存在指定 Bean 時,才加載當(dāng)前 Bean
@ConditionalOnProperty當(dāng)指定的配置屬性滿足條件時,才加載當(dāng)前 Bean
@ConditionalOnExpression當(dāng)指定的 SpEL 表達(dá)式為 true 時,才加載當(dāng)前 Bean
@ConditionalOnJava當(dāng) Java 版本符合要求時,才加載當(dāng)前 Bean
@ConditionalOnWebApplication當(dāng)應(yīng)用是 Web 應(yīng)用時,才加載當(dāng)前 Bean
@ConditionalOnNotWebApplication當(dāng)應(yīng)用不是 Web 應(yīng)用時,才加載當(dāng)前 Bean

3.1 @ConditionalOnClass 使用示例(類路徑檢測)

我們希望在 Spring Boot 項目中,當(dāng)類路徑下存在 com.example.MyLibrary 這個類時,才注冊 MyService 這個 Bean。

import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyAutoConfiguration {

    @Bean
    @ConditionalOnClass(name = "com.example.MyLibrary")
    public MyService myService() {
        return new MyService();
    }
}

解釋:

  • 如果 com.example.MyLibrary 存在,則 MyService 會被創(chuàng)建。
  • 如果 com.example.MyLibrary 不存在,則 MyService 不會被加載。

3.2 @ConditionalOnMissingBean(Bean 缺失時加載)

如果用戶沒有手動定義 MyService,則提供一個默認(rèn)實現(xiàn)。

import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyAutoConfiguration {

    @Bean
    @ConditionalOnMissingBean
    public MyService myService() {
        return new MyService("Default Implementation");
    }
}

解釋:

  • 如果 Spring 容器中已經(jīng)存在 MyService,則不會創(chuàng)建新的 Bean。
  • 只有當(dāng) MyService 不存在時,才會注冊默認(rèn)實現(xiàn)。

3.3 @ConditionalOnProperty(基于配置項條件加載 Bean)

我們希望 MyService 只有在 app.feature.enabled=true 時才被創(chuàng)建。

import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyAutoConfiguration {

    @Bean
    @ConditionalOnProperty(name = "app.feature.enabled", havingValue = "true", matchIfMissing = false)
    public MyService myService() {
        return new MyService();
    }
}

解釋:

  • 如果 application.properties 中包含 app.feature.enabled=true,則 MyService 會被創(chuàng)建。
  • 如果 app.feature.enabled=false,或者該屬性未定義,則 MyService 不會被加載。

在 application.properties 中啟用:

app.feature.enabled=true

3.4 @ConditionalOnBean(存在特定 Bean 時才加載)

當(dāng) UserService 存在時,才創(chuàng)建 OrderService。

import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class OrderServiceConfiguration {

    @Bean
    @ConditionalOnBean(UserService.class)
    public OrderService orderService() {
        return new OrderService();
    }
}

解釋:

  • 如果 UserService 存在,則 OrderService 也會被創(chuàng)建。
  • 如果 UserService 不存在,則 OrderService 不會被加載。

3.5 @ConditionalOnExpression(基于 SpEL 表達(dá)式加載)

當(dāng) server.port 大于 8080 時,才創(chuàng)建 AdvancedService。

import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AdvancedConfig {

    @Bean
    @ConditionalOnExpression("#{T(java.lang.Integer).parseInt('${server.port:8080}') > 8080}")
    public AdvancedService advancedService() {
        return new AdvancedService();
    }
}

解釋:

server.port > 8080 時,AdvancedService 會被加載。

其他情況下,不會創(chuàng)建該 Bean。

在 application.properties 中配置:

server.port=9090

3.6 結(jié)合 @ConditionalOnClass 實現(xiàn) Starter 組件的熱拔插

我們要創(chuàng)建一個 Spring Boot Starter 組件,如果用戶的 classpath 下存在 RedisTemplate,則自動加載 Redis 相關(guān)的 Bean。

步驟:

創(chuàng)建 Starter 組件

@Configuration
@ConditionalOnClass(RedisTemplate.class)
public class RedisAutoConfiguration {

    @Bean
    @ConditionalOnMissingBean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);
        return template;
    }
}

應(yīng)用使用 Starter

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

如果引入 Redis 依賴,RedisAutoConfiguration 會自動生效。

如果不引入 Redis 依賴,則 RedisTemplate 不會被創(chuàng)建。

4、總結(jié)

  • @Conditional 及其衍生注解使 Spring Boot 具備了自動配置和熱拔插的能力。
  • @ConditionalOnClass 可用于判斷某個類是否存在,常用于 Starter 組件的自動裝配。
  • @ConditionalOnProperty 適用于基于配置的條件加載,增強靈活性。
  • @ConditionalOnBean 和 @ConditionalOnMissingBean 適用于組件依賴管理。

合理使用這些注解,可以構(gòu)建更加模塊化、靈活、可配置的 Spring Boot 應(yīng)用。

以上就是SpringBoot中@Conditional注解的介紹及實踐的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot @Conditional注解的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java?Exception異常全方面分析

    Java?Exception異常全方面分析

    異常就是不正常,比如當(dāng)我們身體出現(xiàn)了異常我們會根據(jù)身體情況選擇喝開水、吃藥、看病、等?異常處理方法。?java異常處理機制是我們java語言使用異常處理機制為程序提供了錯誤處理的能力,程序出現(xiàn)的錯誤,程序可以安全的退出,以保證程序正常的運行等
    2022-03-03
  • Java?awt-對話框簡單實現(xiàn)方式

    Java?awt-對話框簡單實現(xiàn)方式

    這篇文章主要介紹了Java?awt-對話框簡單實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • jmeter實現(xiàn)接口關(guān)聯(lián)的兩種方式(正則表達(dá)式提取器和json提取器)

    jmeter實現(xiàn)接口關(guān)聯(lián)的兩種方式(正則表達(dá)式提取器和json提取器)

    Jmeter用于接口測試時,后一個接口經(jīng)常需要用到前一次接口返回的結(jié)果,本文主要介紹了jmeter實現(xiàn)接口關(guān)聯(lián)的兩種方式,感興趣的小伙伴們可以參考一下
    2021-11-11
  • spring-boot-autoconfigure模塊用法詳解

    spring-boot-autoconfigure模塊用法詳解

    autoconfigure就是自動配置的意思,spring-boot通過spring-boot-autoconfigure體現(xiàn)了"約定優(yōu)于配置"這一設(shè)計原則,而spring-boot-autoconfigure主要用到了spring.factories和幾個常用的注解條件來實現(xiàn)自動配置,思路很清晰也很簡單,感興趣的朋友跟隨小編一起看看吧
    2022-11-11
  • 利用Java+Selenium+OpenCV模擬實現(xiàn)網(wǎng)頁滑動驗證

    利用Java+Selenium+OpenCV模擬實現(xiàn)網(wǎng)頁滑動驗證

    目前很多網(wǎng)頁都有滑動驗證,目的就是防止不良爬蟲扒他們網(wǎng)站的數(shù)據(jù)。本文將介紹通過Java Selenium OpenCV解決網(wǎng)頁滑塊驗證,需要的可以參考一下
    2022-01-01
  • Java9 集合工廠方法解析

    Java9 集合工廠方法解析

    這篇文章主要介紹了Java9 集合工廠方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • SpringCloud Zuul網(wǎng)關(guān)功能實現(xiàn)解析

    SpringCloud Zuul網(wǎng)關(guān)功能實現(xiàn)解析

    這篇文章主要介紹了SpringCloud Zuul網(wǎng)關(guān)功能實現(xiàn)解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • 快速上手Java單元測試框架JUnit5

    快速上手Java單元測試框架JUnit5

    今天給大家?guī)淼氖顷P(guān)于Java單元測試的相關(guān)知識,文章圍繞著Java單元測試框架JUnit5展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • JPA如何使用findBy方法自定義查詢

    JPA如何使用findBy方法自定義查詢

    這篇文章主要介紹了JPA如何使用findBy方法自定義查詢,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java中RocketMq的消費方式詳解

    Java中RocketMq的消費方式詳解

    這篇文章主要介紹了Java中RocketMq的消費方式詳解,RocketMQ的消費方式都是基于拉模式拉取消息的,而在這其中有一種長輪詢機制(對普通輪詢的一種優(yōu)化),來平衡上面Push/Pull模型的各自缺點,需要的朋友可以參考下
    2023-10-10

最新評論