Spring Boot配置篇(基于Spring Boot 2.0系列)
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系列)的更多相关文章
- Spring Boot入门篇(基于Spring Boot 2.0系列)
1:概述: Spring Boot是用来简化Spring应用的初始化开发过程. 2:特性: 创建独立的应用(jar|war形式); 需要用到spring-boot-maven-plugin插件 直接嵌 ...
- Spring Boot简化了基于Spring的应用开发
Spring Boot简化了基于Spring的应用开发,通过少量的代码就能创建一个独立的.产品级别的Spring应用. Spring Boot为Spring平台及第三方库提供开箱即用的设置,这样你就可 ...
- Spring Data JPA例子[基于Spring Boot、Mysql]
关于Spring Data Spring社区的一个顶级工程,主要用于简化数据(关系型&非关系型)访问,如果我们使用Spring Data来开发程序的话,那么可以省去很多低级别的数据访问操作,如 ...
- Spring Cloud实战: 基于Spring Cloud Gateway + vue-element-admin 实现的RBAC权限管理系统,实现网关对RESTful接口方法权限和自定义Vue指令对按钮权限的细粒度控制
一. 前言 信我的哈,明天过年. 这应该是农历年前的关于开源项目 的最后一篇文章了. 有来商城 是基于 Spring Cloud OAuth2 + Spring Cloud Gateway + JWT ...
- Spring实战5:基于Spring构建Web应用
主要内容 将web请求映射到Spring控制器 绑定form参数 验证表单提交的参数 对于很多Java程序员来说,他们的主要工作就是开发Web应用,如果你也在做这样的工作,那么你一定会了解到构建这类系 ...
- Spring框架第一篇之Spring的第一个程序
一.下载Spring的jar包 通过http://repo.spring.io/release/org/springframework/spring/地址下载最新的Spring的zip包,当然,如果你 ...
- [原创]java WEB学习笔记103:Spring学习---Spring Bean配置:基于注解的方式(基于注解配置bean,基于注解来装配bean的属性)
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- shiro开发,shiro的环境配置(基于spring+springMVC+redis)
特别感谢lhacker分享的文章,对我帮助很大 http://www.aiuxian.com/article/p-1913280.html 基本的知识就不在这里讲了,在实战中体会shiro的整体设计理 ...
- Spring第七篇【Spring的JDBC模块】
前言 上一篇Spring博文主要讲解了如何使用Spring来实现AOP编程,本博文主要讲解Spring的对JDBC的支持- 对于JDBC而言,我们肯定不会陌生,我们在初学的时候肯定写过非常非常多的JD ...
随机推荐
- Java InputStream、String、File相互转化 --- good
String --> InputStreamByteArrayInputStream stream = new ByteArrayInputStream(str.getBytes()); Inp ...
- 聊聊PROFINET与PROFIBUS
1.PROFINET与PROFIBUS从狭义上比,没有可比性,因为他们的物理接口不同,电气特性,不同,波特率不同,电气介质特性不同等等.这样两者的协议是完全没有关联性的,唯一的关联性就是两者都是PI组 ...
- 从贝叶斯模型(Bayes)到生成模型(Generative models)(生成式分类器,generative classifier)
0. 基于贝叶斯公式的生成式分类器 生成式分类器(generative classifier)即是已知类别得样本: p(y=c|x,θ)∝p(x|y=c,θ)p(y=c|θ) p(x|y=c,θ) 称 ...
- 利用tcpdump抓包工具监控TCP连接的三次握手和断开连接的四次挥手
TCP传输控制协议是面向连接的可靠的传输层协议,在进行数据传输之前,需要在传输数据的两端(客户端和服务器端)创建一个连接,这个连接由一对插口地址唯一标识,即是在IP报文首部的源IP地址.目的IP地址, ...
- Ant—使用Ant构建一个简单的Java工程(两)
博客<Ant-使用Ant构建一个简单的Java项目(一)>演示了使用Ant工具构建简单的Java项目,接着这个样例来进一步学习Ant: 上面样例须要运行多条ant命令才干运行Test类中的 ...
- Android发展_备份短信
短信备份的原理 短信备份的原理.是用内容提供者读取短信,然后保存. public class SmsBackupUtils { // 回调接口 public interface SmsBacku ...
- GoldenGate过程 abend,报错OGG-00868 ORA-02396: Exceeded Maximum Idle Time, Please Connect Again
GoldenGate过程 abend,报错OGG-00868 ORA-02396: Exceeded Maximum Idle Time, Please Connect Again 参考原始: Gol ...
- 使用Qt installer framework制作安装包(不知道是否适合Mac和Linux?)
一.介绍 使用Qt库开发的应用程序,一般有两种发布方式:(1)静态编译发布.这种方式使得程序在编译的时候会将Qt核心库全部编译到一个可执行文件中.其优势是简单单一,所有的依赖库都集中在一起,其缺点也很 ...
- iOS 往来--书面资料
写接触知识和查询功能的基础,现在我们就来看看信息写入 新 变化 删除 #pragma mark - 系人信息 //创建联系人 - (void) creatNewRecord { CFErrorRef ...
- corefx 源码学习:NetworkStream.ReadAsync 是如何从 Socket 异步读取数据的
最近遇到 NetworkStream.ReadAsync 在 Linux 上高并发读取数据的问题,由此激发了阅读 corefx 中 System.Net.Sockets 实现源码(基于 corefx ...