日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

SpringBoot 中的 3 种条件装配!

發布時間:2025/3/11 javascript 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SpringBoot 中的 3 种条件装配! 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、介紹

在實際的項目開發中,我們往往需要根據不同的環境做出不同的配置,例如:在開發環境下,我們會使用內存數據庫以便快速啟動服務并進行開發調試,在test環境、生產環境,會使用對應環境的數據庫。

如果我們的應用程序可以根據自身的環境做一些這樣的適配,那么我們的程序開發無疑將更加靈活、高效。

在過去的應用程序開發中,我們常常會將這些環境變量寫在某個指定的配置文件中,每次服務器啟動的時候,會讀取服務器中指定的配置文件,從而實現根據不同的環境,應用程序能做出對應的適配。

但是這樣的工作,對于運維來說,非常苦逼,尤其是應用程序到達50個以上的時候,會非常不好維護,每次上線改配置,全靠人肉,想想都覺得反人類~

當我們在使用SpringBoot來開發應用程序的時候,這些工作量將大大簡化。

SpringBoot為開發者提供了三種可選的條件裝配方式。

  • Profile

  • Conditional

  • ConditionalOnProperty

下面,我們一起來了解一下具體的應用實踐。

二、程序實踐

2.1、Profile

SpringBoot 為應用程序提供了Profile這一概念,用來表示不同的環境。例如,我們分別定義開發、測試和生產這3個環境

  • dev:開發環境

  • test:測試環境

  • production:生產環境

以上傳文件為例,在開發環境下,我們將文件上傳到本地,而在測試環境、生產環境,我們將文件上傳到云端服務商。

1、首先編寫兩套上傳服務

/***?上傳文件到本地*?@since?2021-06-13*/ public?class?FileUploader?implements?Uploader?{@Overridepublic?String?upload(File?file)?{//上傳文件到本地,并返回絕對路徑return?null;} } /***?上傳文件到OSS*?@since?2021-06-13*/ public?class?OSSUploader?implements?Uploader?{@Overridepublic?String?upload(File?file)?{//上傳文件到云端,并返回絕對路徑return?null;} }

2、然后編寫一個服務配置類,根據不同的環境,創建不同的實現類

@Configuration public?class?AppConfig?{@Bean@Profile("dev")public?Uploader?initFileUploader()?{System.out.println("初始化一個上傳到本地的bean");return?new?FileUploader();}@Bean@Profile("!dev")public?Uploader?initOSSUploader()?{System.out.println("初始化一個上傳到云端的bean");return?new?OSSUploader();}}

3、最后,運行程序

在運行程序時,加上JVM參數-Dspring.profiles.active=dev就可以指定以dev環境啟動。

如果當前的Profile設置為dev,則Spring容器會調用initFileUploader()創建FileUploader,否則,調用initOSSUploader()創建OSSUploader。

注意:@Profile("!dev")表示非dev環境。

當然,你還可以在application.properties文件中加上如下配置,一樣可以指定環境進行運行。

spring.profiles.active=dev

2.2、Conditional

除了可以根據@Profile條件來決定是否創建某個Bean外,Spring還可以根據@Conditional決定是否創建某個Bean。

以發短信為例,在生產環境,我們會提供發短信服務,而在其他環境,我們不會向運營商發短信。

1、創建一個條件配置類SMSEnvCondition

public?class?SMSEnvCondition?implements?Condition?{@Overridepublic?boolean?matches(ConditionContext?context,?AnnotatedTypeMetadata?metadata)?{return?"true".equalsIgnoreCase(context.getEnvironment().getProperty("enable.sms"));} }

2、創建一個發短信的服務

@Component @Conditional(SMSEnvCondition.class) public?class?SendMessageService?{//... }

3、在application.properties文件中,添加配置變量enable.sms

enable.sms=true

當enable.sms為true的時候,會創建SendMessageService對象,否則不創建。

2.3、ConditionalOnProperty

Spring提供的條件裝配@Conditional,靈活性非常強,但是具體判斷邏輯還需要我們自己實現,比較麻煩。

實際上,Spring Boot為開發者提供了很多使用起來更簡單的條件注解,例如:

  • ConditionalOnProperty:如果有指定的配置,條件生效

  • ConditionalOnBean:如果有指定的Bean,條件生效

  • ConditionalOnMissingBean:如果沒有指定的Bean,條件生效

  • ConditionalOnMissingClass:如果沒有指定的Class,條件生效

  • ConditionalOnWebApplication:在Web環境中條件生效

  • ConditionalOnExpression:根據表達式判斷條件是否生效

我們以最常用的@ConditionalOnProperty注解為例,將上面的代碼改成如下方式即可實現按照條件進行加載。

@Component @ConditionalOnProperty(name="enable.sms",?havingValue="true") public?class?SendMessageService?{//... }

當enable.sms的值等于true時,會實例化SendMessageService對象;反之,不會創建對象。

是不是超級簡單~~~

當然@ConditionalOnProperty的參數還不僅僅限于此,以上面上傳文件為例,在開發環境,我們總是上傳到本地;在測試環境、生產環境,我們將文件上傳到云端,改造過程如下:

@Component @ConditionalOnProperty(name?=?"file.storage",?havingValue?=?"file",?matchIfMissing?=?true) public?class?FileUploader?implements?Uploader?{@Overridepublic?String?upload(File?file)?{//上傳文件到本地,并返回絕對路徑return?null;} } @Component @ConditionalOnProperty(name?=?"file.storage",?havingValue?=?"oss") public?class?OSSUploader?implements?Uploader?{@Overridepublic?String?upload(File?file)?{//上傳文件到云端,并返回絕對路徑return?null;} }

當file.storage配置值為file,會加載FileUploader類;當file.storage配置值為oss,會加載OSSUploader類。

其中@ConditionalOnProperty中的matchIfMissing參數表示,當沒有找到對應配置參數時,會默認加載當前類,也就是FileUploader類。

三、小結

雖然,@Profile、@Conditional、@ConditionalOnProperty三個注解都能實現按照條件進行適配,但是@Profile注解控制比較粗糙,很難實現精細化控制。

在實際的使用過程中,使用最多的是@Conditional、@ConditionalOnProperty,可以很靈活的實現條件裝配。

其中,@ConditionalOnProperty是@Conditional的一種具體擴展實現,提供了很多非常實用的操作,在使用中,推薦大家使用@ConditionalOnProperty。

如果不夠,可以根據@Conditional條件裝配,編寫一套控制開關實現類。

四、參考

1、廖雪峰-使用條件裝配

往期推薦

SpringBoot 過濾器、攔截器、監聽器對比及使用場景!


Spring為什么建議構造器注入?


11個小技巧,玩轉Spring!



總結

以上是生活随笔為你收集整理的SpringBoot 中的 3 种条件装配!的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。