天天看點

.yml檔案_SpringBoot擷取配置檔案,就這麼簡單

.yml檔案_SpringBoot擷取配置檔案,就這麼簡單

在講SpringBoot 擷取配置檔案之前我們需要對SpringBoot 的項目有一個整體的了解,如何建立SpringBoot 項目,項目結構等等知識點,我在這裡就不一一講述了,沒有學過的小夥伴可以自己在網上找一些資料進行學習,很簡單的。

下面讓我們開始今天的内容講解吧。

一、SpringBoot 全局配置檔案的加載順序

在SpringBoot 當中,全局配置檔案有兩種不同的格式,一個是我們常見的properties, 一種是yml.

這兩種格式的檔案其實也沒什麼太大的差別,使用的時候按照個人的習慣來就行,下面我們用的是yml檔案。

首先,當我們建立SpringBoot 的項目時,預設在resources目錄下建立一個application.properties檔案,這時我們可以在這個檔案當中對項目進行配置即可。但是在SpringBoot 中application.properties可以存放在以下幾個位置:

file:./config/ 項目根目錄下的config檔案夾下
file:./ 項目根目錄下
classpath:/config/ 類路徑下的config檔案夾下
classpath:/ 類路徑下

檔案的加載順序:即根目錄下的config目錄下,然後是 根目錄下,然後是classpath路徑下的config目錄下,最後是classpath路徑下。

.yml檔案_SpringBoot擷取配置檔案,就這麼簡單

優先級由高到低,高優先級的配置會覆寫低優先級的配置。

假如:根目錄下的config目錄下定義端口為8084, 根目錄下定義端口為8083 ,classpath路徑下的config目錄定義端口為8082,classpath路徑下定義端口為8081,最後啟動,啟動的端口為8084 ,高優先級會覆寫低優先級。

注意: 并不是高優先級的被加載了,低優先級的就不會再加載,實際上是SpringBoot會從這四個位置全部加載主配置檔案,并且還能産生互相配置的效果。

除此外,我們還可以通過spring.config.location來改變預設的配置檔案位置。

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

在 G盤目錄下,建立一個application.yml檔案,定義端口為8085

打包項目,啟動指令行:java -jar spring-boot-config-0.0.1-SNAPSHOT.jar --spring.config.location=G:/application.yml 回車運作。

外部配置加載順序

  1. 指令行參數eg: java -jar spring-boot-config-0.0.1-SNAPSHOT.jar --server.port=8087

---- 由jar包外向jar包内進行尋找:

2、 優先加載帶profile

jar包外部的 application-{profile}.properties或application.yml(帶spring.profile)配置檔案

将打好的jar包放在一個目錄下,然後在該檔案夾下建立一個名為application.yml的檔案,其中指定

port為8082 ,通路路徑為/boot ,然後指令行直接啟動項目。java -jar spring-boot-config-0.0.1-SNAPSHOT.jar --application.yml

在講配置檔案之前,我先說一說yml檔案配置資訊書寫格式

基本資料類型(8種基本資料類型)以k: v 形式書寫即可

比如我在一個實體類(Person)中定義一個 屬性(age),類型是 int ,在yml檔案中的書寫格式如下

person:  age: 20
           

實體類對象(Person),Map ,k:v 在下一行來寫對象的屬性和值的關系,注意縮進

person:  userName: zhans  age: 20
           
#另一種行内寫法  person: {userName: zhans.age: 20}  
           

List ,數組的書寫,注意 - 後有空格

pets: - cat - dog - pig
           
#另一種行内寫法  pets:{cat,dog,pi}
           

二、SpringBoot 擷取配置檔案的方式

@Value

建立配置類,由于篇幅問題這裡省略了 setter、getter 方法,但是實際開發中這個是必須的,否則無法成功注入,@Component表示把目前配置類注入到Spring容器當中。

@Componentpublic class PersonConfig {​    @Value("${person.userName}")    private String userName;    @Value("${person.age}")    private int age;    }
           

在主配置檔案中添加如下配置(application.yml)

server:  port: 8081person:  userName: hello  age: 20
           

測試類:

@RestControllerpublic class PersonController {    @Autowired    private Person person;​    @RequestMapping(value = "/get",method = RequestMethod.GET)    public String findPerson(){        return "姓名:"+person.getUserName()+"年齡:"+person.getAge();    }}
           

啟動項目,通路位址http://localhost:8080/get運作結果:

姓名:hello年齡:20
           
是以,我們就可以通過 @Value(${key})的方式擷取全局配置檔案中的指定配置項。

@ConfigurationProperties

如果我們需要取 許多個配置項,通過 @Value 的方式去配置項需要一個一個去取,顯然有點麻煩。是以我們可以使用 @ConfigurationProperties。

标有 @ConfigurationProperties的類的所有屬性和配置檔案中相關的配置項進行綁定,綁定之後我們就可以通過這個類去通路全局配置檔案中的屬性值。

代碼執行個體如下:

  1. 在主配置檔案中添加如下配置
user:  username: admin  password: 123456  map: {k1: v1,k2: v2}  list:    - cat    - dog  person:    userName: hello    age: 20  objects:    - aaa    - bbb    - ccc
           
  1. 建立配置類,由于篇幅問題這裡省略了 setter、getter ,toString 方法,但是實際開發中這個是必須的,否則無法成功注入。
