2019独角兽企业重金招聘Python工程师标准>>>

Spring Boot允许外化(externalize)你的配置,这样你能够在不同的环境下使用相同的代码。你可以使用properties文件YAML文件环境变量命令行参数来外化配置。使用@Value注解,可以直接将属性值注入到你的beans中,并通过Spring的Environment抽象或绑定到结构化对象来访问。
Spring Boot使用PropertySource次序来允许对值进行合理的覆盖,需要以下面的次序考虑属性:

  1. 命令行参数
  2. 来自于java:comp/env的JNDI属性
  3. Java系统属性(System.getProperties()
  4. 操作系统环境变量只有在random.*里包含的属性会产生一个RandomValuePropertySource
  5. 在打包的jar外的应用程序配置文件(application.properties,包含YAML和profile变量)
  6. 在打包的jar内的应用程序配置文件(application.properties,包含YAML和profile变量)
  7. @Configuration类上的@PropertySource注解
  8. 默认属性(使用SpringApplication.setDefaultProperties指定)

例如:

import org.springframework.stereotype.*
import org.springframework.beans.factory.annotation.*@Component
public class MyBean {@Value("${name}")private String name;// ...
}

你可以将一个application.properties文件捆绑到jar内,用来提供一个合理的默认name属性值。
当运行在生产环境时,可以在jar外提供一个application.properties文件来覆盖name属性。
对于一次性的测试,你可以使用特定的命令行开关启动(比如,java -jar app.jar --name="Spring")。

默认情况下,SpringApplication将任何可选的命令行参数(以'--'开头,比如,--server.port=9000)转化为property,并将其添加到Spring Environment中。如上所述,命令行属性总是优先于其他属性源
如果你不想将命令行属性添加到Environment里,你可以使用SpringApplication.setAddCommandLineProperties(false)来禁止它们。

注意:在命令行添加的参数会添加到Spring Environment。

配置随机值

RandomValuePropertySource在注入随机值(比如,密钥或测试用例)时很有用。它能产生整数,longs或字符串,比如:

my.secret=${random.value}
my.number=${random.int}
my.bignumber=${random.long}
my.number.less.than.ten=${random.int(10)}
my.number.in.range=${random.int[1024,65536]}

random.int*语法是OPEN value (,max) CLOSE,此处OPEN,CLOSE可以是任何字符,并且value,max是整数。如果提供max,那么value是最小的值,max是最大的值(不包含在内)。

Application属性

SpringApplication将从以下位置加载application.properties文件,并把它们添加到Spring Environment中:

  1. 当前目录下的一个/config子目录
  2. 当前目录
  3. 一个classpath下的/config
  4. classpath根路径(root)

这个列表是按优先级排序的(列表中位置高的将覆盖位置低的)。

注:你可以使用YAML(.yml)文件替代.properties

如果不喜欢将application.properties作为配置文件名,你可以通过指定spring.config.name环境属性来切换其他的名称。你也可以使用spring.config.location环境属性来引用一个明确的路径(目录位置或文件路径列表以逗号分割)。

$ java -jar myproject.jar --spring.config.name=myproject
//or
$ java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties

如果spring.config.location包含目录(相对于文件),那它们应该以/结尾(在加载前,spring.config.name产生的名称将被追加到后面)。即此时使用的是spring.config.location+spring.config.name文件作为默认加载文件。

不管spring.config.location是什么值,默认的搜索路径classpath:,classpath:/config,file:,file:config/总会被使用。以这种方式,你可以在application.properties中为应用设置默认值,然后在运行的时候使用不同的文件覆盖它,同时保留默认配置。

注:如果你使用环境变量而不是系统配置,大多数操作系统不允许以句号分割(period-separated)的key名称,但你可以使用下划线(underscores)代替(比如,使用SPRING_CONFIG_NAME代替spring.config.name)。如果你的应用运行在一个容器中,那么JNDI属性(java:comp/env)或servlet上下文初始化参数可以用来取代环境变量或系统属性,当然也可以使用环境变量或系统属性。

特定的profile

除了application.properties文件,特定配置属性也能通过命令惯例application-{profile}.properties来定义。特定Profile属性从跟标准application.properties相同的路径加载,并且特定profile文件会覆盖默认的配置。

在多环境下,使用特定的属性application-{profile}.properties区别不同的运行环境。例如:

  1. application-dev.properties:开发环境
  2. application-test.properties:测试环境
  3. application-prod.properties:生产环境

至于哪个具体的配置文件会被加载,需要在application.properties文件中通过spring.profiles.active属性来设置,其值对应{profile}值,会加载对应的application-{profile}.properties属性文件。例如在application.properties中设置spring.profiles.active=dev,那么就会加载application-dev.properties作为运行属性。

由于命令行属性可覆盖其他情况下设置的属性,所以使用java -jar jarname.jar --spring.profiles.active=prod会覆盖application.properties中设置的spring.profiles.active=dev,会加载application-prod.properties作为运行时属性。

所以,一般在application.properties中设置spring.profiles.active=dev,在线上环境使用命令行配置的方式覆盖profile设置

占位符语法

application.properties里的值被使用时,它们会被存在的Environment过滤,所以你能够引用先前定义的值(比如,系统属性)。

app.name=MyApp
app.description=${app.name} is a Spring Boot application

上述设置中app.description中的值${app.name},会被之前设置的app.name=MyApp替代。

使用YAML替代properties文件

Spring框架提供两个便利的类用于加载YAML文档,YamlPropertiesFactoryBean会将YAML作为Properties来加载,YamlMapFactoryBean会将YAML作为Map来加载。

示例:

environments:dev:url: http://dev.bar.comname: Developer Setupprod:url: http://foo.bar.comname: My Cool App

上面的YAML文档会被转化到下面的属性中:

environments.dev.url=http://dev.bar.com
environments.dev.name=Developer Setup
environments.prod.url=http://foo.bar.com
environments.prod.name=My Cool App

YAML列表被表示成使用[index]间接引用作为属性keys的形式,例如下面的YAML:

my:servers:- dev.bar.com- foo.bar.com

将会转化到下面的属性中:

my.servers[0]=dev.bar.com
my.servers[1]=foo.bar.com

使用Spring DataBinder工具绑定属性(这是@ConfigurationProperties做的事),你需要确定目标bean中有个java.util.List或Set类型的属性,并且需要提供一个setter或使用可变的值初始化它,比如,下面的代码将绑定上面的属性:

@ConfigurationProperties(prefix="my")
public class Config {private List<String> servers = new ArrayList<String>();public List<String> getServers() {return this.servers;}
}

加载

YamlPropertySourceLoader类能够用于将YAML作为一个PropertySource导出到Sprig Environment。这允许你使用熟悉的@Value注解和占位符语法访问YAML属性。

YAML文件不能通过@PropertySource注解加载。所以,在这种情况下,如果需要使用@PropertySource注解的方式加载值,那就要使用properties文件。

multi-profiles YAML文档

你可以在单个文件中定义多个profile配置(profile-specific)的YAML文档,并通过一个spring.profiles key标示应用的文档。例如:

server:address: 192.168.1.100
---
spring:profiles: development
server:address: 127.0.0.1
---
spring:profiles: production
server:address: 192.168.1.120

在上面的例子中,如果development配置被激活,那server.address属性将是127.0.0.1。如果development和production配置(profiles)没有启用,则该属性的值将是192.168.1.100。

类型安全的配置属性-ConfigurationProperties注解

使用@Value("${property}")注解注入配置属性有时可能比较笨重,特别是需要使用多个properties或你的数据本身有层次结构。为了控制和校验你的应用配置,Spring Boot提供一个允许强类型beans的替代方法来使用properties。

示例:

你可以通过在@EnableConfigurationProperties注解中直接简单的列出属性类来快捷的注册@ConfigurationProperties bean的定义。

@Configuration
@EnableConfigurationProperties(ConnectionSettings.class)
public class MyConfiguration {
}
@Component
@ConfigurationProperties(prefix="connection")
public class ConnectionSettings {private String username;private InetAddress remoteAddress;// ... getters and setters
}

@EnableConfigurationProperties注解应用到你的@Configuration时,任何被@ConfigurationProperties注解的beans将自动被Environment属性配置。这种风格的配置特别适合与SpringApplication的外部YAML配置进行配合使用。

# application.yml
connection:username: adminremoteAddress: 192.168.1.1
# additional configuration as required

使用:为了使用@ConfigurationProperties beans,你可以使用与其他任何bean相同的方式注入它们。

@Service
public class MyService {@Autowiredprivate ConnectionSettings connection;//...@PostConstructpublic void openConnection() {Server server = new Server();this.connection.configure(server);}
}

第三方类属性设置

@ConfigurationProperties可以方便的设置第三方类的属性,该注解由spring-boot-configuration-processor提供。

为了从Environment属性配置一个bean,将@ConfigurationProperties添加到它的bean注册过程:

@ConfigurationProperties(prefix = "foo")
@Bean
public FooComponent fooComponent() {...
}

和上面ConnectionSettings的示例方式相同,任何以foo为前缀的属性定义都会被映射到FooComponent上。

注: 可以在带有@Component的类或者@bean等,定义bean的时候使用@ConfigurationProperties注解,自动从Spring Environment 获取相关的属性。

松散类型

Spring Boot使用一些宽松的规则用于绑定Environment属性到@ConfigurationProperties beans,所以Environment属性名和bean属性名不需要精确匹配。常见的示例中有用的包括虚线分割(比如,context--path绑定到contextPath)和将环境属性转为大写字母(比如,PORT绑定port)。
示例:

@Component
@ConfigurationProperties(prefix="person")
public class ConnectionSettings {private String firstName;
}

下面的属性名都能用于上面的@ConfigurationProperties类:

属性 说明
person.firstName 标准驼峰规则
person.first-name 虚线表示,推荐用于.properties和.yml文件
PERSON_FIRST_NAME 大写形式,使用系统环境变量时推荐

Spring会尝试强制外部的应用属性在绑定到@ConfigurationProperties beans时类型是正确的。如果需要自定义类型转换,你可以提供一个ConversionService bean(bean id为conversionService)或自定义属性编辑器(通过一个CustomEditorConfigurer bean)。

@ConfigurationProperties校验

Spring Boot将尝试校验外部的配置,默认使用JSR-303(如果在classpath路径中)。你可以轻松的为你的@ConfigurationProperties类添加JSR-303 javax.validation约束注解:

@Component
@ConfigurationProperties(prefix="connection")
public class ConnectionSettings {@NotNullprivate InetAddress remoteAddress;// ... getters and setters
}

你也可以通过创建一个叫做configurationPropertiesValidator的bean来添加自定义的Spring Validator。

转载于:https://my.oschina.net/hgfdoing/blog/740099

spring boot 与配置相关推荐

  1. Spring Boot 属性配置和使用

    spring Boot 允许通过外部配置让你在不同的环境使用同一应用程序的代码,简单说就是可以通过配置文件来注入属性或者修改默认的配置. Spring Boot 系列 Spring Boot 入门 S ...

  2. springboot原生mysql写法_【Rainbond最佳实践】Spring Boot框架配置MySQL

    Rainbond开源软件介绍: Rainbond是国内首个开源的生产级无服务器PaaS. 深度整合基于Kubernetes的容器管理.多类型CI/CD应用构建与交付.多数据中心的资源管理等技术,提供云 ...

  3. spring boot自动配置

    首先,一般的java Web项目需要很多配置,web配置(web.xml).spring配置(默认叫applicationContext.xml),非常繁琐 而spring-boot-starter是 ...

  4. Spring Boot自动配置原理

    要了解Spring Boot的自动配置首先我需要先了解Spring Boot的两个机制,一个是配置文件如何进入到系统变成属性,二是如何将这些属性加入到容器中. 首先我们需要有一个组件,这个组件中的属性 ...

  5. Spring Boot - 自动配置实例解读

    文章目录 Pre 启用 debug=true输出自动配置 HttpEncodingAutoConfiguration 什么情况下,Spring Boot 会自动装配 HttpEncodingAutoC ...

  6. Spring Boot自动配置原理、实战

    Spring Boot自动配置原理 Spring Boot的自动配置注解是@EnableAutoConfiguration, 从上面的@Import的类可以找到下面自动加载自动配置的映射. org.s ...

  7. Spring boot的配置类

    @Configuration 指明当前类是一个配置类 来替代之前的Spring配置文件 Spring boot的配置类 相当于Spring的配置文件 容器添加组件 Spring,通过配置文件添加组件 ...

  8. Spring Boot自动配置原理分析

    一.写在前面 随着时间的迁移Spring Boot 越来越多的出现在Java 后端程序员的视野中,Spring Boot 之所以会那么流行,很大的一个原因是自身集成了很多的Bean,简化了传统Srin ...

  9. 在Spring Boot中配置web app

    文章目录 添加依赖 配置端口 配置Context Path 配置错误页面 在程序中停止Spring Boot 配置日志级别 注册Servlet 切换嵌套服务器 在Spring Boot中配置web a ...

  10. 芋道 Spring Boot 自动配置原理

    转载自  芋道 Spring Boot 自动配置原理 1. 概述 友情提示:因为本文是分享 Spring Boot 自动配置的原理,所以需要胖友有使用过 Spring Boot 的经验.如果还没使用过 ...

最新文章

  1. 生成模型和判别模型的区别
  2. ifconfig命令找不到_02. Linux命令之查看网络连接
  3. tensorflow代码中的tf.app.run()
  4. java环境变量都是什么意思_Java环境变量,真的还有必要配吗?
  5. 关于SO引用的过滤:abiFilters
  6. perl中的文件句柄
  7. CentOS6.7安装Python3.4
  8. mysql中表结构语句_mysql中表数据与表结构复制语句
  9. 读《人月神话》的感想(一)——关于组织结构沟通能力优劣的量化
  10. 34. 脱壳篇-FSG压缩壳、ImportREC修复IAT输入表的使用,令一种寻找OEP方式
  11. 常见的几种JavaScript设计模式
  12. 标识符,注释,常量,变量
  13. Ubuntu开机加速
  14. BZOJ4200 洛谷2304 UOJ132:[NOI2015]小园丁与老司机——题解
  15. Python批量修改图片名称
  16. 加快人工智能与学生学习等融合,实现教育更高质量发展
  17. 魔乐科技安卓开发教程----李兴华----01文件存储
  18. 银河麒麟V10龙芯3A4000桌面操作系统安装qt后,无法自动配置编译器,需手动添加方法
  19. 基于STM32高级定时器的全桥移相PWM发波方案
  20. FarPoint.Win.Spread 自定义表头

热门文章

  1. PHP学习笔记三(数组API)
  2. Bootstrap模态框的基本使用(复制可用)
  3. java中ping多个ip_在Java中ping多个服务器
  4. 编译OpenJDK8-u332:/bin/sh: 1: [: -a: unexpected operator/line 0: [: too many arguments
  5. 脚本变量中包含空格的解决办法
  6. LINUX下载编译libtheora
  7. LINUX用户执行过的命令,保存在.bash_history
  8. 昨天又发火了:领导拒不给他人安排工作
  9. 用C#代码实现求两条线段的交点并判断各种情况
  10. 微型计算机基础知识提纲,自考“微型计算机应用基础”自考大纲(6)