跳到主要內容

SpringBoot基本配置詳解

SpringBoot項目有一些基本的配置,比如啟動圖案(banner),比如默認配置文件application.properties,以及相關的默認配置項。


示例項目代碼在:


一、啟動圖案banner


編寫banner.txt放入resources文件夾下,然後啟動項目即可修改默認圖案。


關於banner的生成,可以去一些專門的網站。


比如:https://www.bootschool.net/ascii



二、配置文件application


2.1 application.properties/yml


resources下通常會默認生成一個application.properties文件,這個文件包含了SpringBoot項目的全局配置文件。裏面的配置項通常是這樣的:


server.port=8080

在這個文件里我們可以添加框架支持的配置項,比如項目端口號、JDBC連接的數據源、日誌級別等等。


現在比較流行的是將properties文件改為yml文件。yml文件的格式yaml是這樣的:


server:
port: 8080

yml和properties的作用是一樣的。而yml的好處是顯而易見的——更易寫易讀。


屬性之間互相調用使用${name}:


eknown:
email: eknown@163.com
uri: http://www.eknown.cn
title: 'hello, link to ${eknown.uri} or email to ${eknown.email}'

鏈接:


2.2 多環境配置文件


通常開發一個應用會有多個環境,常見如dev/prod,也會有test,甚至其他一些自定義的環境,SpringBoot支持配置文件的靈活切換。


定義新配置文件需要遵循以下格式:application-{profile}.properties 或者application-{profile}.yml


比如現在有dev和prod兩個環境,我需要在application.yml文件之外新建兩個文件:




  1. application-dev.yml

    server:
    port: 8080

  2. application-prod.yml

    server:
    port: 8081



然後在application.yml中通過application.profiles.active={profile}指明啟用那個配置:


application:
profiles:
active: dev

除了在application.yml中指定配置文件外,還可以通過啟動命令指定:java -jar xxx.jar --spring.profiles.active=dev


2.2 自定義配置項並獲取它


主要介紹兩種方式,獲取單個配置項和獲取多個配置項。


舉例:


eknown:
email: eknown@163.com
uri: http://www.eknown.cn

2.2.1 使用@Value註解獲取單個配置項


@Value("${eknown.email}")
private String email;

@Value("${eknown.uri}")
private String url;

注意:使用@Value註解的時候,所在類必須被Spring容器管理,也就是被@Component、@Controller、@Service等註解定義的類。


2.2.2 獲取多個配置項


第一種,定義一個bean類,通過@Value獲取多個配置項:


@Component
public class MyConfigBean {

}

然後我們通過get方法來獲取這些值:


@RestController
public class BasicAction {

@Autowired
private MyConfigBean myConfigBean;

}

第二種,使用註解@ConfigurationProperties:


@Component
@ConfigurationProperties(perfix="eknown")
public class MyConfigBean {

private String email;
private String uri;
}

這裏只需要通過prefix指定前綴即可,後面的值自動匹配。


這裏我們還使用了@Component註解來讓spring容器管理這個MyConfigBean。


此外,我們可以不需要引入@Component,轉而在Application啟動類上加上@EnableConfigurationProperties({MyConfigBean.class})來啟動這個配置。


注意:我們這裡是從主配置文件,也就是SpringBoot默認的application-profile文件中獲取配置數據的。


而從自定義的配置文件,比如test.yml這種形式中獲取配置項時,情況是有點不大一樣的。


三、自定義配置文件


上面介紹的配置文件都是springboot默認的application開頭的文件。如果要自定義一個配置文件呢,比如test.yml或test.properties,怎麼獲取其中的配置項呢?


使用@PageResource註解即可。


首先我們來看一下讀取自定義的properties文件里的內容:


test.properties


hello.time=2019.11.19
hello.name=eknown

定義Configuration類:


@Configuration
@PropertySource("classpath:test.properties")
//@PropertySource("classpath:test.yml") // 注意,yml文件不能直接這樣寫,會讀不出數據
@ConfigurationProperties(prefix = "hello")
public class TestConfiguration {
private String name;
private String time;

// hide get and set methods
}

測試一下:


