前言
SpringBoot 完全摒棄了xml配置的模式,幾乎做到了“零配置”。說是“幾乎”,是因為一般情況下預設的配置足夠滿足日常開發所需,但是在特殊的情況下,我們往往需要用到自定義屬性配置、自定義檔案配置、多環境配置、外部命令引導等一系列功能。
SpringBoot 使用的全域性配置檔案 application.properties 的作用是對一些預設配置的值進行修改。配置檔案通常放在src/main/resources目錄下或者類路徑的/config下。application.properties 是springboot 專案的主配置檔案。
本節內容包括:
- 預設配置
- 自定義配置檔案
- 多環境配置
- 外部配置
預設配置
預設屬性
SpringBoot 的預設屬性有很多,如以上所說,一般情況下預設的配置足夠滿足日常開發所需。
針對 SpringBoot 的預設屬性,我們可以參照官方文件:
https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
自定義屬性
準備工作
在介紹自定義屬性之前,為了提升開發者的體驗(所以不是必須的依賴),先來做一下準備工作,那就是引入 maven 依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
因為,在常用的IDE中,不會有屬性提示。該依賴只會在編譯時呼叫,所以不用擔心會對生產造成影響。
自定義屬性
通常情況下,一些常用的屬性,可以直接在 SpringBoot 的主配置檔案 application.properties 中自定義。
例如:
server.port=8083
# 自定義屬性(單個)
yanfei1819.name=admin
yanfei1819.age=26
讀取以上配置資訊:
package com.yanfei1819.configdemo.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* Created by 追夢1819 on 2019-05-06.
*/
@Controller
public class ReadApplicationConfigController {
@Value("${yanfei1819.name}")
private String name;
@Value("${yanfei1819.age}")
private int age;
@ResponseBody
@RequestMapping("/getProperties")
public String getProperties(){
return "我的姓名是:"+name+",我的年齡是:"+age;
}
}
用postman進行測試:
以上是讀取單個屬性,如果屬性比較多,這樣就比較麻煩了,也不符合物件導向的思想。下面通過物件來讀取配置資訊。
首先,在 application.properties 中配置。
# 演示自定義物件
class.student.name=zhangsan
class.student.age=20
class.student.grade=98.5
其次,建立實體類接受對應的屬性值。
package com.yanfei1819.configdemo.entity;
import org.springframework.boot.context.properties.ConfigurationProperties;
/**
* Created by 追夢1819 on 2019-05-06.
*/
@ConfigurationProperties(prefix = "class.student")
public class Student {
private String name;
private int age;
private Double grade;
// set/get 省略
}
注意,在啟動類上新增。
@EnableConfigurationProperties({Student.class})
最後,測試:
package com.yanfei1819.configdemo.config;
import com.yanfei1819.configdemo.entity.Student;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* Created by 追夢1819 on 2019-05-06.
*/
@Controller
public class ReadApplicationConfigController {
@Autowired
private Student student;
@ResponseBody
@RequestMapping("/getBeanProperties")
public String getBeanProperties(){
return "學生姓名是:"+student.getName()+",學生年齡是:"+student.getAge()+",學生分數是:"+student.getGrade();
}
}
測試結果是。
引數間的相互引用
class.student.description=姓名是${class.student.name},年齡是${class.student.age},分數是${class.student.grade}
然後同其他的屬性方式引用。
自定義配置檔案
一些特殊情況,需要的配置資訊很多,如果全部定義在主配置檔案中,會繁雜、難以維護。這個時候就需要自定義一些配置,將屬性進行分類,便於維護。以下以JDBC配置檔案為例,闡述自定義配置檔案以及屬性值的讀取方式。
首先,建立自定義配置檔案 jdbc.properties 。
jdbc.mysql.driverclassname=com.mysql.jdbc.Driver
jdbc.mysql.url=jdbc:mysql://127.0.0.1:3306/xxx
jdbc.mysql.username=root
jdbc.mysql.password=root
其次,建立對應的實體類。
package com.yanfei1819.configdemo.entity;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
/**
* Created by 追夢1819 on 2019-05-06.
*/
@Configuration
@ConfigurationProperties(prefix = "jdbc.mysql")
@PropertySource("classpath:jdbc.properties")
public class JdbcBean {
private String driverclassname;
private String url;
private String username;
private String password;
// set/get/toString 省略
}
最後,建立測試類。
package com.yanfei1819.configdemo.config;
import com.yanfei1819.configdemo.entity.JdbcBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* Created by 追夢1819 on 2019-05-06.
*/
@RestController
public class ReadCustomPropertiesController {
@Autowired
private JdbcBean jdbcBean;
@GetMapping("/getJdbcBean")
private String getJdbcBean(){
return jdbcBean.toString();
}
}
啟動程式,可見測試結果。
多環境配置
上述內容只是演示了最基本的功能。而在真是的專案中,往往有多個環境,比如開發、測試、生產的環境。可能每個環境的配置引數都不一樣。這個時候也需要我們自定義每個環境的配置檔案了。
不過,這不需要以上那麼複雜。因為SpringBoot 已經為我們做好了準備工作。只要遵循它提供的配置規則和格式即可。
1. 各個環境的配置檔案格式是:application-{profile}.properties ;
2. 在主配置檔案中新增屬性 spring.profile.active
即可。
例如:
生產環境配置檔案:application-prod.properties
開發環境配置檔案:application-dev.properties
引用開發環境的配置檔案,只要在 application.properties 中配置: spring.profiles.active=dev
。
外部配置
除了以上幾種配置方式。SpringBoot 還支援外部命令列配置。
例如,在啟動時修改程式埠號:java -jar xx.jar --server.port=9090
;
選擇對應環境配置:java -jar xx.jar --spring.profiles.active=test
等。其餘還有很多。由於篇幅所限,此處不一一展開。感興趣的可以自行深入瞭解。