springboot配置文件

来源:https://www.cnblogs.com/zerozayu/archive/2023/07/10/17541153.html
-Advertisement-
Play Games

# 1. 配置文件 ## 1.1 外部載入順序 1. 命令行參數 java -jar spring-boot-02-config-02.0.0.1-SNAPSHOT.jar --server.port=8087 java -jar spring-boot-02-config-02.0.0.1-SNA ...


1. 配置文件

1.1 外部載入順序

  1. 命令行參數

     java -jar spring-boot-02-config-02.0.0.1-SNAPSHOT.jar --server.port=8087
     java -jar spring-boot-02-config-02.0.0.1-SNAPSHOT.jar --spring.profiles.active=prod
    
  2. 來自java:comp/env的NDI屬性

  3. Java系統屬性(System.getProperties() )

  4. 操作系統環境變數

  5. RandomValuePropertySource配置的random.*屬性值

  6. jar包外部的application-{profile}.propertiesapplication.yml(帶spring.profile)配置文件

     -hello
     |- a.jar
     |- application.yml
    

    將打好的jar包放在一個目錄下,比如叫做 hello的文件夾,然後再該文件夾下新建一個名為application.yml的文件,其中指定port為8088
    ,訪問路徑為/boot ,然後命令行直接啟動項目。java -jar a.jar
    瀏覽器通過 localhost:8088/boot/hello 可以正常訪問,表示同級目錄下的配置文件生效了。

  7. jar包內部的application-{profile}.properties或application.yml(帶spring.profile)配置文件

  8. jar包外部的application.properties或application.yml(不帶spring.profile)配置文件

  9. jar包外部的application.properties或application.yml(不帶spring.profile)配置文件

  10. jar包內部的application.properties或application.yml(不帶spring.profile)配置文件

  11. @Configuration註解類上的propertySource

  12. 通過SpringApplication.setDefaultProperties指定的預設屬性。

1.2 springboot內部載入順序

  1. 配置文件可以放在下麵四個地方(優先順序依次)
    • file:./config:項目根目錄中config下
    • file:./:項目根目錄下
    • classpath:./config:項目的resources目錄中config下
    • classpath:./:項目的resources目錄下

當使用的項目是module級別的時候,必須使用級別是project級別才能掃描到 file: 下麵的文件

  1. 同目錄下.properties的優先順序比.yml高,
  2. 如果同一個配置屬性,多個文件都配置了,預設使用第一次讀取到的,後續不覆蓋
  3. 高優先順序會覆蓋低優先順序

1.3 改變預設的配置文件位置

**項目打包好以後,我們可以使用命令行參數的形式,啟動項目的時候來指定配置文件的新位置;指定預設載入的這些配置文件共同起作用形成互補配置
**

在 G盤目錄下,創建一個application.properties文件(yml也可以),定義埠為8085

打包項目,啟動命令行:

java -jar  spring-boot-02-config-02.0.0.1-SNAPSHOT.jar  --spring.config.location=G:/application.properties

回車運行。

瀏覽器訪問: http:localhost:8005/boot02/hello ,顯然外部指定的配置文件生效了,並且與之前的主配置文件形成了互補配置

1.4 使用profile配置和載入配置文件

1.4.1 使用.properties文件

假如有開發、測試、生產三個不同的環境,需要定義三個不同環境下的配置

application.properties
applicaiton-dev.properties
applictiong-test.properties
applicaiton-prod.properties

application.properties文件中指定當前使用的環境:

server.port=8001
# 激活哪個配置文件
spring.profiles.active=dev
#spring.profiles.active=dev,prod,test
spring.profiles.include=prod

1.4.2 使用.yml文件

因為在yml文件中,---表示文檔分隔符,每個文檔獨立,所以此時只需要一個.yml文件

spring:
  profiles:
    active: prod

---
spring:
  profiles: dev

server: 8080

---
spring:
  profiles: test

server: 8081

---
spring.profiles: prod
spring.profiles.include:
  - proddb
  - prodmq

server: 8082

---
spring:
  profiles: proddb

db:
  name: mysql

---
spring:
  profiles: prodmq

mq:
  address: localhost

此時讀取的就是prod的配置,prod包含proddb,prodmq,此時可以讀取proddb,prodmq下的配置

也可以同時激活三個配置spring.profiles.active: prod,proddb,prodmq

1.4.3 使用Java中的@Profile註解

@Profile註解只能配合@Configuration@Component使用


@Configuration
@Profile("prod")
public class ProductionConfiguration {

    // ...

}

1.5 讀取自定義配置文件

1.5.1 利用 @PropertiesSource 註解來實現

@PropertiesSource 可以用來載入指定的配置文件,預設只能載入 *.properties 文件, 不能載入 yml 等文件

相關屬性

  • value: 指明載入配置文件的路徑
  • ignoreResourceNotFound:指定的配置文件不存在是否報錯,預設是false。當設置為 true 時,若該文件不存在,程式不會報錯。實際項目開發中,最好設置
    ignoreResourceNotFound 為 false。
  • encoding:指定讀取屬性文件所使用的編碼,我們通常使用的是UTF-8。

示例

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Configuration
@PropertySource(value = {"classpath:common.properties"}, ignoreResourceNotFound = false, encoding = "UTF-8")
@ConfigurationProperties(prefix = "author")// 這個註解的作用是指明配置文件中需要註入信息的首碼
public class Author {
    private Stirng name;
    private String job;
    private String sex;
}

當需要用 yml作為配置文件時此時我們可以通過實現PropertySourceFactory介面,重寫createPropertySource方法,就能實現用@PropertySource也能載入yaml等類型文件。

import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.PropertiesPropertySource;
import org.springframework.core.io.support.EncodedResource;
import org.springframework.core.io.support.PropertySourceFactory;
import org.springframework.util.StringUtils;

