Spring Boot配置篇(基於Spring Boot 2.0系列)

1:概述

SpringBoot支持外部化配置,配置文件格式以下所示:html

  • properties filesjava

  • yaml filesspring

  • environment variablesjson

  • command-line argumentsspringboot

使用外部化配置方式:session

  • @Value註解app

  • Environment抽象(Spring環境接口抽象)dom

  • @ConfigurationPropertieside

  • PropertySource(文件屬性抽象)spring-boot

2:自定義屬性

POM內容以下

    <dependencies>
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter</artifactId>
       </dependency>

       <!--生成spring-configuration-metadata.json文件,提示屬性-->
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-configuration-processor</artifactId>
           <scope>provided</scope>
       </dependency>

       <dependency>
           <groupId>org.projectlombok</groupId>
           <artifactId>lombok</artifactId>
       </dependency>
   </dependencies>

 

當使用Spring Boot開發項目時,Spring Boot會默認讀取classpath下application.properties

application.yml文件,詳情請查看源碼ConfigFileApplicationListener。這種自定義少許

屬性經常經過@Value註解進行加載,可是@Value所在類必須在Spring IOC容器中。

application.yml自定義屬性


hello:
user:
  name: "劉恩源"

讀取該屬性經常經過@Value註解進行讀取。


@Component
@Data
public class HelloUser {
//hello.user.name:default==>>表示當時該屬性在
   //spring Environment沒有找到取默認值default
   @Value("${hello.user.name:default}")
   private String userName;
}


/**
* 類描述: spring boot config
*
* @author liuenyuan
* @date 2019/6/16 11:36
* @describe
* @see org.springframework.beans.factory.annotation.Value
* @see org.springframework.context.annotation.PropertySource
* @see org.springframework.boot.context.properties.ConfigurationProperties
* @see org.springframework.boot.context.properties.EnableConfigurationProperties
* @see org.springframework.core.env.Environment
* @see org.springframework.context.annotation.Profile
* @see org.springframework.context.support.PropertySourcesPlaceholderConfigurer
*/
@SpringBootApplication
public class ConfigApplication {

   public static void main(String[] args) {
       ConfigurableApplicationContext context = SpringApplication.run(ConfigApplication.class, args);
       HelloUser helloUser = context.getBean(HelloUser.class);
       System.out.println(String.format("經過@Value註解讀取自定義的少許屬性: %s", helloUser.getUserName()));
       context.close();
  }
}

@Value註解注入使用狀況

轉載自:<https://www.cnblogs.com/wangbin2188/p/9014837.html>

  • 注入普通字符串

  • 注入操做系統屬性

  • 注入表達式結果

  • 注入其餘Bean屬性

  • 注入文件資源

  • 注入URL資源

  • 注入${...}來處理placeholder。


   @Value("normal")
   private String normal; // 注入普通字符串

   @Value("#{systemProperties['os.name']}")
   private String systemPropertiesName; // 注入操做系統屬性

   @Value("#{ T(java.lang.Math).random() * 100.0 }")
   private double randomNumber; //注入表達式結果

   @Value("#{beanInject.another}")
   private String fromAnotherBean; // 注入其餘Bean屬性:注入beanInject對象的屬性another,類具體定義見下面

   @Value("classpath:com/hry/spring/configinject/config.txt")
   private Resource resourceFile; // 注入文件資源

   @Value("http://www.baidu.com")
   private Resource testUrl; // 注入URL資源

3:將配置文件屬性賦給實體類

當有許多配置屬性(建議超過5這樣),能夠將這些屬性做爲字段來建立一個JavaBean,並將屬性賦給他們。例如

application.yml配置屬性以下:


person:
name: "劉恩源"
age: 21
school: "天津師範大學"

配置屬性類PersonProperties

@ConfigurationProperties註解是將properties配置文件轉換爲bean使用,默認是將application.yml

或者application.properties屬性轉換成bean使用。@PropertySource只支持properties結尾的文件。

@EnableConfigurationProperties註解的做用是@ConfigurationProperties註解生效,並將屬性

配置類註冊到Spring IOC容器中。 若是須要加載指定配置文件,可使用@PropertySource註解。

@ConfigurationProperties(prefix = "person")
@Data
public class PersonProperties {

   private String name;

   private Integer age;

   private String school;
}

@EnableConfigurationProperties({PersonProperties.class})
@Configuration
public class PersonConfiguration {

   private final PersonProperties personProperties;


   public PersonConfiguration(PersonProperties personProperties) {
       this.personProperties = personProperties;
       System.out.println(String.format("PersonProperties: %s", this.personProperties));
  }

