springboot2.1系列之第二篇 屬性配置

1.開發之前

屬性配置是開發必不可少的,配置的外部化有利於我們增刪改查配置,同時可以使我們應對不同的運行環境,spring boot可以使用property文件,yaml文件,系統屬性,命令行參數。這裏使用property文件,總結一下所有可能出現的屬性配置問題。依託於第一篇,我們把代碼重新整理一下:

package com;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class HelloApp {

    public static void main(String[] args) {
        SpringApplication.run(HelloApp.class, args);
    }
}

這裏把啓動應用類放到根包下,使用新的 @SpringBootApplication註解代替**@EnableAutoConfiguration**,新的註解集 @SpringBootConfiguration@EnableAutoConfiguration@ComponentScan於一身,自帶根包路徑掃描,啓用自動化配置。

我們在resource目錄下添加 application.properties屬性文件,添加一個自己的屬性配置:

hello=hello spring boot2
2.代碼中訪問屬性配置

在代碼裏訪問外部屬性配置,一般可以使用 @value直接將屬性配置注入到代碼的成員變量,或者使用 @ConfigurationProperties將一類屬性配置綁定到同一個對象,當然屬性配置的訪問須在spring的託管下。

1使用@value

package com.hello.properties;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class HelloProperties {

    @Value(value = "${hello}")
    private String hello;

    public String getHello() {
        return hello;
    }
}

如代碼所示,可以直接使用 @value註解給成員變量hello注入屬性值,這裏使用 @Component交由springboot掃描實例化,使用其它的spring組件註解等同。

2使用@ConfigurationProperties

使用此註解需要添加相關依賴:

<dependency>
	<groupId>org.springframework.boot</groupId>
   	<artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

這個功能比較強大,而且支持屬性嵌套,可以很好的支持面向對象的類和類成員變量,我們創建一個嵌套的java類。

package com.hello.properties;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

@Configuration
@ConfigurationProperties(prefix = "global")
public class GlobalProperties {

    private DemoProperties demo = new DemoProperties();

    public DemoProperties getDemo() {
        return demo;
    }
    public void setDemo(DemoProperties demo) {
        this.demo = demo;
    }
}
package com.hello.properties;

public class DemoProperties {

    private String name;
    private String date;
}
hello=hello spring boot2

global.demo.name=springboot2
global.demo.date=2019-11-14

global作爲大前綴下,我們把以demo爲前綴的同樣可以映射到一個實體類DemoProperties ,將demo作爲GlobalProperties的屬性注入進來,調用的地方統一使用GlobalProperties實例即可。注意成員變量命名要和屬性配置一致,其次要注意GlobalProperties也需要被spring掃描實例化才生效。下面在controller中驗證下:

package com.hello.controller;

import com.hello.properties.DemoProperties;
import com.hello.properties.GlobalProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
    @Autowired
    private GlobalProperties globalProperties;
	
	@RequestMapping("/welcome")
    String welcomme() {
        DemoProperties demo = globalProperties.getDemo();
        System.out.println(demo);
        return demo.toString();
    }
}

在這裏插入圖片描述

3.屬性配置針對不同的環境
application-{profile}.properties

可以按照上述文件命名方式區分多個環境,並且在application.properties文件中指定要生效的環境配置:

spring.profiles.active=dev

這樣我們可以將不同環境的屬性配置放到對應的屬性配置文件裏,這個和maven的profile是一個性質的,就是支持不同環境使用不同的屬性配置。

4.日誌相關屬性配置

通常使用的日誌組件有log4j,log4j2,logback等,如何在一個日誌配置文件中應對不同的環境?比如集成測試環境和生產環境日誌輸出文件目錄不一致,日誌輸出級別不一致等問題。因爲日誌的初始化是在應用加載早期完成的,所以傳統的屬性配置在日誌配置文件中是訪問不到的。下面以logback爲例:

爲了是spring可以更好的控制日誌初始化,建議使用logback-spring.xml命名日誌配置文件,爲了擴展支持日誌配置文件中的變量,spring會加載特定屬性鍵值到system property。比如我們在屬性文件中聲明:

logging.path=/app/demo

spring會添加 LOG_PATH 到system property,然後我們就可以直接在配置文件中使用**${LOG_PATH}**,再結合3中的不同環境的屬性配置,就可以在日誌配置中動態指定日誌目錄了。

<file>${LOG_PATH}/info.log</file>

同時,我們也可以在日誌配置文件中使用springProfile用來區分不同的環境配置。

<springProfile name="dev">
	<root level="debug">
		<appender-ref ref="CONSOLE" />
		<appender-ref ref="INFO_FILE" />
	</root>
</springProfile>
5.結束

屬性配置是開發中必不可少的,本文分享一下相關常規屬性配置以及日誌相關屬性的介紹。官網的資料非常詳盡,有問題我們可以一查官網文檔,二看源代碼。
比如,正常使用logback時,我們可以使用 :- 分隔符來指定屬性的默認值,在springboot裏我們需要使用 : 分隔符。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章