免费Java高级资料需要自己领取,涵盖了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo高并发分布式等教程,一共30G。              
传送门:https://mp.weixin.qq.com/s/JzddfH-7yNudmkjT0IRL8Q

目录

  • 加载 property 顺序
  • 随机属性
  • 命令行属性
  • Application 属性文件
  • Profile 特定属性
  • 属性中的占位符
  • YAML 属性
  • 访问属性
  • 多 profile 配置
  • YAML 的缺点
  • 属性前缀
  • 属性松散绑定规则
  • 属性转换
  • 时间单位转换
  • 数据大小转换
  • 校验属性

加载 property 顺序

Spring Boot 加载 property 顺序如下:

  1. Devtools 全局配置 (当 devtools 被激活 \~/.spring-boot-devtools.properties).
  2. ="https://docs.spring.io/spring/docs/5.1.3.RELEASE/javadoc-api/org/springframework/test/context/TestPropertySource.html">测试环境中的 @TestPropertySource 注解配置
  3. 测试环境中的属性 properties@SpringBootTest 和 测试注解.
  4. 命令行参数
  5. SPRING_APPLICATION_JSON 属性
  6. ServletConfig 初始化参数
  7. ServletContext 初始化参数
  8. JNDI attributes from 通过 java:comp/env 配置的 JNDI 属性
  9. Java 系统属性 (System.getProperties())
  10. 操作系统环境比那里
  11. RandomValuePropertySource 加载 random.* 形式的属性
  12. jar 包外的 application-{profile}.properties 或 application-{profile}.yml 配置
  13. jar 包内的 application-{profile}.properties 或 application-{profile}.yml 配置
  14. jar 包外的 application.properties 或 application.yml 配置
  15. jar 包内的 application.properties 或 application.yml 配置
  16. @PropertySource 绑定的配置
  17. 默认属性 (通过 SpringApplication.setDefaultProperties 指定)

随机属性

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 会获取 -- 参数(例如 --server.port=9000 ),并将这个 property 添加到 Spring 的 Environment 中。

如果不想加载命令行属性,可以通过 SpringApplication.setAddCommandLineProperties(false)禁用。

Application 属性文件

SpringApplication 会自动加载以下路径下的 application.properties 配置文件,将其中的属性读到 Spring 的 Environment 中。

  1. 当前目录的 /config 子目录
  2. 当前目录
  3. classpath 路径下的 /config package
  4. classpath 根路径

注:
以上列表的配置文件会根据顺序,后序的配置会覆盖前序的配置。
你可以选择 YAML(yml) 配置文件替换 properties 配置文件。

如果不喜欢 application.properties 作为配置文件名,可以使用 spring.config.name 环境变量替换:

$ java -jar myproject.jar --spring.config.name=myproject

可以使用 spring.config.location 环境变量指定配置文件路径:

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

Profile 特定属性

如果定义 application-{profile}.properties 形式的配置文件,将被视为 profile 环境下的特定配置。

可以通过 spring.profiles.active 参数来激活 profile,如果没有激活的 profile,默认会加载 application-default.properties 中的配置。

属性中的占位符

application.properties 中的值会被 Environment 过滤,所以,可以引用之前定义的属性。

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

注:你可以使用此技术来创建 Spring Boot 属性变量。请参考: Section 77.4, “Use ‘Short’ Command Line Arguments

YAML 属性

Spring Framework provides two convenient classes that can be used to load YAML documents. The YamlPropertiesFactoryBean loads YAML as Properties and the YamlMapFactoryBean loads YAML as a Map.

Spring 框架有两个类支持加载 YAML 文件。

  • YamlPropertiesFactoryBean 将 YAML 文件的配置加载为 Properties 。
  • YamlMapFactoryBean 将 YAML 文件的配置加载为 Map 。

示例 1

environments:
dev:
url: http://dev.example.com
name: Developer Setup
prod:
url: http://another.example.com
name: My Cool App

等价于:

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 支持列表形式,等价于 property 中的 [index] :

my:
servers:
- dev.example.com
- another.example.com

等价于

my.servers[0]=dev.example.com
my.servers[1]=another.example.com

访问属性

YamlPropertySourceLoader 类会将 YAML 配置转化为 Spring Environment 类中的 PropertySource 。然后,你可以如同 properties 文件中的属性一样,使用 @Value 注解来访问 YAML 中配置的属性。

多 profile 配置