@RestController
@RequestMapping(value = "test")
public class TestAction {

@Autowired
private TestConfiguration testConfiguration;

@GetMapping(value = "config")
public String test() {
return testConfiguration.getName() + "<br/>" + testConfiguration.getTime();
}
}


如果將properties文件換成yml文件呢?


我們嘗試一下,發現:



讀不出數據?


分析一下@PropertySource註解,發現其使用的PropertySourceFactory是DefaultPropertySourceFactory.


這個類的源碼如下:


public class DefaultPropertySourceFactory implements PropertySourceFactory {
public DefaultPropertySourceFactory() {
}

public PropertySource<?> createPropertySource(@Nullable String name, EncodedResource resource) throws IOException {
return name != null ? new ResourcePropertySource(name, resource) : new ResourcePropertySource(resource);
}
}

這個類只能處理properties文件,無法處理yml文件。所以我們需要自定義一個YmlSourceFactory。


public class YamlSourceFactory extends DefaultPropertySourceFactory {

@Override
public PropertySource<?> createPropertySource(String name, EncodedResource resource) throws IOException {
return new YamlPropertySourceLoader().load(resource.getResource().getFilename()
, resource.getResource()).get(0);
}
}

然後定義test.yml文件的config類:


@Configuration
@PropertySource(value = "classpath:test.yml", encoding = "utf-8", factory = YamlSourceFactory.class)
@ConfigurationProperties(prefix = "yml.hello")
public class TestYamlConfiguration {
private String name;
private String time;

// hide get and set methods
}

注:為了區分test.properties和test.yml,這裏的test.yml中的屬性以yml.hello開頭。


編寫一下測試:


    @Autowired
private TestYamlConfiguration ymlConfiguration;

@GetMapping(value = "yml")
public String testYml() {
return "yml config: <br/>" + ymlConfiguration.getName() + "<br/>" + ymlConfiguration.getTime();
}

訪問:



四、補充@ConfigurationProperties


網上一些資料中,為配合使用@ConfigurationProperties,還使用了@EnableConfigurationProperties註解。


經過測試發現:




  1. 從SpringBoot默認配置文件讀取配置信息,使用@ConfigurationProperties + @Component/@Configuration,或者@ConfigurationProperties + 在啟動類添加@EnableConfigurationProperties({class})。這兩種方式都能解決問題


  2. 從非默認配置文件讀取配置信息,需要利用@PropertySource註解。同樣兩種方式:

    2.1 @PropertySource + @ConfigurationProperties + @Component/@Configuration

    2.2 @PropertySource + @ConfigurationProperties + @Component/@Configuration + @EnableConfigurationProperties,第二種方式存在一個問題,即還是必須要使用@Component註解,如果不使用,則會導致讀取配置信息為null,但程序不會報錯;而如果採用了,則會導致bean類的set方法被執行兩次(也就是生成了兩個同樣類型的bean類)。這種方式不建議!



本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?



網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!



※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光



※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師"嚨底家"!!



※專營大陸快遞台灣服務



台灣快遞大陸的貨運公司有哪些呢?




Orignal From: SpringBoot基本配置詳解

留言

這個網誌中的熱門文章

架構設計 | 異步處理流程,多種實現模式詳解

