歡迎您光臨本站 註冊首頁

SpringBoot獲取配置文件的簡單實現方法

←手機掃碼閱讀     hongdian2012 @ 2020-06-08 , reply:0

前言

在講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路徑下。

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

假如:根目錄下的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容器當中。

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

 

在主配置文件中添加如下配置(application.yml)

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

 

測試類:

  @RestController  public 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

 

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

  @Component  @ConfigurationProperties(prefix = "user")  public class User {   private String username;   private String password;   private Mapmap;   private Person person;   private Listlist;   private Object[] objects;    }

 

這裡 @ConfigurationProperties 有一個 prefix參數,主要是用來指定該配置項在配置文件中的前綴,即user。

測試類

  @RestController  public 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}, person=com.zfcoding.config.Person@93471e6, list=[cat, dog], objects=[aaa, bbb, ccc]}

 

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


@ConfigurationProperties@Value
功能批量注入配置文件的屬性一個一個指定
鬆散綁定支持不支持
JSR303數據校驗支持不支持
複雜數據封裝支持不支持(Map)

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

JSR303數據校驗,如果用@Value獲取全局配置文件的屬性,使用@Validated文件格式校驗是不起作用的。

@PropertySource 註解加載指定的配置文件。

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

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

  @Component  @PropertySource( "classpath:student.properties")  @ConfigurationProperties(prefix = "student")  public class Student {     private String sname;  }

 

在student.properties文件中添加如下配置

  student.sname=admin

 

測試類

  @SpringBootTest  class 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")  @SpringBootApplication  public class SpringBootConfigApplication {     public static void main(String[] args) {   SpringApplication.run(SpringBootConfigApplication.class, args);   }    }

 

Spring的配置文件:bean.xml

  

 

測試的案例:

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

 

運行的結果:

注入的對象:com.zfcoding.service.PersonService@5b84f14

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

@Configuration:指明當前類是配置類,就是代替上面說到的spring的配置文件.

@Bean 將方法返回值添加到容器當中,容器中這個組件默認的id 是方法名

  @Configuration  public 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: /boot  person:   username: 佔山

 

2、yml支持多文檔快方式

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

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

 

3、Program arguments

   在Program arguments中配置參數

  --spring.profiles.active=dev

 

4、虛擬機的方式

在VM options下使用命令:-Dspring.profiles.active=prod

四、小結

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

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

         


[hongdian2012 ] SpringBoot獲取配置文件的簡單實現方法已經有274次圍觀

http://coctec.com/docs/java/show-post-237512.html