成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

SpringBoot的條件裝配,徹底愛了!

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

[[406072]]

一、介紹

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

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

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

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

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

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

  • Profile
  • Conditional
  • ConditionalOnProperty

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

二、程序實踐

2.1、Profile

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

  • dev:開發環境
  • test:測試環境
  • production:生產環境

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

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

  1. /** 
  2.  * 上傳文件到本地 
  3.  * @since 2021-06-13 
  4.  */ 
  5. public class FileUploader implements Uploader { 
  6.  
  7.     @Override 
  8.     public String upload(File file) { 
  9.         //上傳文件到本地,并返回絕對路徑 
  10.         return null
  11.     } 
  1. /** 
  2.  * 上傳文件到OSS 
  3.  * @since 2021-06-13 
  4.  */ 
  5. public class OSSUploader implements Uploader { 
  6.  
  7.     @Override 
  8.     public String upload(File file) { 
  9.         //上傳文件到云端,并返回絕對路徑 
  10.         return null
  11.     } 

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

  1. @Configuration 
  2. public class AppConfig { 
  3.  
  4.     @Bean 
  5.     @Profile("dev"
  6.     public Uploader initFileUploader() { 
  7.         System.out.println("初始化一個上傳到本地的bean"); 
  8.         return new FileUploader(); 
  9.     } 
  10.  
  11.     @Bean 
  12.     @Profile("!dev"
  13.     public Uploader initOSSUploader() { 
  14.         System.out.println("初始化一個上傳到云端的bean"); 
  15.         return new OSSUploader(); 
  16.     } 
  17.  

3、最后,運行程序

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

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

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

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

  1. spring.profiles.active=dev 

2.2、Conditional

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

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

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

  1. public class SMSEnvCondition implements Condition { 
  2.  
  3.     @Override 
  4.     public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { 
  5.         return "true".equalsIgnoreCase(context.getEnvironment().getProperty("enable.sms")); 
  6.     } 

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

  1. @Component 
  2. @Conditional(SMSEnvCondition.class) 
  3. public class SendMessageService { 
  4.  
  5.     //... 

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

  1. 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注解為例,將上面的代碼改成如下方式即可實現按照條件進行加載。

  1. @Component 
  2. @ConditionalOnProperty(name="enable.sms", havingValue="true"
  3. public class SendMessageService { 
  4.  
  5.     //... 

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

是不是超級簡單~~~

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

  1. @Component 
  2. @ConditionalOnProperty(name = "file.storage", havingValue = "file", matchIfMissing = true
  3. public class FileUploader implements Uploader { 
  4.  
  5.     @Override 
  6.     public String upload(File file) { 
  7.         //上傳文件到本地,并返回絕對路徑 
  8.         return null
  9.     } 
  1. @Component 
  2. @ConditionalOnProperty(name = "file.storage", havingValue = "oss"
  3. public class OSSUploader implements Uploader { 
  4.  
  5.  
  6.     @Override 
  7.     public String upload(File file) { 
  8.         //上傳文件到云端,并返回絕對路徑 
  9.         return null
  10.     } 

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

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

三、小結

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

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

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

 

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

 

責任編輯:武曉燕 來源: Java極客技術
相關推薦

2020-10-15 14:50:24

寄存器CPU部件

2022-08-08 07:33:11

自動裝配Java容器

2020-11-03 09:14:21

高性能開發內存

2021-01-26 00:32:59

chrome插件瀏覽器

2021-04-02 10:07:19

Chrome瀏覽器插件

2024-05-29 07:47:30

SpringJava@Resource

2024-09-14 11:31:27

@AsyncSpring異步

2023-09-28 09:17:18

SpringBootBean

2023-11-01 09:07:01

Spring裝配源碼

2022-04-24 11:06:54

SpringBootjar代碼

2020-12-29 14:47:01

人工智能機器學習交通

2024-04-26 08:46:42

Spring自動裝配核心內容

2024-04-07 08:11:01

SpringHTTP瀏覽器

2025-04-28 04:55:00

2021-05-04 17:51:23

Linux Linux發行版操作系統

2011-03-25 13:40:28

Cacti安裝配置

2011-11-08 21:55:58

MRTG 配置

2011-03-30 15:05:40

MRTG安裝

2011-04-02 15:26:51

Cacti安裝

2010-02-23 11:10:42

CentOS PPPO
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美一区二区大片 | 国产中文区二幕区2012 | 国产成人在线视频免费观看 | 中文字幕一区二区视频 | 午夜a v电影 | 国产成人精品一区二区三区网站观看 | 毛片区| 97超碰站 | 久久久久久av | 亚洲性人人天天夜夜摸 | 91在线观看免费 | 亚洲午夜小视频 | 日韩av电影在线观看 | 欧美久久影院 | 免费一级毛片 | 激情欧美日韩一区二区 | 国产精品免费看 | 天天干狠狠干 | 91精品一区二区三区久久久久 | 欧美日韩视频在线第一区 | 一区二区三区在线观看视频 | 91在线导航| 欧美视频一区二区三区 | 国产精品免费一区二区三区四区 | 亚洲视频免费观看 | 久久久噜噜噜www成人网 | 日本久久精 | 国产精品久久亚洲7777 | 日韩免费毛片视频 | 精品国产乱码久久久久久老虎 | 涩涩视频网站在线观看 | 日韩在线高清 | 免费观看的av毛片的网站 | 亚洲第一av | 欧美成人一区二免费视频软件 | 国产99免费视频 | 国产精品久久精品 | 日本一级淫片免费啪啪3 | 成人在线电影在线观看 | 不用播放器看的av | 黄色一级片在线播放 |