最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot中的條件裝配方法

 更新時(shí)間:2024年08月29日 09:34:42   作者:思靜語  
在實(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ù),這篇文章主要介紹了SpringBoot中的條件裝配方法,需要的朋友可以參考下

在實(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ā)無疑將更加靈活、高效。
在過去的應(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)維來說,非常苦逼,尤其是應(yīng)用程序到達(dá)50個(gè)以上的時(shí)候,會(huì)非常不好維護(hù),每次上線改配置~
當(dāng)我們?cè)谑褂肧pringBoot來開發(fā)應(yīng)用程序的時(shí)候,這些工作量將大大簡(jiǎn)化。
SpringBoot為開發(fā)者提供了三種可選的條件裝配方式。
● Profile
● Conditional
● ConditionalOnProperty
在Spring Boot中,條件裝配(Conditional Bean Configuration)是指根據(jù)特定的條件來決定是否創(chuàng)建或裝配某個(gè)Bean。以下是幾種常用的條件裝配方式及其代碼示例:
Spring提供的條件裝配@Conditional,靈活性非常強(qiáng),但是具體判斷邏輯還需要我們自己實(shí)現(xiàn),比較麻煩。
實(shí)際上,Spring Boot為開發(fā)者提供了很多使用起來更簡(jiǎn)單的條件注解,例如:
● ConditionalOnProperty:如果有指定的配置,條件生效
● ConditionalOnBean:如果有指定的Bean,條件生效
● ConditionalOnMissingBean:如果沒有指定的Bean,條件生效
● ConditionalOnMissingClass:如果沒有指定的Class,條件生效
● ConditionalOnWebApplication:在Web環(huán)境中條件生效
● ConditionalOnExpression:根據(jù)表達(dá)式判斷條件是否生效

Profile

SpringBoot 為應(yīng)用程序提供了Profile這一概念,用來表示不同的環(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ù)
/**
● 上傳文件到本地
● @since 2021-06-13
 */
public class FileUploader implements Uploader { @Override
 public String upload(File file) {
 //上傳文件到本地,并返回絕對(duì)路徑
 return null;
 }
}
/**
● 上傳文件到OSS
● @since 2021-06-13
 */
public class OSSUploader implements Uploader { @Override
 public String upload(File file) {
 //上傳文件到云端,并返回絕對(duì)路徑
 return null;
 }
}

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

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

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)行。

spring.profiles.active=dev

1. @Conditional 注解

@Conditional允許基于自定義條件進(jìn)行裝配。
代碼示例:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyConfig {
    @Bean
    @Conditional(MyCondition.class)
    public MyService myService() {
        return new MyService();
    }
}

自定義條件:

import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
public class MyCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        // 判斷條件,返回true表示創(chuàng)建該bean
        return true; // 可以根據(jù)環(huán)境變量、系統(tǒng)屬性等來判斷
        // return "true".equalsIgnoreCase(context.getEnvironment().getProperty("enable.sms"));
    }
}

2. @ConditionalOnProperty 注解

根據(jù)配置文件中的屬性值決定是否裝配某個(gè)Bean。
代碼示例:

import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyConfig {
    @Bean
    @ConditionalOnProperty(name = "feature.enabled", havingValue = "true")
    public MyService myService() {
        return new MyService();
    }
}

配置文件:

eature:
  enabled: true

@ConditionalOnClass 注解
如果某個(gè)類在類路徑上存在,則裝配相應(yīng)的Bean。
代碼示例:

import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyConfig {
    @Bean
    @ConditionalOnClass(name = "com.example.SomeClass")
    public MyService myService() {
        return new MyService();
    }
}

4. @ConditionalOnMissingBean 注解

如果容器中不存在某個(gè)Bean,則裝配當(dāng)前的Bean。
代碼示例:

import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyConfig {
    @Bean
    @ConditionalOnMissingBean
    public MyService myService() {
        return new MyService();
    }
}

5. @ConditionalOnBean 注解

如果容器中存在某個(gè)特定的Bean,則裝配當(dāng)前的Bean。
代碼示例:

import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyConfig {
    @Bean
    @ConditionalOnBean(name = "someOtherBean")
    public MyService myService() {
        return new MyService();
    }
}

6. @ConditionalOnExpression 注解

根據(jù)SpEL表達(dá)式的結(jié)果來決定是否裝配Bean。
代碼示例:

