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

如何在Spring Boot中優雅地加載配置?這些方法你必須掌握!

開發 前端
在某些場景下,@Value注解無法滿足我們的所有需求,比如當參數配置是一個對象或數組時。在這種情況下,使用@ConfigurationProperties是一個更好的選擇。

環境:SpringBoot3.4.3

1. 簡介

當Spring Boot啟動時,它會按照特定的順序搜索配置文件,如下配置文件加載順序的說明:

  • 首先,它會查找bootstrap.properties或bootstrap.yml文件。這些文件具有最高優先級,就像我們的“晨間例行事務”一樣,總是首先考慮。
  • 接下來,它會搜索application.properties或application.yml文件。這些是項目的“日常配置”,處理大多數場景。
  • 如果配置了spring.profiles,它還會加載相應的環境特定配置文件,如application-dev.properties。這就像為不同場合準備不同的著裝一樣。 

圖片圖片

請注意:bootstrap配置文件的加載是在Spring Cloud環境下。

如下是Spring Boot官方對配置文件加載順序的說明:

圖片圖片

接下來,我們將詳細的介紹有關Spring Boot配置文件加載的詳細內容。

2. 實戰案例

2.1 @Value注解

當我們只需要從配置文件中獲取一個簡單的值,而@Value注解可以輕松地實現這一點。

pack:
  title: xxxooo

使用@Value注入配置值

@Service
public class TestService {


  @Value("${pack.title}")
  private String title ;
  // ...
}

但請注意,如果你的配置文件中沒有配置pack.title,那么服務將無法正確啟動。所以,我們應該考慮如下方式配置:

@Value("${pack.title:default_title}")
private String title ;

當配置文件沒有配置pack.title時,將使用這里冒號后面的默認值: default_title。

關于@Value注解更多的用法,請查看下面這篇文章:

SpringBoot @Value注解這些高級玩法用過嗎?

2.2 @ConfigurationProperties注解

在某些場景下,@Value注解無法滿足我們的所有需求,比如當參數配置是一個對象或數組時。在這種情況下,使用@ConfigurationProperties是一個更好的選擇。

pack:
  version: 1.0.2
  title: xxxooo

配置對象定義如下:

@Component
@ConfigurationProperties(prefix = "pack")
public class App {
  private String title ;
  private String version ;
  // getters, setters
}

通過這里配置的前綴 prefix = "pack" ,自動于類中的屬性進行映射。

Map & List集合映射

@Component
@ConfigurationProperties(prefix = "pack")
public class App {
  private Map<String, Object> params = new HashMap<>() ;
  private List<String> addresses = new ArrayList<>() ;
}

配置文件定義如下:

pack:
  params:
    version: 1.0.0
    title: xxxooo
  addresses:
  - xxx
  - ooo

請注意,Map集合的value與List都可以是任意其它的對象類型。

關于@ConfigurationProperties更多高級用法請查看下面文章:

進階!@ConfigurationProperties注解高級用法你知道嗎?

2.3 @PropertySource注解

有時,我們希望將不同模塊的配置分開,比如將數據庫配置放在一個文件中,緩存配置放在另一個文件中,以便更加清晰。這時,@PropertySource注解就派上了用場。在資源目錄中創建配置文件,db.properties,內容如下:

db.user=root
db.password=123456
db.url=xxxx

使用@PropertySource加載配置文件

@Component
@PropertySource(value = {"db.properties"})
public class DbProperties {
}

value是數組,可以定義多個配置文件。

請注意,@PropertySource默認是不支持yaml文件的加載。如果需要加載yaml或其它格式的文件還需要自定義PropertySourceFactory,然后通過factory屬性進行定義。

關于@PropertySource更多高級用法,請查看下面文章:

我不信!你會用@PropertySource注解?高級法

2.4 EnvironmentPostProcessor

如果你需要更早或更靈活的配置文件加載方式,比如根據環境動態加載不同的配置,你可以通過自定義EnvironmentPostProcessor接口。

