自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

開發(fā) 架構(gòu)
在實(shí)際的項(xiàng)目開發(fā)中,我們往往需要根據(jù)不同的環(huán)境做出不同的配置,例如:在開發(fā)環(huán)境下,我們會(huì)使用內(nèi)存數(shù)據(jù)庫(kù)以便快速啟動(dòng)服務(wù)并進(jìn)行開發(fā)調(diào)試,在test環(huán)境、生產(chǎn)環(huán)境,會(huì)使用對(duì)應(yīng)環(huán)境的數(shù)據(jù)庫(kù)。

[[406072]]

一、介紹

在實(shí)際的項(xiàng)目開發(fā)中,我們往往需要根據(jù)不同的環(huán)境做出不同的配置,例如:在開發(fā)環(huán)境下,我們會(huì)使用內(nèi)存數(shù)據(jù)庫(kù)以便快速啟動(dòng)服務(wù)并進(jìn)行開發(fā)調(diào)試,在test環(huán)境、生產(chǎn)環(huán)境,會(huì)使用對(duì)應(yīng)環(huán)境的數(shù)據(jù)庫(kù)。

如果我們的應(yīng)用程序可以根據(jù)自身的環(huán)境做一些這樣的適配,那么我們的程序開發(fā)無(wú)疑將更加靈活、高效。

在過(guò)去的應(yīng)用程序開發(fā)中,我們常常會(huì)將這些環(huán)境變量寫在某個(gè)指定的配置文件中,每次服務(wù)器啟動(dòng)的時(shí)候,會(huì)讀取服務(wù)器中指定的配置文件,從而實(shí)現(xiàn)根據(jù)不同的環(huán)境,應(yīng)用程序能做出對(duì)應(yīng)的適配。

但是這樣的工作,對(duì)于運(yùn)維來(lái)說(shuō),非??啾?,尤其是應(yīng)用程序到達(dá)50個(gè)以上的時(shí)候,會(huì)非常不好維護(hù),每次上線改配置,全靠人肉,想想都覺得反人類~

當(dāng)我們?cè)谑褂肧pringBoot來(lái)開發(fā)應(yīng)用程序的時(shí)候,這些工作量將大大簡(jiǎn)化。

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

  • Profile
  • Conditional
  • ConditionalOnProperty

下面,我們一起來(lái)了解一下具體的應(yīng)用實(shí)踐。

