1:概述

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

  • properties files

  • yaml files

  • environment variables

  • command-line arguments

使用外部化配置方式:

  • @Value注解

  • Environment抽象(Spring环境接口抽象)

  • @ConfigurationProperties

  • PropertySource(文件属性抽象)

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

Spring Boot配置篇(基于Spring Boot 2.0系列)的更多相关文章

  1. Spring Boot入门篇(基于Spring Boot 2.0系列)

    1:概述: Spring Boot是用来简化Spring应用的初始化开发过程. 2:特性: 创建独立的应用(jar|war形式); 需要用到spring-boot-maven-plugin插件 直接嵌 ...

  2. Spring Boot简化了基于Spring的应用开发

    Spring Boot简化了基于Spring的应用开发,通过少量的代码就能创建一个独立的.产品级别的Spring应用. Spring Boot为Spring平台及第三方库提供开箱即用的设置,这样你就可 ...

  3. Spring Data JPA例子[基于Spring Boot、Mysql]

    关于Spring Data Spring社区的一个顶级工程,主要用于简化数据(关系型&非关系型)访问,如果我们使用Spring Data来开发程序的话,那么可以省去很多低级别的数据访问操作,如 ...

  4. Spring Cloud实战: 基于Spring Cloud Gateway + vue-element-admin 实现的RBAC权限管理系统,实现网关对RESTful接口方法权限和自定义Vue指令对按钮权限的细粒度控制

    一. 前言 信我的哈,明天过年. 这应该是农历年前的关于开源项目 的最后一篇文章了. 有来商城 是基于 Spring Cloud OAuth2 + Spring Cloud Gateway + JWT ...

  5. Spring实战5:基于Spring构建Web应用

    主要内容 将web请求映射到Spring控制器 绑定form参数 验证表单提交的参数 对于很多Java程序员来说,他们的主要工作就是开发Web应用,如果你也在做这样的工作,那么你一定会了解到构建这类系 ...

  6. Spring框架第一篇之Spring的第一个程序

    一.下载Spring的jar包 通过http://repo.spring.io/release/org/springframework/spring/地址下载最新的Spring的zip包,当然,如果你 ...

  7. [原创]java WEB学习笔记103:Spring学习---Spring Bean配置:基于注解的方式(基于注解配置bean,基于注解来装配bean的属性)

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  8. shiro开发,shiro的环境配置(基于spring+springMVC+redis)

    特别感谢lhacker分享的文章,对我帮助很大 http://www.aiuxian.com/article/p-1913280.html 基本的知识就不在这里讲了,在实战中体会shiro的整体设计理 ...

  9. Spring第七篇【Spring的JDBC模块】

    前言 上一篇Spring博文主要讲解了如何使用Spring来实现AOP编程,本博文主要讲解Spring的对JDBC的支持- 对于JDBC而言,我们肯定不会陌生,我们在初学的时候肯定写过非常非常多的JD ...

随机推荐

  1. 采用API将AR应收账款未知未核销状态变成黄金

    DECLARE p_api_version NUMBER; p_init_msg_list VARCHAR2(200); p_commit VARCHAR2(200); p_validation_le ...

  2. C# 从零开始写 SharpDx 应用 控制台创建 Sharpdx 窗口

    原文:C# 从零开始写 SharpDx 应用 控制台创建 Sharpdx 窗口 版权声明:博客已迁移到 http://lindexi.gitee.io 欢迎访问.如果当前博客图片看不到,请到 http ...

  3. Android真机调试不打印日志解决

    1.在拨号界面输入:*#*#2846579#*#* 进入测试菜单界面. 2.Project Menu–后台设置–LOG设置 3.LOG开关–LOG打开 LOG级别设置–VERBOSE 4.Dump&a ...

  4. 【转】cygwin中文乱码(打开gvim中文乱码、安装svn后乱码)

    想用cygwin less看log,可能包含德语.格式是乱的,很多类似"ESC"之类的乱码. 结果这个解决方案似乎也不错,有排版,有颜色高亮. ------------------ ...

  5. java学习笔记(8)——多线程

    进程:是一个程序在其自身的地址空间的一次执行活动. 线程:(区别于进程)线程没有独立的存储空间. 几个概念:时间片 线程  进程   能不能够用多进程代替多线程呢? 两个进程切换时要交换内存空间,而多 ...

  6. 从FrameworkElement对象创建Cursor对象

    原文:从FrameworkElement对象创建Cursor对象 Normal 0 false false false EN-US ZH-CN X-NONE MicrosoftInternetExpl ...

  7. Akka边学边写(1)-- Hello, World!

    Akka Akka是什么呢?直接引用Akka站点上面的描写叙述吧: Akka is a toolkit and runtime for building highly concurrent, dist ...

  8. 线程池;java的线程池的实现原理;适用于频繁互动(如电商网站)

    线程池是一种多线程处理形式,处理过程中将任务加入到队列,然后在创建线程后自己主动启动这些任务.线程池线程都是后台线程.每一个线程都使用默认的堆栈大小,以默认的优先级执行.并处于多线程单元中. 假设某个 ...

  9. Linux 下非 root 用户安装 theano(配置 GPU)

    非 root 用户,安装 Python 第三方的包,尤其像 theano,存在大量的依赖项,存在的主要问题,是安装各个包时的权限问题.所幸,存在这样一个集成工具,叫 anaconda,其已经内置了许多 ...

  10. .net reactor 学习系列(一)---.net reactor介绍

    原文:.net reactor 学习系列(一)---.net reactor介绍       学习.net已经一年多了,从语言的编写到框架类库的运用再到.net三大解决方案的了解(WF,WCF,WPF ...