Spring Boot 2.0 教程 - 配置详解
Spring Boot 可以通过properties文件,YAML文件,环境变量和命令行参数进行配置。属性值可以通过,@Value注解,Environment或者ConfigurationProperties注入到应用中。 配置的优先级如下:
- 如果使用了devtools,则以home目录下的
~/.spring-boot-devtools.properties
为主 @TestPropertySource
注解的测试@SpringBootTest#properties
注解的测试- 命令行参数
SPRING_APPLICATION_JSON
提供的属性(JSON格式,从环境变量或者系统属性中获取)- ServletConfig配置的属性
- ServletContext配置的属性
- JNDI配置的属性,(java:comp/env)
- Java 系统属性,
System.getProperties()
- 系统环境变量
RandomValuePropertySource
进针对于random.*
- jar包外部指定profile文件,例如application-{profile}.properties(YAML 同)
- jar包内部的指定profile文件
- 应用外部的application.properties
- 应用内部的application.properties
@PropertySource
注解- 默认属性(
SpringApplication.setDefaultProperties()
) 例如:
import org.springframework.stereotype.*
import org.springframework.beans.factory.annotation.*
@Component
public class MyBean {
@Value("${name}")
private String name;
// ...
}
在application.properties
提供了name的默认值,当运行程序的时候可以通过提供命令行的值覆盖其默认值,java -jar app.jar --name="spring"
。
配置随机值
RandomValuePropertySource
可以很方便的注入随机值到配置文件中。例如
my.secret=${random.value}
my.number=${random.int}
my.bignumber=${random.long}
my.uuid=${random.uuid}
my.number.less.than.ten=${random.int(10)}
my.number.in.range=${random.int[1024,65536]}
访问命令汗参数
默认情况下,SpringApplication会将命令行参数转换为property
并添加到Environment
中。正如前面提到的,命令行参数会覆盖其他的配置。 如果不希望命令行参数添加到Environment
中可以通过调用SpringApplication.setAddCommandLineProperties(fals)
设置。
应用配置文件
SpringApplication
加载application.properties
文件,将其变量添加到Environment
中,查找位置: 1. 当前目录的/config
目录 2. 当前目录 3. classpath下的config
子目录 4. classpath目录 如果不想使用application.properties
文件可以使用spring.config.name
指定配置名字,同样可以通过spring.config.location
指定配置文件的位置
java -jar myproject.jar --spring.config.name=myproject
java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties
如果spring.config.location
使用的是目录,那么其应该以/
结尾,运行的时候会将spring.confing.name
的名字追加到后来查找配置文件。
指定配置文件
除了application.properties
文件外,同样可以以application-{profile}.properties
的形式命名指定配置文件。Environment
有一个默认的配置,(default),即如果没有激活其他配置文件,默认使用application-default.properties
。如果提供了多个指定配置文件,则选择最新的配置文件。
配置文件的占位符
application.properties
中的定义的值可以在后续的配置中使用,例如
app.name=MyApp
app.description=${app.name} is a Spring Boot application
使用YAML配置文件
当添加了SnakeYAML时,SpringApplication即可支持YAML配置,添加spring-boot-starter 自动会添加对SnakeYAML的依赖。
加载YAML
SpringApplication
有两种加载YAML配置文件的方式,1.使用YamlPropertiesFactoryBean
将YAML加载为Properties
,2. 使用YamlMapFactoryBean
将YAML加载为map。 以下YAML配置文件:
environments:
dev:
url: http://dev.example.com
name: Developer Setup
prod:
url: http://another.example.com
name: My Cool App
上面的配置文件等同的properties配置
environments.dev.url=http://dev.example.com
environments.dev.name=Developer Setup
environments.prod.url=http://another.example.com
environments.prod.name=My Cool App
YAML列表默认会添加序号(index)例如:
my:
servers:
- dev.example.com
- another.example.com
等同的properties配置为
my.servers[0]=dev.example.com
my.servers[1]=another.example.com
可以通过@ConfigurationProperties
注解将属性绑定到变量中,例如:
@ConfigurationProperties(prefix="my")
public class Config {
private List<String> servers = new ArrayList<String>();
public List<String> getServers() {
return this.servers;
}
}
多个YAML配置文件
可以在单个文件中使用spring.profiles
作为key指定多个YAML配置文件。例如:
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。同样的,如果production配置激活则server.address配置为192.168.1.120。如果development和production都没有启用,则使用默认即server.address设置为192.168.1.100 如果没有指定激活哪个配置,那么默认使用default的配置,例如以下示例,spring.security.user.password
只有在都不指定激活配置的时候才会使用
server:
port: 8000
---
spring:
profiles: default
security:
user:
password: weak
下面的例子密码都会被设置,因为他不属于任何一个配置:
server:
port: 8000
spring:
security:
user:
password: weak
使用@ConfigurationProperties注入值
从多个properties注入值的时候使用@Value()非常的麻烦,Spring Boot可以使用@ConfigurationProperties进行简化配置,例如:
package com.example;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties("acme")
public class AcmeProperties {
private boolean enabled;
private InetAddress remoteAddress;
private final Security security = new Security();
public boolean isEnabled() { ... }
public void setEnabled(boolean enabled) { ... }
public InetAddress getRemoteAddress() { ... }
public void setRemoteAddress(InetAddress remoteAddress) { ... }
public Security getSecurity() { ... }
public static class Security {
private String username;
private String password;
private List<String> roles = new ArrayList<>(Collections.singleton("USER"));
public String getUsername() { ... }
public void setUsername(String username) { ... }
public String getPassword() { ... }
public void setPassword(String password) { ... }
public List<String> getRoles() { ... }
public void setRoles(List<String> roles) { ... }
}
}
其属性定义如下
acme.enable=false
acme.remote-address=192.168.1.1
acme.security.username=username
acme.security.password=password
acme.security.roles=roles1,roles2
需要在@Configuration的配置中起用
@Configuration
@EnableConfigurationProperties(AcmeProperties.class)
public class MyConfiguration {
}
当然如果AcmeProperties类是一个bean则无需配置指定@EnableConfigurationProperties(AcmeProperties.class)
例如:
@Component
@ConfigurationProperties(prefix="acme")
public class AcmeProperties {
// ... see the preceding example
}
等同的YAML配置文件
acme:
remote-address: 192.168.1.1
security:
username: admin
roles:
- USER
- ADMIN
松绑定规则
通过@ConfigurationProperties绑定变量非常的灵活,例如:
@ConfigurationProperties(prefix="acme.my-project.person")
public class OwnerProperties {
private String firstName;
public String getFirstName() {
return this.firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
}
对于下列的方式都可以成功绑定
- acme.my-porject.person.first-name
- acme.my-project.person.first_name
- acme.my-project.person.firstName
- ACME_MYPROJECT_PERSON_FIRSTNAME
@ConfigurationProperties 校验
@ConfigurationProperties 支持JSR-303 javax.validation注解进行校验,例如
@ConfigurationProperties(prefix="acme")
@Validated
public class AcmeProperties {
@NotNull
private InetAddress remoteAddress;
// ... getters and setters
}
@ConfigurationProperties和@Value的区别
功能 | @configurationProperties | @Value |
---|---|---|
松绑定规则 | Y | N |
元数据支持 | Y | N |
SPEL | N | Y |
Profiles
Spring Profile可以将应用的配置分成多部分,只有在指定的环境下生效。任何@component或者@Configutaion都可以使用@Profile限制其加载,例如
@Configuration
@Profile("production")
public class ProductionConfiguration {
// ...
}
可以使用spring.profiles.active
的Environment
变量设置激活哪个profile。例如在application.properties中设置
spring.profiles.active=dev,hsqldb
或者使用命令行
java -jar app.jar --spring.profiles.active=dev,hsqldb
原文连接:https://www.codemore.top/cates/Backend/post/2018-05-20/spring-boot-configuration/
Spring Boot 2.0 教程 - 配置详解的更多相关文章
- Spring Boot 2.0 教程 | 配置 Undertow 容器
欢迎关注个人微信公众号: 小哈学Java, 文末分享阿里 P8 资深架构师吐血总结的 <Java 核心知识整理&面试.pdf>资源链接!! 文章首发于个人网站 https://ww ...
- spring boot slf4j日记记录配置详解
https://blog.csdn.net/liuweixiao520/article/details/78900779
- Spring Boot的每个模块包详解
Spring Boot的每个模块包详解,具体如下: 1.spring-boot-starter 这是Spring Boot的核心启动器,包含了自动配置.日志和YAML. 2.spring-boot-s ...
- Spring Boot源码中模块详解
Spring Boot源码中模块详解 一.源码 spring boot2.1版本源码地址:https://github.com/spring-projects/spring-boot/tree/2.1 ...
- spring boot 配置文件properties和YAML详解
spring boot 配置文件properties和YAML详解 properties中配置信息并获取值. 1:在application.properties配置文件中添加: 根据提示创建直接创建. ...
- Apache2.2+Tomcat7.0整合配置详解
一.简单介绍 Apache.Tomcat Apache HTTP Server(简称 Apache),是 Apache 软件基金协会的一个开放源码的网页服务器,可以在 Windows.Unix.Lin ...
- 【Spring】——声明式事务配置详解
项目中用到了spring的事务: @Transactional(rollbackFor = Exception.class, transactionManager = "zebraTrans ...
- Spring Boot 2.0 教程 | AOP 切面统一打印请求日志
欢迎关注微信公众号: 小哈学Java 文章首发于个人网站 https://www.exception.site/springboot/spring-boot-aop-web-request 本节中,您 ...
- Spring Boot 2.0 教程 - 深入SpringAplication
原文连接:https://www.codemore.top/cates/Backend/post/2018-05-20/spring-boot-SpringApplication 可以通过Spring ...
随机推荐
- Android ROM开发(一)——Windows下Cygwin和Android_Kitchen厨房的安装
Android ROM开发(一)--Windows下Cygwin和Android_Kitchen厨房的安装 很久没有碰到ROM开发了,在很久很久以前也是从ROM起步的,无奈还是一脚踏上了Android ...
- unity连接数据库工具
这里用的是一个集成工具UPUPW(Nginx+mysql+php版本) 网址:http://php.upupw.net/ 数据库登录: 本地: http://127.0.0.1/pmd 外网: htt ...
- PS 图像调整算法——色调分离
色调分离的原理就是将R, G, B每个通道 0-255 的色调区间进行强制划分到给定的区间里去,所以色调会合并,最终的图像看起来颜色就是一块一块的. clc; clear all; close all ...
- 速度之王 — LZ4压缩算法(一)
LZ4 (Extremely Fast Compression algorithm) 项目:http://code.google.com/p/lz4/ 作者:Yann Collet 本文作者:zhan ...
- Dijkstra算法 c语言实现
Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法能得出最短路径的最优 ...
- 两种方法 更改 EBS R12界面LOGO以及内容
from:metalink more: Note 174219.1 - How To Change The Logo In The Oracle Application Menu Note 84975 ...
- 真机测试遇到0xE8008016错误修改方法
错误描述 真机测试过程中,更换Provisioning Profile之后,出现错误:The entitlements specified in your application's Code Sig ...
- Gradle 1.12用户指南翻译——第四十四章. 分发插件
本文由CSDN博客貌似掉线翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...
- Mac OS 的属性列表文件plist装换
Mac OS系统自身包含有转换plist的工具:plutil.其中-p是以human可读方式显示plist文件,而convert就是转换参数,其中支持的格式有:xml,二进制和json.下面拿一个实际 ...
- gcc或clang中消除特定警告的方法
一般在编译代码时会有相当多的警告信息,尤其当我们使用了-Wall选项的时候.-Wall绝不是像其字面意思一样打开所有警告.不过它打开的警告也相当多了.对于一些我们已知"无害"但仍然 ...