   public PersonProperties getPersonProperties() {
       return personProperties;
  }
}

4:自定義配置文件

上面介紹了讀取默認配置文件application.yml|application.properties中的配置屬性。固然,咱們也能夠讀取

自定義的配置文件中屬性。目前官方使用@PropertySource註解導入自定義的配置文件屬性。

創建hello.properties

#load config properties
person.name=劉恩源
person.age=20
person.school=天津師範大學

創建PersonProperties.java

//創建聲明加載properties配置文件的encoding和name
@ConfigurationProperties(prefix = "person")
@Data
@PropertySource(value = {"classpath:/hello.properties"}, encoding = "UTF-8", name = "hello")
public class PersonProperties {

   private String name;

   private Integer age;

   private String school;
}

創建PersonConfiguration,使用@EnableConfigurationProperties激活@ConfigurationProperties

註解,將其標註的JavaBean注入到Spring IOC容器中。

@EnableConfigurationProperties({PersonProperties.class})
@Configuration
public class PersonConfiguration {

   private final PersonProperties personProperties;


   public PersonConfiguration(PersonProperties personProperties) {
       this.personProperties = personProperties;
       System.out.println(String.format("PersonProperties: %s", this.personProperties));
  }

   public PersonProperties getPersonProperties() {
       return personProperties;
  }
}

加載指定yml|yaml文件

配置以下:


public class YamlPropertiesConfiguration {
   
   @Bean
   public static PropertySourcesPlaceholderConfigurer properties() {
       PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
       YamlPropertiesFactoryBean yml = new YamlPropertiesFactoryBean();
       yml.setResources(new ClassPathResource("/hello.yml"));
       configurer.setProperties(yml.getObject());
       return configurer;
  }
}

能夠參照我實現的自定義註解@YmlPropertySource,加載yml|yaml文件,能夠大體實現和@PropertySource

註解一樣的功能

@YmlPropertySource實現加載yml|yaml文件

5:多環境配置

在企業開發環境中,須要不一樣的配置環境.SpringBoot使用spring.profiles.active屬性加載不一樣環境的配置文件,配置文件格式爲application-{profile}.properties|yml|yaml。{profile}對應環境標識。

  • application-test.yml:測試環境

  • application-dev.yml:開發環境

  • application.prod:生產環境

能夠在springboot默認配置文件application.yml經過配置spring.profiles.active激活環境。也能夠在

特定的類使用@Profile註解激活環境。該註解可使用邏輯運算符。

6:@ConfigurationProperties和@Value比較

特點 @ConfigurationProperties @Value
寬鬆綁定 YES NO
元數據支持 YES NO
SpEL表達式 NO YES

7:屬性轉換

能夠經過提供ConversionService bean(Bean的名字爲conversionService),或者註冊屬性修改器

(經過CustomEditorConfigure bean)或者Converters(帶有標記註解的@ConfigurationPropertiesBinding BeanDefinition)。

時間轉換(Duration),查看java.util.Duration(since jdk1.8)

示例以下:

經過JavaBean形式


/**
* 類描述:
*
* @author liuenyuan
* @date 2019/6/17 17:36
* @describe
* @see java.time.Duration
* @see org.springframework.boot.convert.DurationUnit
* @see ChronoUnit
*/
@ConfigurationProperties(prefix = "app.system")
@Data
public class AppSystemProperties {

   @DurationUnit(ChronoUnit.SECONDS)
   private Duration sessionTimeout = Duration.ofSeconds(30);

   @DurationUnit(ChronoUnit.SECONDS)
   private Duration readTimeout = Duration.ofSeconds(5);
}

經過配置文件形式:application.yml


app:
system:
  session-timeout: 30s
  read-timeout: 5s

其他時間配置形式:

  • ns(納秒)

  • us(微妙)

  • ms(毫秒)

  • s(秒)

  • m(分)

  • h(時)

  • d(天)

Data Sizes轉換(數據大小),查看DataSize(spring5.1支持),@DataSizeUnit

示例以下:

經過JavaBean形式

@ConfigurationProperties(prefix = "app.io")
@Data
public class AppIoProperties {

   @DataSizeUnit(DataUnit.MEGABYTES)
   private DataSize bufferSize = DataSize.ofMegabytes(2);
}

經過配置文件application.properties

app:
io:
bufferSize: 3MB

其他數據大小配置:

  • B(bytes)

  • KB

  • MB

  • GB

  • TB

相關文章
相關標籤/搜索