spring boot 与配置
2019独角兽企业重金招聘Python工程师标准>>>
Spring Boot允许外化(externalize)你的配置,这样你能够在不同的环境下使用相同的代码。你可以使用properties文件,YAML文件,环境变量和命令行参数来外化配置。使用@Value
注解,可以直接将属性值注入到你的beans中,并通过Spring的Environment
抽象或绑定到结构化对象来访问。
Spring Boot使用PropertySource
次序来允许对值进行合理的覆盖,需要以下面的次序考虑属性:
- 命令行参数
- 来自于
java:comp/env
的JNDI属性 - Java系统属性(
System.getProperties()
) - 操作系统环境变量只有在random.*里包含的属性会产生一个
RandomValuePropertySource
- 在打包的jar外的应用程序配置文件(application.properties,包含YAML和profile变量)
- 在打包的jar内的应用程序配置文件(application.properties,包含YAML和profile变量)
- 在
@Configuration
类上的@PropertySource
注解 - 默认属性(使用
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中:
- 当前目录下的一个
/config
子目录 - 当前目录
- 一个classpath下的
/config
包 - 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
区别不同的运行环境。例如:
application-dev.properties
:开发环境application-test.properties
:测试环境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 与配置相关推荐
- Spring Boot 属性配置和使用
spring Boot 允许通过外部配置让你在不同的环境使用同一应用程序的代码,简单说就是可以通过配置文件来注入属性或者修改默认的配置. Spring Boot 系列 Spring Boot 入门 S ...
- springboot原生mysql写法_【Rainbond最佳实践】Spring Boot框架配置MySQL
Rainbond开源软件介绍: Rainbond是国内首个开源的生产级无服务器PaaS. 深度整合基于Kubernetes的容器管理.多类型CI/CD应用构建与交付.多数据中心的资源管理等技术,提供云 ...
- spring boot自动配置
首先,一般的java Web项目需要很多配置,web配置(web.xml).spring配置(默认叫applicationContext.xml),非常繁琐 而spring-boot-starter是 ...
- Spring Boot自动配置原理
要了解Spring Boot的自动配置首先我需要先了解Spring Boot的两个机制,一个是配置文件如何进入到系统变成属性,二是如何将这些属性加入到容器中. 首先我们需要有一个组件,这个组件中的属性 ...
- Spring Boot - 自动配置实例解读
文章目录 Pre 启用 debug=true输出自动配置 HttpEncodingAutoConfiguration 什么情况下,Spring Boot 会自动装配 HttpEncodingAutoC ...
- Spring Boot自动配置原理、实战
Spring Boot自动配置原理 Spring Boot的自动配置注解是@EnableAutoConfiguration, 从上面的@Import的类可以找到下面自动加载自动配置的映射. org.s ...
- Spring boot的配置类
@Configuration 指明当前类是一个配置类 来替代之前的Spring配置文件 Spring boot的配置类 相当于Spring的配置文件 容器添加组件 Spring,通过配置文件添加组件 ...
- Spring Boot自动配置原理分析
一.写在前面 随着时间的迁移Spring Boot 越来越多的出现在Java 后端程序员的视野中,Spring Boot 之所以会那么流行,很大的一个原因是自身集成了很多的Bean,简化了传统Srin ...
- 在Spring Boot中配置web app
文章目录 添加依赖 配置端口 配置Context Path 配置错误页面 在程序中停止Spring Boot 配置日志级别 注册Servlet 切换嵌套服务器 在Spring Boot中配置web a ...
- 芋道 Spring Boot 自动配置原理
转载自 芋道 Spring Boot 自动配置原理 1. 概述 友情提示:因为本文是分享 Spring Boot 自动配置的原理,所以需要胖友有使用过 Spring Boot 的经验.如果还没使用过 ...
最新文章
- 生成模型和判别模型的区别
- ifconfig命令找不到_02. Linux命令之查看网络连接
- tensorflow代码中的tf.app.run()
- java环境变量都是什么意思_Java环境变量,真的还有必要配吗?
- 关于SO引用的过滤:abiFilters
- perl中的文件句柄
- CentOS6.7安装Python3.4
- mysql中表结构语句_mysql中表数据与表结构复制语句
- 读《人月神话》的感想(一)——关于组织结构沟通能力优劣的量化
- 34. 脱壳篇-FSG压缩壳、ImportREC修复IAT输入表的使用,令一种寻找OEP方式
- 常见的几种JavaScript设计模式
- 标识符,注释,常量,变量
- Ubuntu开机加速
- BZOJ4200 洛谷2304 UOJ132:[NOI2015]小园丁与老司机——题解
- Python批量修改图片名称
- 加快人工智能与学生学习等融合,实现教育更高质量发展
- 魔乐科技安卓开发教程----李兴华----01文件存储
- 银河麒麟V10龙芯3A4000桌面操作系统安装qt后,无法自动配置编译器,需手动添加方法
- 基于STM32高级定时器的全桥移相PWM发波方案
- FarPoint.Win.Spread 自定义表头
热门文章
- PHP学习笔记三(数组API)
- Bootstrap模态框的基本使用(复制可用)
- java中ping多个ip_在Java中ping多个服务器
- 编译OpenJDK8-u332:/bin/sh: 1: [: -a: unexpected operator/line 0: [: too many arguments
- 脚本变量中包含空格的解决办法
- LINUX下载编译libtheora
- LINUX用户执行过的命令,保存在.bash_history
- 昨天又发火了:领导拒不给他人安排工作
- 用C#代码实现求两条线段的交点并判断各种情况
- 微型计算机基础知识提纲,自考“微型计算机应用基础”自考大纲(6)