springboot之旅第二篇-配置

来源:https://www.cnblogs.com/yuanqinnan/archive/2019/03/28/10618511.html
-Advertisement-
Play Games

一、引言 雖然springboot幫我們進行了自動配置,但配置還是不可避免的,比如最簡單的埠號,資料庫連接。但springboot的配置一般不用xml進行配置,而是yml和properties,選擇他們當然是因為他們更方便。 YAML(YAML Ain't Markup Language)是以數據 ...


一、引言

雖然springboot幫我們進行了自動配置,但配置還是不可避免的,比如最簡單的埠號,資料庫連接。但springboot的配置一般不用xml進行配置,而是yml和properties,選擇他們當然是因為他們更方便。

YAML(YAML Ain't Markup Language)是以數據為中心的,所以比xml和json更適合做配置文件,我們看一個簡單例子:配埠號

yaml的寫法是:

server:
  port: 8089

xml的寫法是:

<server>
    <port>8081</port>
</server>

直觀上我們就能看到yaml的寫法更簡練,xml用了很大的空間放在標簽的開閉上,而yaml不需要,下麵我們來細講yaml的語法。

二、YAML語法

yaml的基本語法是 k:(空格)v:表示一對鍵值對(空格必須有),以空格的縮進來控制層級關係,只要是左對齊的一列數據,都是同一個層級的。且屬性和值都是大小寫敏感的。如:

server:
  port: 8081
  path: /hello

我們重點看看值的寫法,值的寫法是指可以用哪些寫法來寫值,一般有:字面量,對象、Map,數組

字面量:就是指普通的值(數字,字元串,布爾),這個寫法就是直接k: v:方式,字元串預設不用加上單引號或者雙引號,如果加了,那雙引號和單引號是有區別的,區別在於是不是轉義特殊字元,雙引號會轉義特殊字元,而單引號不會。如:

name: "yuanqinnan \n yuanyuan" 輸出;yuanqinnan 換行  yuanyuan
name: ‘yuanqinnan \n yuanyuan’:輸出;yuanqinnan \n  yuanyuan

對象、Map的寫法也是普通的k: v 寫法,在下一行來寫對象的屬性和值的關係。如

friends:
  lastName: zhangsan
  age: 20

也可以一行完成

friends: {lastName: zhangsan,age: 18}

數組(List、Set)

用- 值表示數組中的一個元素,如:

pets:
 - cat
 - dog
 - pig

記得- 後要打空格,這也有一行寫法:

pets: [cat,dog,pig]

三、配置文件註入

配置文件寫完,那麼我們就要來使用了,下麵講配置文件值註入。

第一種方式@ConfigurationProperties

新建一個person類

/**
 * 將配置文件中配置的每一個屬性的值,映射到這個組件中
 * @ConfigurationProperties:告訴SpringBoot將本類中的所有屬性和配置文件中相關的配置進行綁定;
 *      prefix = "person":配置文件中哪個下麵的所有屬性進行一一映射
 *
 * 只有這個組件是容器中的組件,才能容器提供的@ConfigurationProperties功能;
 *
 */
@Component
@ConfigurationProperties(prefix = "person")
@Data
public class Person  {
    private String lastName;
    private Integer age;
    private Boolean boss;
    private Date birth;
    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dog;
}

這裡為了少些一些代碼,引入lombok,增加依賴,這個不清楚的同學自行百度了。

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.2</version>
</dependency>

再建一個dog類:

@Data
public class Dog {
    private String name;
    private Integer age;
}

然後在配置文件中加入以下配置:

server:
  port: 8089
person:
    lastName: hello
    age: 18
    boss: false
    birth: 2017/12/12
    maps: {k1: v1,k2: 12}
    lists:
      - lisi
      - zhaoliu
    dog:
      name: 小狗
      age: 12

這裡基本包含了我們需要的各種類型,直接在SpringbootLearnApplicationTests測試:

測試結果:

除了可以一次性註入之外,還有另一種註入方式@Value ,@Value支持字面量,${key}從環境變數、配置文件中獲取值,支持#{Spel}表達式,怎麼寫呢?例子:

//支持${}
@Value("${person.lastName}")
private String lastName;
//支持#{SpEL}
@Value("#{10*2}")
private Integer age;
//支持字面量
@Value("true")

兩者有以下的區別:

@ConfigurationProperties預設從主配置文件中獲取值,如果需要專門的配置文件則需要使用@PropertySource ,寫法如下:

@PropertySource(value = {"XXX"})

我們應該怎麼選擇兩種註入方式呢?

如果說,我們只是在某個業務邏輯中需要獲取一下配置文件中的某項值,使用@Value。

如果說,我們專門編寫了一個javaBean來和配置文件進行映射,我們就直接使用@ConfigurationProperties。

這裡還要註意Spring Boot裡面沒有Spring的配置文件,我們自己編寫的配置文件,不能自動識別,什麼意思呢?

如我們新建一個xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

<bean id="helloService" class="com.yuanqinnan.service.HelloService"></bean>
</beans>

按照路徑添加HelloService類,然後我們直接去獲取bean,看看能不能取出來

測試方法:

@Autowired
ApplicationContext ioc;
@Test
public void beanTest(){
    boolean b = ioc.containsBean("helloService");
    System.out.println(b);
}

結果是false,說明沒有註入成功,這個時候我們需要使用@ImportResource在啟動類上加上

@ImportResource(locations = {"classpath:beans.xml"})

這樣才能註入進來,因為springboot是不推薦使用xml文件而使用註解方式,我們一般這麼寫

@Configuration
public class MyAppConfig {

    //將方法的返回值添加到容器中;容器中這個組件預設的id就是方法名
    @Bean
    public HelloService helloService2(){
        System.out.println("配置類@Bean給容器中添加組件了...");
        return new HelloService();
    }
}

這樣helloService2就註入進來了

@Test
public void beanTest2(){
    boolean b = ioc.containsBean("helloService2");
    System.out.println(b);
}

測試結果為true。

四、多個文件

在實際開發中,我們可能會有多個配置文件,比如本地的配置,測試的配置,正式的配置,這個時候我們就可以使用,一般我們會命名為:application-{profile}.properties/yml,那我們新建2個配置文件:

然後在application.yml加上

spring:
  profiles:
    active: dev

這樣我們可以方便的切換環境配置,那上線的時候我們想改動配置文件怎麼辦呢?帶參數命令就可以實現

java -jar springboot-learn-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev;

我們可以用多個文件來進行配置,那麼就會有優先順序的問題,springboot是怎麼做的呢?

springboot 啟動會掃描以下位置的application.properties或者application.yml文件作為Spring boot的預設配置文件,並按照以下順序進行掃描:

1、根目錄下:./config/

2、根目錄下:./

3、類路徑下:/config/

4、類路徑下classpath:/

優先順序由高到底,如果後面的文件有相同配置則不起作用,這些配置文件都是互補配置,我們可以將需要的配置文件分類進行寫入。

spingboot有很多自動配置類,並且為這些自動配置類提供了預設的properties,如資料庫連接配置。

我們根據這個properties,再進行相應的屬性配置:

五、總結

SpringBoot啟動會載入大量的自動配置類,我們看我們需要的功能有沒有SpringBoot預設寫好的自動配置類,我們再來看這個自動配置類中到底配置了哪些組件,(只要我們要用的組件有,我們就不需要再來配置了)給容器中自動配置類添加組件的時候,會從properties類中獲取某些屬性。我們就可以在配置文件中指定這些屬性的值。

 

 

 

 

 

 

 


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

-Advertisement-
Play Games
更多相關文章
  • 題目如下。解題步驟參考的是https://cloud.tencent.com/developer/news/373865中作者的思路。 1.首先,兩個四位數相加等於一個五位數,那麼這個五位數的第一位必定是1,也就是“三”=1,。 2.繼續分析“祥”+“三”,若是“祥”(8),“三”為1,那麼低位必定 ...
  • JDBC的使用流程,通過JDBC進行對資料庫增刪改查的操作及代碼封裝。 ...
  • 題意 "題目鏈接" Sol 我們可以把圖行列拆開,同時對於行/列拆成很多個聯通塊,然後考慮每個點所在的行聯通塊/列聯通塊的貢獻。 可以這樣建邊 從S向每個行聯通塊連聯通塊大小條邊,每條邊的容量為1,費用為$i$(i表示這是第幾條邊)。 從每個點所在的行聯通塊向列聯通塊連邊,容量為1,費用為0 從每個 ...
  • 想要熟練使用PyQt,還是需要深入研究下這個庫的使用,筆者這裡只是拋磚引玉。 關註公眾號「**Python專欄**」,後臺回覆:**zsxq06**,獲取本文全套代碼。 ...
  • python讀取大文件 1. 較pythonic的方法,使用with結構 文件可以自動關閉 異常可以在with塊內處理 <! more 最大的優點 :對可迭代對象 f,進行迭代遍歷:for line in f,會自動地使用緩衝IO(buffered IO)以及記憶體管理,而不必擔心任何大文件的問題。 ...
  • 一、簡要說明 開篇說明 其實吧這是我人生中寫的第一篇博客,我也不知道怎麼排版和編輯讓博文顯示的更加美觀,現在正在學Markdown編輯語法,也是剛剛學編程的一個小菜鳥,目前是大二的在校生,我的初衷是把我平時所學的知識都像做筆記一樣寫下來,讓以後在學習更多知識的時候回來一看,舊的知識就可以鞏固回來了, ...
  • ArrayList ArrayList 是通過一個數組來實現的,因此它是在連續的存儲位置存放對象的引用,只不過它比 Array 更智能,能夠根據集合長度進行自動擴容。 假設讓我們來實現一個簡單的能夠自動擴容的數組,我們最容易想到的點就是: 實際上,ArrayList的內部實現原理也是這樣子,我們可以 ...
  • 開發世界現在有很多反設計模式的開發方式,比如使用可執行代碼文件作為配置文件。 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...