public class PackEnvironmentPostProcessor implements EnvironmentPostProcessor {
  final String[] profiles = {
    "test.properties","bussiness.properties", "pack.yml"
  };
  @Override
  public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
    for (String profile : profiles) {
      Resource resource = new ClassPathResource(profile);
      environment.getPropertySources().addLast(loadProfiles(resource));
    }
  }


  private PropertySource<?> loadProfiles(Resource resource) {
    if (!resource.exists()) {
      throw new IllegalArgumentException("Resource " + resource + " does not exist");
    }
    if(resource.getFilename().contains(".yml")){
      return loadYaml(resource);
    } else {
      return loadProperty(resource);
    }
  }
  // 加載屬性文件
  private PropertySource loadProperty(Resource resource){
    try {
      Properties properties = new Properties();
      properties.load(resource.getInputStream());
      return new PropertiesPropertySource(resource.getFilename(), properties);
    }
  }
  // 加載yaml配置文件
  private PropertySource loadYaml(Resource resource){
    try {
      YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
      factory.setResources(resource);
      Properties properties = factory.getObject();
      return new PropertiesPropertySource(resource.getFilename(), properties);
    }
  }
}

這里我們不能將其定義為bean,需要通過如下的方式進行配置:

META-INF/spring.factories

org.springframework.boot.env.Envirnotallow=\
com.pack.env.PackEnvironmentPostProcessor

這樣配置后,容器在啟動時初始化Environment時會自動的讀取配置文件中的EnvironmentPostProcessor。

2.5 其它配置文件加載方式

我們還可以通過如下的方式加載配置文件:

@Configuration
public class ConfigYaml {


  @Bean
  public static PropertySourcesPlaceholderConfigurer properties() {
    PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
    YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
    yaml.setResources(new ClassPathResource("pack.yml"));
    configurer.setProperties(yaml.getObject()) ;
    return configurer;
  }
}

setResources方法可以定義多個Resource對象。

你還可以通過啟動參數設置配置屬性信息,詳細查看下面的鏈接加載JSON數據(不僅是JSON,其它key/value都可以進行啟動參數配置:--xxx=ooo)

責任編輯:武曉燕 來源: Springboo全家桶實戰案例源碼
相關推薦

2021-03-24 10:20:50

Fonts前端代碼

2020-03-27 15:10:23

SpringJava框架

2022-04-27 08:55:01

Spring外部化配置

2022-04-20 20:27:51

Hydra配置文件開發工具

2024-10-10 15:08:40

2021-04-15 00:16:18

JavaString字符串

2024-04-24 12:34:08

Spring事務編程

2022-04-01 12:51:44

命令Containerd

2025-05-09 01:00:00

分布式限流高并發

2025-02-14 08:30:49

SpringJava開發

2022-06-28 08:01:26

hook狀態管理state

2024-10-28 08:01:11

2020-09-25 11:30:20

Java判空代碼

2022-11-04 13:06:47

JVMJava程序

2022-09-16 11:41:17

Spring代碼

2022-03-07 07:33:24

Spring自定義機制線程池

2024-08-30 11:11:01

2021-01-06 05:45:58

Dubbo源碼高并發

2020-04-10 10:22:12

Java判空編程語言

2020-07-29 07:28:14

分布式限流系統
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91精品国产91久久久久久吃药 | 欧美一区二区在线视频 | 亚洲国产区 | 精品国产欧美一区二区三区成人 | 久久久久国 | a免费观看 | 黄色av观看 | 精品久久久久久一区二区 | 欧美亚洲国产精品 | 五月婷婷激情 | 亚洲视频一区在线播放 | 成人精品福利 | 国精产品一品二品国精在线观看 | 中文成人在线 | 日本a级大片 | 二区av | 夜夜爽99久久国产综合精品女不卡 | 国产中文字幕在线 | 午夜影院在线观看免费 | 国产在线a | 中文在线播放 | 欧美无乱码久久久免费午夜一区 | 欧美性猛交一区二区三区精品 | 国产精品视频在线播放 | 国产乱码精品1区2区3区 | 亚洲精品成人 | 一级黄色片毛片 | 亚洲九色 | 精品91久久| 亚洲逼院 | 精品福利一区二区三区 | 欧美视频免费 | 免费在线日韩 | 男人天堂网av | 国产a一区二区 | 国精产品一区一区三区免费完 | 又爽又黄axxx片免费观看 | 91精品观看 | 久久久久久99 | 国产农村妇女精品一二区 | 中文字幕 国产 |