二、程序?qū)嵺`

2.1、Profile

SpringBoot 為應(yīng)用程序提供了Profile這一概念,用來(lái)表示不同的環(huán)境。例如,我們分別定義開發(fā)、測(cè)試和生產(chǎn)這3個(gè)環(huán)境

  • dev:開發(fā)環(huán)境
  • test:測(cè)試環(huán)境
  • production:生產(chǎn)環(huán)境

以上傳文件為例,在開發(fā)環(huán)境下,我們將文件上傳到本地,而在測(cè)試環(huán)境、生產(chǎn)環(huán)境,我們將文件上傳到云端服務(wù)商。

1、首先編寫兩套上傳服務(wù)

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

2、然后編寫一個(gè)服務(wù)配置類,根據(jù)不同的環(huán)境,創(chuàng)建不同的實(shí)現(xiàn)類

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

3、最后,運(yùn)行程序

在運(yùn)行程序時(shí),加上JVM參數(shù)-Dspring.profiles.active=dev就可以指定以dev環(huán)境啟動(dòng)。

如果當(dāng)前的Profile設(shè)置為dev,則Spring容器會(huì)調(diào)用initFileUploader()創(chuàng)建FileUploader,否則,調(diào)用initOSSUploader()創(chuàng)建OSSUploader。

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

當(dāng)然,你還可以在application.properties文件中加上如下配置,一樣可以指定環(huán)境進(jìn)行運(yùn)行。

  1. spring.profiles.active=dev 

2.2、Conditional

除了可以根據(jù)@Profile條件來(lái)決定是否創(chuàng)建某個(gè)Bean外,Spring還可以根據(jù)@Conditional決定是否創(chuàng)建某個(gè)Bean。

以發(fā)短信為例,在生產(chǎn)環(huán)境,我們會(huì)提供發(fā)短信服務(wù),而在其他環(huán)境,我們不會(huì)向運(yùn)營(yíng)商發(fā)短信。

1、創(chuàng)建一個(gè)條件配置類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、創(chuàng)建一個(gè)發(fā)短信的服務(wù)

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

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

  1. enable.sms=true 

當(dāng)enable.sms為true的時(shí)候,會(huì)創(chuàng)建SendMessageService對(duì)象,否則不創(chuàng)建。

2.3、ConditionalOnProperty

Spring提供的條件裝配@Conditional,靈活性非常強(qiáng),但是具體判斷邏輯還需要我們自己實(shí)現(xiàn),比較麻煩。

實(shí)際上,Spring Boot為開發(fā)者提供了很多使用起來(lái)更簡(jiǎn)單的條件注解,例如:

  • ConditionalOnProperty:如果有指定的配置,條件生效
  • ConditionalOnBean:如果有指定的Bean,條件生效
  • ConditionalOnMissingBean:如果沒有指定的Bean,條件生效
  • ConditionalOnMissingClass:如果沒有指定的Class,條件生效
  • ConditionalOnWebApplication:在Web環(huán)境中條件生效
  • ConditionalOnExpression:根據(jù)表達(dá)式判斷條件是否生效

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

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

當(dāng)enable.sms的值等于true時(shí),會(huì)實(shí)例化SendMessageService對(duì)象;反之,不會(huì)創(chuàng)建對(duì)象。

是不是超級(jí)簡(jiǎn)單~~~

當(dāng)然@ConditionalOnProperty的參數(shù)還不僅僅限于此,以上面上傳文件為例,在開發(fā)環(huán)境,我們總是上傳到本地;在測(cè)試環(huán)境、生產(chǎn)環(huán)境,我們將文件上傳到云端,改造過(guò)程如下:

  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.         //上傳文件到本地,并返回絕對(duì)路徑 
  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.         //上傳文件到云端,并返回絕對(duì)路徑 
  9.         return null
  10.     } 

當(dāng)file.storage配置值為file,會(huì)加載FileUploader類;當(dāng)file.storage配置值為oss,會(huì)加載OSSUploader類。

其中@ConditionalOnProperty中的matchIfMissing參數(shù)表示,當(dāng)沒有找到對(duì)應(yīng)配置參數(shù)時(shí),會(huì)默認(rèn)加載當(dāng)前類,也就是FileUploader類。

三、小結(jié)

雖然,@Profile、@Conditional、@ConditionalOnProperty三個(gè)注解都能實(shí)現(xiàn)按照條件進(jìn)行適配,但是@Profile注解控制比較粗糙,很難實(shí)現(xiàn)精細(xì)化控制。

在實(shí)際的使用過(guò)程中,使用最多的是@Conditional、@ConditionalOnProperty,可以很靈活的實(shí)現(xiàn)條件裝配。

其中,@ConditionalOnProperty是@Conditional的一種具體擴(kuò)展實(shí)現(xiàn),提供了很多非常實(shí)用的操作,在使用中,推薦大家使用@ConditionalOnProperty。

 

如果不夠,可以根據(jù)@Conditional條件裝配,編寫一套控制開關(guān)實(shí)現(xiàn)類。

 

責(zé)任編輯:武曉燕 來(lái)源: Java極客技術(shù)
相關(guān)推薦

2020-10-15 14:50:24

寄存器CPU部件

2022-08-08 07:33:11

自動(dòng)裝配Java容器

2020-11-03 09:14:21

高性能開發(fā)內(nèi)存

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

人工智能機(jī)器學(xué)習(xí)交通

2024-04-07 08:11:01

SpringHTTP瀏覽器

2024-04-26 08:46:42

Spring自動(dòng)裝配核心內(nèi)容

2025-04-28 04:55:00

2021-05-04 17:51:23

Linux Linux發(fā)行版操作系統(tǒng)

2010-02-23 11:10:42

CentOS PPPO

2011-03-30 15:05:40

MRTG安裝

2011-04-02 15:26:51

Cacti安裝

2011-11-08 21:55:58

MRTG 配置

2011-03-25 13:40:28

Cacti安裝配置
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)