2、SpringBoot 配置
SpringBoot 配置
設計目的
SpringBoot
雖然幹掉了 XML
,但未做到零配置,它體現出了一種約定優於配置,也稱作按約定程式設計,是一種軟體設計正規化 。
一般情況下預設的配置足夠滿足日常開發所需,但在特殊的情況下,我們往往需要用到自定義屬性配置、自定義檔案配置、多環境配置、外部命令引導等一系列功能。這些只需要遵循 SpringBoot
的規則配置即可 。
常用配置舉例
在application.properties中修改:
#server.port = # 修改埠號 預設為8080 #server.address = # bind to a specific NIC #server.session-timeout= # session timeout in seconds #the context path, defaults to '/' #server.servlet.context-path = /springboot # 修改context-path 預設為 / #server.servlet-path= # the servlet path, defaults to '/' #server.tomcat.access-log-pattern= # log pattern of the access log #server.tomcat.access-log-enabled=false # is access logging enabled #server.tomcat.protocol-header=x-forwarded-proto # ssl forward headers #server.tomcat.remote-ip-header=x-forwarded-for #server.tomcat.basedir=/tmp # base dir (usually not needed, defaults to tmp) #server.tomcat.background-processor-delay=30; # in seconds #server.tomcat.max-threads = 0 # number of threads in protocol handler #server.tomcat.uri-encoding = UTF-8 # character encoding to use for URL decoding
推薦使用:application.yml
修改server配置:
修改埠號
修改context-path 預設為 /
server:
port: 8888
servlet:
context-path: /springboot
上面的不用重複寫,但是冒號後面必須有空格 。
自定義配置屬性——application.yml
中配置
pom
中配置:
<dependency>
<groupId>org.springframework.boot</groupId>
< artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
application.yml
中配置:
my:
name: yangshuo
age: 23
定義 MyConfig.java
檔案,用來對映我們在 application.yml
中的內容,這樣一來我們就可以通過操作物件的方式來獲得配置檔案的內容了 。
package cn.ylx. config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "my")
public class MyConfig {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "MyConfig{" +
"age = " + age +
", name = '" + name + '\'' +
'}';
}
}
定義 MyConfigController
用來注入 MyConfig
測試我們編寫的程式碼。
注意: Spring 4.x
以後,推薦使用建構函式的形式注入屬性。
package cn.ylx.controller;
import cn.ylx.config.MyConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/config")
@RestController
public class MyConfigController {
private static final Logger log = LoggerFactory.getLogger(MyConfigController.class);
private final MyConfig myConfig;
@Autowired
public MyConfigController(MyConfig myConfig){
this.myConfig = myConfig;
}
@GetMapping("/test")
public MyConfig myConfig(){
log.info("=================================================================================================");
log.info(myConfig.toString());
log.info("=================================================================================================");
return myConfig;
}
}
測試:
瀏覽器輸入:http://localhost:8080/config/test
顯示: {"name":"yangshuo","age":23}
控制檯列印:
2018-12-01 14:32:53.394 INFO 9408 --- [nio-8080-exec-1] cn.ylx.controller.MyConfigController : =================================================================================================
2018-12-01 14:32:53.394 INFO 9408 --- [nio-8080-exec-1] cn.ylx.controller.MyConfigController : MyConfig{age = 23, name = 'yangshuo'}
2018-12-01 14:32:53.394 INFO 9408 --- [nio-8080-exec-1] cn.ylx.controller.MyConfigController : =================================================================================================
自定義配置屬性——自定義 properties
配置檔案
pom
中配置:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
定義一個名為 my.properties
的資原始檔。
my2.name=yangshuo
my2.age=23
定義 MyConfig2.java
檔案,用來對映我們在 my.properties
中的內容,這樣一來我們就可以通過操作物件的方式來獲得配置檔案的內容了 。
package cn.ylx.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
@Component
@PropertySource("classpath:conf/my.properties")
@ConfigurationProperties(prefix = "my2")
public class MyConfig2 {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "MyConfig{" +
"age = " + age +
", name = '" + name + '\'' +
'}';
}
}
定義 MyConfigController
用來注入 MyConfig2
測試我們編寫的程式碼。
注意: Spring 4.x
以後,推薦使用建構函式的形式注入屬性。
package cn.ylx.controller;
import cn.ylx.config.MyConfig;
import cn.ylx.config.MyConfig2;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/config")
@RestController
public class MyConfigController {
private static final Logger log = LoggerFactory.getLogger(MyConfigController.class);
private final MyConfig myConfig;
private final MyConfig2 myConfig2;
@Autowired
public MyConfigController(MyConfig myConfig ,MyConfig2 myConfig2){
this.myConfig = myConfig;
this.myConfig2 = myConfig2;
}
@GetMapping("/test")
public MyConfig myConfig(){
log.info("=================================================================================================");
log.info(myConfig.toString());
log.info("=================================================================================================");
return myConfig;
}
@GetMapping("/test2")
public MyConfig2 myConfig2(){
log.info("=================================================================================================");
log.info(myConfig2.toString());
log.info("=================================================================================================");
return myConfig2;
}
}
測試:
瀏覽器輸入:http://localhost:8080/config/test2
顯示: {"name":"yangshuo","age":23}
控制檯列印:
2018-12-01 15:04:55.457 INFO 228 --- [nio-8080-exec-1] cn.ylx.controller.MyConfigController : =================================================================================================
2018-12-01 15:04:55.457 INFO 228 --- [nio-8080-exec-1] cn.ylx.controller.MyConfigController : MyConfig{age = 23, name = 'yangshuo'}
2018-12-01 15:04:55.457 INFO 228 --- [nio-8080-exec-1] cn.ylx.controller.MyConfigController : =================================================================================================
多環境化配置
在真實的應用中,常常會有多個環境(如:開發,測試,生產等),不同的環境資料庫連線都不一樣,這個時候就需要用到 spring.profile.active
的強大功能了,它的格式為 application-{profile}.properties
,這裡的 application
為字首不能改,{profile} 是我們自己定義的。
建立 application-dev.properties
、 application-test.properties
、 application-prod.properties
,內容分別如下
application-dev.properties
server.servlet.context-path=/dev
application-test.properties
server.servlet.context-path=/test
application-prod.properties
server.servlet.context-path=/prod
在 application.properties
配置檔案中寫入 spring.profiles.active=dev
,這個時候我們在次訪問 http://localhost:8080/config/test2 就沒用處了,因為我們設定了它的 context-path=/dev
,所以新的路徑就是 http://localhost:8080/dev/config/test2 ,由此可以看出來我們啟用不同的配置讀取的屬性值是不一樣的。
外部命令引導
假設這樣的場景,我們對已經開發完成的程式碼打包釋出,期間在測試環境測試通過了,那麼即可釋出上生產,這個時候是修改 application.properties
的配置方便還是直接在命令引數配置方便呢,毫無疑問是後者更有說服力。預設情況下, SpringApplication
會將命令列選項引數(即: –property
,如 –server.port=9000
)新增到 Environment
,命令列屬性始終優先於其他屬性源。
測試:
進入到專案目錄,此處以我本地目錄為主:D:/ylx/springboot/
然後開啟 cmd 程式,輸入:mvn package
打包完畢後進入到:D:/ylx/springboot/ 目錄中去,我們可以發現一個名為springboot-0.0.1-SNAPSHOT.jar 的包
接著在開啟 cmd 程式,輸入:java -jar springboot-0.0.1-SNAPSHOT.jar --spring.profiles.active=test --my1.age=32。仔細觀察spring.profiles.active=test、my1.age=32 這倆配置的鍵值是不是似曾相識(不認識的請從開頭認真閱讀)
最後輸入測試地址:http://localhost:8080/test/config/test 我們可以發現返回的JSON變成了 {“age”:32,“name”:“battcn”} 表示正確