import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyConfig {
    @Bean
    @ConditionalOnExpression("${feature.enabled:true} == true")
    public MyService myService() {
        return new MyService();
    }
}

這些注解幫助你根據(jù)不同的條件動(dòng)態(tài)地裝配Bean,使得Spring Boot應(yīng)用更加靈活和可配置。

到此這篇關(guān)于SpringBoot中的條件裝配方法的文章就介紹到這了,更多相關(guān)SpringBoot條件裝配內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解重試框架Spring retry實(shí)踐

    詳解重試框架Spring retry實(shí)踐

    spring retry是從spring batch獨(dú)立出來的一個(gè)能功能,主要實(shí)現(xiàn)了重試和熔斷。這篇文章主要介紹了詳解重試框架Spring retry實(shí)踐,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • Spring中Transactional注解使用的心得(推薦)

    Spring中Transactional注解使用的心得(推薦)

    這篇文章主要介紹了Spring中Transactional注解使用的心得,事務(wù)是用來控制數(shù)據(jù)的ACID特性的,用于保證數(shù)據(jù)的正確性和完整性,需要的朋友可以參考下
    2022-10-10
  • Guava?Retryer實(shí)現(xiàn)接口重試的示例

    Guava?Retryer實(shí)現(xiàn)接口重試的示例

    本文主要介紹了Guava?Retryer實(shí)現(xiàn)接口重試的示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Java使用JDBC連接數(shù)據(jù)庫(kù)的實(shí)現(xiàn)方法

    Java使用JDBC連接數(shù)據(jù)庫(kù)的實(shí)現(xiàn)方法

    這篇文章主要介紹了Java使用JDBC連接數(shù)據(jù)庫(kù)的實(shí)現(xiàn)方法,包括了詳細(xì)的加載步驟以及完整實(shí)現(xiàn)示例,需要的朋友可以參考下
    2014-09-09
  • 詳解Spring Boot 項(xiàng)目部署到heroku爬坑

    詳解Spring Boot 項(xiàng)目部署到heroku爬坑

    這篇文章主要介紹了詳解Spring Boot 項(xiàng)目部署到heroku爬坑,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-08-08
  • Java中五種不同方法的創(chuàng)建對(duì)象

    Java中五種不同方法的創(chuàng)建對(duì)象

    本文為大家詳細(xì)介紹了在Java中5種不同創(chuàng)建對(duì)象的方法和實(shí)例代碼,感興趣的小伙伴們可以參考一下
    2016-07-07
  • 利用Java8 Optional類優(yōu)雅如何地解決空指針問題

    利用Java8 Optional類優(yōu)雅如何地解決空指針問題

    這篇文章主要給大家介紹了關(guān)于如何利用Java8 Optional類優(yōu)雅解決空指針問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • java 終止線程的4種方式小結(jié)

    java 終止線程的4種方式小結(jié)

    本文主要介紹了java終止線程的4種方式小結(jié),包含布爾標(biāo)志位,interrupt()方法,stop()方法和Thread.interrupt()方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-05-05
  • Java+Freemarker實(shí)現(xiàn)根據(jù)XML模板文件生成Word文檔

    Java+Freemarker實(shí)現(xiàn)根據(jù)XML模板文件生成Word文檔

    這篇文章主要為大家詳細(xì)介紹了Java如何使用Freemarker實(shí)現(xiàn)根據(jù)XML模板文件生成Word文檔,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以學(xué)習(xí)一下
    2023-11-11
  • Java格式化輸出printf()解讀

    Java格式化輸出printf()解讀

    這篇文章主要介紹了Java格式化輸出printf()解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09

最新評(píng)論

南皮县| 沿河| 巴马| 肇东市| 库伦旗| 邻水| 古田县| 淮北市| 望城县| SHOW| 青神县| 勃利县| 南岸区| 喀喇沁旗| 库伦旗| 乐平市| 邵东县| 永宁县| 瑞昌市| 荥阳市| 八宿县| 鞍山市| 通城县| 华阴市| 沁水县| 镶黄旗| 伊金霍洛旗| 疏附县| 西城区| 锦州市| 涞源县| 兴和县| 河间市| 青海省| 遵化市| 台安县| 克拉玛依市| 高雄县| 元谋县| 西贡区| 汕尾市|