@Component[email protected](prefix = "user")public class User {    private String  username;    private String password;    private Map map;    private Person person;    private List list;    private Object[] objects;​}​
           
這裡 @ConfigurationProperties 有一個 prefix參數,主要是用來指定該配置項在配置檔案中的字首,即user。

測試類

@RestControllerpublic class PersonController {    @Autowired    private Person person;    @RequestMapping(value = "/findUser",method = RequestMethod.GET)    public String findUser(){        return user.toString();    }}
           

我們在頁面通路 http://localhost:8081/findUser,頁面就顯示我們在yml檔案中配置的資訊了。

User{username='admin', password='123456', map={k1=v1, k2=v2}, [email protected], list=[cat, dog], objects=[aaa, bbb, ccc]}
           

以上的兩種方式有什麼差別呢?

@[email protected]功能批量注入配置檔案的屬性一個一個指定松散綁定支援不支援JSR303資料校驗支援不支援複雜資料封裝支援不支援(Map)

松散綁定,username 可以用user-name 表示,來擷取值

JSR303資料校驗,如果用@Value擷取全局配置檔案的屬性,使用@Validated檔案格式校驗是不起作用的。

@PropertySource 注解加載指定的配置檔案。

@PropertySource (value = “ ”) 指明加載類路徑下的哪個配置檔案來注入值

建立配置類,由于篇幅問題這裡省略了 setter、getter ,toString 方法,但是實際開發中這個是必須的,否則無法成功注入。

@[email protected]( "classpath:student.properties")@ConfigurationProperties(prefix = "student")public class Student {​    private String sname;}
           

在student.properties檔案中添加如下配置

student.sname=admin
           

測試類

@SpringBootTestclass SpringbootExampleApplicationTests {    @Autowired    private DogConfig dogConfig;    @Test    void contextLoads() {       System.out.println("注入的對象:"+dogConfig.getName());    }​}
           

運作結果:

Student{sname='admin'}
           

@ImportResource 導入Spring 配置檔案

@ImportResource 注解用來導入 Spring 的配置檔案,如果Spring配置檔案 "bean.xml",進而讓配置檔案裡面的内容生效,通常可以把@ImportResource标注在@SpringBootApplication的啟動類上即可。

舉例說明:比如我們把PersonService注入到Spring容器當中,通過Spring配置檔案的方式操作,代碼示例如下:

public class PersonService {}
           
@ImportResource("classpath:bean.xml")@SpringBootApplicationpublic class SpringBootConfigApplication {    public static void main(String[] args) {        SpringApplication.run(SpringBootConfigApplication.class, args);    }}
           

Spring的配置檔案:bean.xml

<?xml version="1.0" encoding="UTF-8"?>
           

測試的案例:

@SpringBootTestclass SpringBootConfigApplicationTests {    @Autowired    private PersonService personSerivcer;    @Test    void contextLoads() {        System.out.println("注入的對象:"+personSerivcer);    }}
           

運作的結果:

注入的對象:[email protected]
           

這Spring 中bean的配置實作,但是SpringBoot 推薦我們使用注解開發,那Springboot 中注解是如何實作bean 的注入呢?

@Configuration:指明目前類是配置類,就是代替上面說到的spring的配置檔案.

@Bean 将方法傳回值添加到容器當中,容器中這個元件預設的id 是方法名

@Configurationpublic class MyConfig {    @Bean    public PersonSerivcer personSerivcer(){        return new PersonSerivcer();    }}
           

這樣就可以就可以通過注解實作代替Spring 中的配置檔案了。

三、SpringBoot 的Profile

我們這裡就以yml檔案為例

第一種是我在 主配置檔案編寫的時候,檔案名可以是 application-{profile}.yml(application-dev.yml, application-prod.yml) ,預設使用 檔案application.yml 的配置

1、如果我們想要使用的application-dev.yml 全局配置檔案,在application.yml 指定即可。

配置執行個體:

在application.yml 配置檔案中添加如下配置

spring:  profiles:    active: dev
           

在application-dev.ym 配置檔案中添加如下配置l

server:  port: 8080#應用通路的項目路徑  servlet:    context-path: /bootperson:   username: 占山
           

2、yml支援多文檔快方式

那麼,在application-dev.ym 配置檔案中添加如下配置l

spring:  profiles:    active: prod---server:  port: 8080  servlet:    context-path: /zfspring:  profiles: dev---person:  userName: 啊哈server:  port: 8081  servlet:    context-path: /bootspring:  profiles: prod
           

3、Program arguments

   在Program arguments中配置參數

--spring.profiles.active=dev
.yml檔案_SpringBoot擷取配置檔案,就這麼簡單

4、虛拟機的方式

在VM options下使用指令:-Dspring.profiles.active=prod
.yml檔案_SpringBoot擷取配置檔案,就這麼簡單

四、小結

實際開發中我們如果如果我們需要取 許多個配置項,就使用@ConfigurationProperties注解,如果隻是注入一個屬性就使用@Value,

@PropertySource 注解加載指定的配置檔案,@ImportResource 導入Spring 配置檔案(這裡可以使用注解來替代)。

後記

由于本人能力有限,若文章有錯誤的地方,請大家指出,一起交流學習。今天就和大家講到這裡,喜歡我的小夥伴們,動動你的小手點個關注呗。

歡迎大家關注我的公衆号:阿福聊程式設計,長期更新Java各種技術文章。

繼續閱讀