import java.io.FileNotFoundException;
import java.util.Properties;

public class YamlPropertiesSourceFactory implements PropertySourceFactory {
    @Override
    public PropertySource<?> createPropertySource(String sourceName, EncodedResource resource) throws IOException {
        Properties propertiesFromYaml = loadYaml(resource);
        if (StringUtils.isBlank(sourceName)) {
            sourceName = resource.getResource().getFilename();
        }
        return new PropertiesPropertySource(sourceName, propertiesFromYaml);
    }

    private Properties loadYaml(EncodedResource resource) throws FileNotFoundException {
        try {
            YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
            factory.setResources(resource.getResource());
            factory.afterPropertiesSet();
            return factory.getObject();
        } catch (IllegalStateException e) {
            Throwable cause = e.getCause();
            if (cause instanceof FileNotFoundException) {
                throw (FileNotFoundException) cause;
            }
            throw e;
        }
    }
}
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Configuration
// 指明上面寫好的工廠類
@PropertySource(factory = YamlPropertySourceFactory.class, value = {"classpath:user.yml"},
        ignoreResourceNotFound = false, encoding = "UTF-8")
@ConfigurationProperties(prefix = "author")// 這個註解的作用是指明配置文件中需要註入信息的首碼
public class Author {
    private Stirng name;
    private String job;
    private String sex;
}

1.5.2 使用 EnvironmentPostProcessor 載入自定義配置文件

實現流程

  1. 實現EnvironmentPostProcessor介面,重寫postProcessEnvironment方法
public class MyEnvironmentPostProcessor implements EnvironmentPostProcessor {
   @Override
   public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
      String[] profiles = {"config/test.properties", "config/custom.properties", "config/blog.yml"};

      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("資源不存在");
      }
      if (resource.getFilename().endsWith("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);
      } catch (Exception e) {
         throw new IllegalStateException("載入Property配置文件失敗", e);
      }
   }

   private PropertySource loadYaml(Resource resource) {
      try {
         YamlPropertiesFactoryBean factoryBean = new YamlPropertiesFactoryBean();
         factoryBean.setResources(resource);

         Properties properties = factoryBean.getObject();
         return new PropertiesPropertySource(resource.getFilename(), properties);
      } catch (Exception e) {
         throw new IllegalStateException("載入Yaml配置文件失敗", e);
      }
   }
}
  1. 在META-INF下創建spring.factories
# spring.factories 文件內容如下:
# 啟用自定義環境處理類
org.springframework.boot.env.EnvironmentPostProcessor=com.zhangyu.config.MyEnvironmentPostProcessor

1.6 SpringBoot使用通配符載入配置文件

還可以使用通配符載入自定義配置文件,貌似是spring的實現方式


@Configuration
public class PropertyConfig {
 
   @Bean
   public PropertySourcesPlaceholderConfigurer getPropertySourcesPlaceholderConfigurer() throws IOException {
      PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
      configurer.setLocations(new PathMatchingResourcePatternResolver().getResources("classpath:properties/*.properties"));
      return configurer;
   }
}

classpath*:classpath: 的區別是

classpath:: 只會到你的class路徑中查找找文件。

classpath*:: 不僅包含class路徑,還包括jar文件中(class路徑)進行查找。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • # 1.系統函數 由系統提供,直接拿來用或是導入模塊後使用 ``` a = 1.12386 result = round(a,2) print(result) > 1.12 ``` # 2.自定義函數 * 函數是結構化編程的核心 * 使用關鍵詞`def`來定義函數 ``` #函數定義 def fun ...
  • 一. 介紹: Java中的 "==" 是一個運算符,是用於比較兩個對象地址值或基本數據類型之間的值是否相等。它的來源可以追溯到C語言,以及受C語言影響的許多其他編程語言。 Java中的equals() 是一個方法,可重寫該方法用於比較兩個對象屬性內容是否相等的方法。該方法繼承自Object類,在Ja ...
  • # Java 包、訪問修飾符 # 1. 包 ## 包可以理解為創建不同的目錄來分別存放類,類似電腦當中文件夾 > ## 通過包可以讓相同的類在不同的目錄下使用,防止重名的問題 > > ## 通過包可以很好的管理我們編寫的類 > > ## 通過包可以控制訪問範圍 ## 使用 idea 工具創建包通過 ...
  • ## 1.準備工作 首先創建一個空的項目,然後再項目里創建三個模塊,分別為springboot-dubbo-interface,springboot-dubbo-provider,springboot-dubbo-consumer,其中springboot-dubbo-interface模塊只是一個 ...
  • ## JDBC 驅動載入 => 連接創建 => 創建編譯 / 預編譯語句 => 獲取結果集 => 遍歷結果集 => 返回結果集 | 介面 | | | | | | Driver | 驅動 | | Connection | 連接 | | Statement | 操作 | | ResultSet | 結果 ...
  • 引自:https://blog.csdn.net/weixin_43795921/article/details/127224633 template <typename IdentifierType, class AbstractProduct, class ProductCreator = Ab ...
  • 將bytes 轉換為long類型: 第一種方式: String 接收 bytes 的構造器轉成 String,再 Long.parseLong; 但此種情況需要註意:位元組數組中的每個位元組都必須是有效的數字字元。如果位元組數組包含非數字字元,則會引發NumberFormatException異常。確保在 ...
  • 一. 介紹 String 是Java.long包下的String類,是一個特殊的引用類型,用於表示字元串。它提供了許多方法來操作和處理字元串,比如連接、截取、查找、替換等。String類內部使用字元數組( char[] ) 來存儲字元串的內容,value欄位被final修飾,String對象一旦創建 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...