server:
address: 192.168.1.100
---
spring:
profiles: development
server:
address: 127.0.0.1
---
spring:
profiles: production & eu-central
server:
address: 192.168.1.120

YAML 的缺点

注:YAML 注解中的属性不能通过 @PropertySource 注解来访问。所以,如果你的项目中使用了一些自定义属性文件,建议不要用 YAML。

属性前缀

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(prefix="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.enabled
  • acme.remote-address
  • acme.security.username
  • acme.security.password
  • acme.security.roles

然后,你需要使用 @EnableConfigurationProperties 注解将属性类注入配置类中。

@Configuration
@EnableConfigurationProperties(AcmeProperties.class)
public class MyConfiguration {
}

属性松散绑定规则

Spring Boot 属性名绑定比较松散。

以下属性 key 都是等价的:

PropertyNoteacme.my-project.person.first-name-分隔acme.myProject.person.firstName驼峰命名acme.my_project.person.first_name_分隔ACME_MYPROJECT_PERSON_FIRSTNAME大写字母

属性转换

如果需要类型转换,你可以提供一个 ConversionService bean (一个名叫 conversionService的 bean) 或自定义属性配置 (一个 CustomEditorConfigurer bean) 或自定义的 Converters (被 @ConfigurationPropertiesBinding 注解修饰的 bena)。

时间单位转换

Spring 使用 java.time.Duration 类代表时间大小,以下场景适用:

  • 除非指定 @DurationUnit ,否则一个 long 代表的时间为毫秒。
  • ISO-8601 标准格式( java.time.Duration 的实现就是参照此标准)
  • 你也可以使用以下支持的单位:
    • ns - 纳秒
    • us - 微秒
    • ms - 毫秒
    • s - 秒
    • m - 分
    • h - 时
    • d - 天

示例:

@ConfigurationProperties("app.system")
public class AppSystemProperties { @DurationUnit(ChronoUnit.SECONDS)
private Duration sessionTimeout = Duration.ofSeconds(30); private Duration readTimeout = Duration.ofMillis(1000); public Duration getSessionTimeout() {
return this.sessionTimeout;
} public void setSessionTimeout(Duration sessionTimeout) {
this.sessionTimeout = sessionTimeout;
} public Duration getReadTimeout() {
return this.readTimeout;
} public void setReadTimeout(Duration readTimeout) {
this.readTimeout = readTimeout;
} }

数据大小转换

Spring 使用 DataSize 类代表数据大小,以下场景适用:

  • long 值(默认视为 byte)
  • 你也可以使用以下支持的单位:
    • B
    • KB
    • MB
    • GB
    • TB

示例:

@ConfigurationProperties("app.io")
public class AppIoProperties { @DataSizeUnit(DataUnit.MEGABYTES)
private DataSize bufferSize = DataSize.ofMegabytes(2); private DataSize sizeThreshold = DataSize.ofBytes(512); public DataSize getBufferSize() {
return this.bufferSize;
} public void setBufferSize(DataSize bufferSize) {
this.bufferSize = bufferSize;
} public DataSize getSizeThreshold() {
return this.sizeThreshold;
} public void setSizeThreshold(DataSize sizeThreshold) {
this.sizeThreshold = sizeThreshold;
} }

校验属性

@ConfigurationProperties(prefix="acme")
@Validated
public class AcmeProperties { @NotNull
private InetAddress remoteAddress; @Valid
private final Security security = new Security(); // ... getters and setters public static class Security { @NotEmpty
public String username; // ... getters and setters } }

你也可以自定义一个名为 configurationPropertiesValidator 的校验器 Bean。获取这个 @Bean 的方法必须声明为 static

使用方法:

mvn clean package
cd target
java -jar sbe-core-property.jar

SpringBoot 教程之属性加载详解的更多相关文章

  1. Javascript 异步加载详解

    Javascript 异步加载详解 本文总结一下浏览器在 javascript 的加载方式. 关键词:异步加载(async loading),延迟加载(lazy loading),延迟执行(lazy ...

  2. Javascript图片预加载详解

    预加载图片是提高用户体验的一个很好方法.图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度.这对图片画廊及图片占据很大比例的网站来说十分有利,它保证了图片快速.无缝地发布 ...

  3. Javascript 异步加载详解(转)

    本文总结一下浏览器在 javascript 的加载方式. 关键词:异步加载(async loading),延迟加载(lazy loading),延迟执行(lazy execution),async 属 ...

  4. 单个SWF文件loading加载详解(转)

    通过带宽查看器,可以看到SWF中每帧所占带宽状况.另外,我们还可以在Flash发布设置中,选择生成体积报告. 勾选这一项之后,发布flash时,会自动在fla目录中生成一个名为”文件名 Report. ...

  5. javascript异步加载详解(转)

    本文总结一下浏览器在 javascript 的加载方式. 关键词:异步加载(async loading),延迟加载(lazy loading),延迟执行(lazy execution),async 属 ...

  6. 转:web前端面试题合集 (Javascript相关)(js异步加载详解)

    1. HTTP协议的状态消息都有哪些? 1**:请求收到,继续处理2**:操作成功收到,分析.接受3**:完成此请求必须进一步处理4**:请求包含一个错误语法或不能完成5**:服务器执行一个完全有效请 ...

  7. js模块加载详解

    看着java中各种import加载,在回过头来看看javascript还在自己造轮子,写各种XX的模块加载框架,ECMASCRIPT6不知什么时候能够普及.不过DT归DT,该学的还是要学. 一 同步加 ...

  8. ios 懒加载详解

    iOS开发之懒加载 在iOS开发中几乎经常用到懒加载技术,比如我们存放网络数据的数组,控制器的view,控件的自定义,复杂的运算逻辑等等情况下都会用到懒加载技术,那么什么是懒加载呢?? 他又有什么样的 ...

  9. Javascript图片预加载详解 分类: JavaScript HTML+CSS 2015-05-29 11:01 768人阅读 评论(0) 收藏

    预加载图片是提高用户体验的一个很好方法.图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度.这对图片画廊及图片占据很大比例的网站来说十分有利,它保证了图片快速.无缝地发布 ...

随机推荐

  1. Linux 指令学习

    查询java安装地址 which java ls -lrt /bin/java ls -lrt /etc/alternatives/java # 如果已经配好,则echo $JAVA_HOME 更改环 ...

  2. JS 实现动态轮播图

    JavaScript实现轮播图思路 + html/css + js源码 整个轮播图的效果是通过js代码,操作dom, 拿到html我们需要的元素,控制整个ul的距离浏览器左边的位置,让排好的图片依次出 ...

  3. linux中vi和vim操作

    一.简单介绍 vi 和 vim 类似于windows的文本编辑器 所有的Linux系统都会内置vi文本编辑器 vim可以看做是vi增强版,具有程序编辑能力,支持语法高亮,代码补全,编译及错误跳转等功能 ...

  4. SSM框架之Spring(3)IOC及依赖注入(基于注解的实现)

    Spring(3)IOC及依赖注入(基于注解的实现) 学习基于注解的 IoC 配置,大家脑海里首先得有一个认知,即注解配置和 xml 配置要实现的功能都是一样 的,都是要降低程序间的耦合.只是配置的形 ...

  5. flutter 打包apk

    打包的具体操作,可以参照官网,只是官网没有那么细 1.修改AndroidManifest.xml 2.构建配置  可以跳过 3.构建签名 4.创建 key.properties 5.配置混淆 6.修改 ...

  6. Vue中通过Vue.extend动态创建实例

    Vue中通过Vue.extend动态创建实例 在Vue中,如果我们想要动态地来控制一个组件的显示和隐藏,比如通过点击按钮显示一个对话框或者弹出一条信息.我们通常会提前写好这个组件,然后通过v-if = ...

  7. JS基础语法---作用域

    作用域:使用范围 全局变量: 声明的变量是使用var声明的, 那么这个变量就是全局变量 全局变量可以在页面的任何位置使用 除了函数以外, 其他的任何位置定义的变量都是全局变量 局部变量:在函数内部定义 ...

  8. [转]JS将图片转为base64编码

    本文转自:https://blog.csdn.net/DeMonliuhui/article/details/79731359 1.根据img标签获取base64编码/** * * @param im ...

  9. 详解 DNS 与 CoreDNS 的实现原理

    域名系统(Domain Name System)是整个互联网的电话簿,它能够将可被人理解的域名翻译成可被机器理解 IP 地址,使得互联网的使用者不再需要直接接触很难阅读和理解的 IP 地址. http ...

  10. RMAN 'Duplicate From Active Database' Feature in Oracle11g (Doc ID 452868.1)

    RMAN 'Duplicate From Active Database' Feature in Oracle11g (Doc ID 452868.1) APPLIES TO: Oracle Data ...