本文源碼:GitHub·點這裏 || GitEE·點這裏 一、異步處理 1、異步概念 異步處理不用阻塞當前線程來等待處理完成,而是允許後續操作,直至其它線程將處理完成,並回調通知此線程。 必須強調一個基礎邏輯,異步是一種設計理念,異步操作不等於多線程,MQ中間件,或者消息廣播,這些是可以實現異步處理的方式。 同步處理和異步處理相對,需要實時處理並響應,一旦超過時間會結束會話,在該過程中調用方一直在等待響應方處理完成並返回。同步類似電話溝通,需要實時對話,異步則類似短信交流,發送消息之後無需保持等待狀態。 2、異步處理優點 雖然異步處理不能實時響應,但是處理複雜業務場景,多數情況都會使用異步處理。 異步可以解耦業務間的流程關聯,降低耦合度; 降低接口響應時間,例如用戶註冊,異步生成相關信息表; 異步可以提高系統性能,提升吞吐量; 流量削峰即把請求先承接下來,然後在異步處理; 異步用在不同服務間,可以隔離服務,避免雪崩; 異步處理的實現方式有很多種,常見多線程,消息中間件,發布訂閱的廣播模式,其根據邏輯在於先把請求承接下來,放入容器中,在從容器中把請求取出,統一調度處理。 注意 :一定要監控任務是否產生積壓過度情況,任務如果積壓到雪崩之勢的地步,你會感覺每一片雪花都想勇闖天涯。 3、異步處理模式 異步流程處理的實現有好多方式,但是實際開發中常用的就那麼幾種,例如: 基於接口異步響應,常用在第三方對接流程; 基於消息生產和消費模式,解耦複雜流程; 基於發布和訂閱的廣播模式,常見系統通知 異步適用的業務場景,對數據強一致性的要求不高,異步處理的數據更多時候追求的是最終一致性。 二、接口響應異步 1、流程描述 基於接口異步響應的方式,有一個本地業務服務,第三方接口服務,流程如下: 本地服務發起請求,調用第三方服務接口; 請求包含業務參數,和成功或失敗的回調地址; 第三方服務實時響應流水號,作為該調用的標識; 之後第三方服務處理請求,得到最終處理結果; 如果處理成功,回調本地服務的成功通知接口; 如果處理失敗,回調本地服務的失敗通知接口; 整個流程基於部分異步和部分實時的模式,完整處理; 注意 :如...

.NET Core前後端分離快速開發框架(Core.3.0+AntdVue)

.NET Core前後端分離快速開發框架(Core.3.0+AntdVue) 目錄 引言 時間真快,轉眼今年又要過去了。回想今年,依次開源發布了 Colder.Fx.Net.AdminLTE(254Star) 、 Colder.Fx.Core.AdminLTE(335Star) 、 DotNettySocket(82Star) 、 IdHelper(47Star) ,這些框架及組件都是本着以實際出發,實事求是的態度,力求提高開發效率(我自己都是第一個使用者),目前來看反響不錯。但是隨着前端和後端技術的不斷變革,尤其是前端,目前大環境已經是前後端完全分離為主的開發模式,在這樣的大環境和必然趨勢之下,傳統的MVC就顯得有些落伍了。在這樣的背景下,一款前後端分離的.NET開發框架就顯得尤為必要,由此便定了框架的升級目標: 前後端分離 。 首先後端技術的選擇,從目前的數據來看,.NET Core的發展遠遠快於.NET Framework,最簡單的分析就是Colder.Fx.Core.AdminLTE發布比Colder.Fx.Net.AdminLTE晚,但是星星卻後來居上而且比前者多30%,並且這個差距在不斷擴大,由點及面的分析可以看出我們廣大.NET開發人員學習的熱情和积極向上的態度,並不是某些人所認為的那麼不堪( 走自己的路,讓別人說去吧 )。大環境上微軟积極擁抱開源,大力發展.NET Core, 可以說前途一片光明。因此後端決定採用 .NET Core3.0 ,不再浪費精力去支持.NET Framework。 然後是前端技術選擇,首選是三大js框架選擇,也是從實際出發,Vue相對其它而言更加容易上手,並且功能也毫不遜色,深得各種大小公司喜歡,如果偏要說缺點的話,那就是對TS支持不行,但是即將發布Vue3.0肯定會改變這一缺陷。選擇了Vue之後,然後就是UI框架的選擇了,這裏的選擇更多了,我選擇了Ant Design Vue,理由便是簡潔方便,十分符合我的設計理念。 技術選型完畢之後便...

請問一下純電動汽車快充接頭上的PE,CC,CP,NC1,NC2什麼意思呢?

其實不難董,以下是每一個的解釋 1、CP CC代表充電控制和連接檢測,主要是協議線。 2、L是三相輸入U線。 3、NC1是三相輸入V線。 4、NC2是三相輸入W線。 5、N是三項輸入中線。 6、PE代表接地線。 台中電動車     潭子電動車 Orignal From: 請問一下純電動汽車快充接頭上的PE,CC,CP,NC1,NC2什麼意思呢?