1. 程式人生 > >2、SpringBoot 配置

2、SpringBoot 配置

SpringBoot 配置

github原始碼

設計目的

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.propertiesapplication-test.propertiesapplication-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”} 表示正確