补习系列(10)-springboot 之配置读取
简介
在早前的博客中曾经写过 Spring 程序通过 Bean 映射实现配置信息的读取。
在SpringBoot 框架中读取配置的方式变得非常多样,这导致读者在搜寻资料时反而容易迷糊。
- 到底,SpringBoot 是按什么顺序加载配置?
- 相应的,我们该选择什么样的方式去读取?
一、配置样例
先看一个例子:
@Compoment
public class BuildConfig{
@Value("${buildinfo.version")
private String version;
...
}
代码中,@Component 将 BuildConfig 注册为 Bean ,
接下来使用 @Value 注解,将 配置中的 buildinfo.version键映射到了 version 字段上。
我们都知道,通过 application.properties 可以方便的配置一些属性。
属性的值是支持变量替换的,如下:
myName=Lilei
myDesc=${myName} is a good man
这点,是由 SpringBoot 自动生成的 PropertyPlaceholderConfigurer 对象实现的。
除了 上面所说 application.properties 之外,还有什么途径?
下面介绍如何注入配置
二、如何注入配置
1. 缺省配置文件
类路径中 application.properties(yml) 是默认的配置文件。
此外如果启动应用时,当前目录中存在同名的配置文件,则以此优先。
在此规则之下,SpringBoot 还能识别不同 profile下的配置,这将在后面篇幅中介绍。
2. 使用注解
@PropertySource
可指定属性配置文件的位置,
样例代码:
@Configuration
@PropertySource("classpath:/com/myco/app.properties")
public class AppConfig {
@Autowired
Environment env;
@Bean
public TestBean testBean() {
TestBean testBean = new TestBean();
testBean.setName(env.getProperty("testbean.name"));
return testBean;
}
}
@TestPropertySource
与 @PropertySource 类似,该注解用于指定测试环境中的属性文件,其优先级高于 @PropertySource。
3. 启动参数
以下的命令以指定参数启动 SpringBoot 应用
java -jar application.jar --server.port=9000
server.port 值将被注入为环境属性值。
而以下的命令还可以指定 配置文件的位置
java -jar application.jar --spring.config.location=/etc/xxx.properties
这个spring.config.location就是指的配置文件位置,
默认情况下,SpringBoot 会从下面几路径找到配置文件:
| 路径 |
|---|
| file:./config/ |
| file:./ |
| classpath:/config/ |
| classpath:/ |
还有..
SpringBoot 注入配置的方式其实非常多,完整顺序如下表:
| 优先级 | 配置 |
|---|---|
| 1 | @TestPropertySource 注解 |
| 2 | @SpringBootTest 注解 |
| 3 | 命令行参数 |
| 4 | SPRING_APPLICATION_JSON 属性值(或环境变量) |
| 5 | Servlet 相关参数 |
| 6 | JNDI 属性 |
| 7 | Java 系统属性 (System.getProperties()) |
| 8 | 操作系统环境变量 |
| 9 | RandomValuePropertySource 随机属性 |
| 10 | Jar包外部 application-{profile}.properties |
| 11 | Jar包内部 application-{profile}.properties |
| 12 | Jar包外部 application.properties |
| 13 | Jar包内部 application.properties |
| 14 | @PropertySource 注解 |
| 15 | SpringApplication 默认值 |
三、如何读取配置
@Value 注解
如以下的实现:
@Configuration
public class AppConfig {
@Value("${api.log.enabled:false}")
private boolean apiLogEnabled;
除了类型自动转换之外,通过:false后缀可以指定默认值。
Environment 接口
Environment 是一个类似 Properties 的接口,用来获取属性非常方便。
@Configuration
public class AppConfig {
@Autowired
private Environment environment;
public String getApplicationId() {
return this.environment.getProperty("application.id");
}
}
@ConfigurationProperties 注解
该注解一般用作前缀匹配,下面的代码摘自Mongodb
@ConfigurationProperties(prefix = "spring.data.mongodb")
public class MongoProperties {
/**
* Mongo server host.
*/
private String host;
/**
* Mongo server port.
*/
private Integer port = null;
/**
* Database name.
*/
private String database;
相应的 Mongodb 配置信息如:
spring.data.mongodb.host=127.0.0.1
spring.data.mongodb.port=27017
spring.data.mongodb.database=xxx
四、不同环境中的配置
Spring 提供了 Profile 机制用于管理不同环境的配置。
配置内容可以是 Java Config(对应@Component或@Configuration),也可以是配置文件。
如:
@Configuration
@Profile("prod")
public class ProdConfiguration {
// ...
}
通过@Profile注解可将代码配置关联到某个配置环境
在具体应用中,Profile的用途通常有二:
1. 区别开发、测试、发布环境
对于dev、prod、test分别做不同的配置
//for dev
application-dev.properties
//for prod
application-prod.properties
//for test
application-test.properties
可以在 application.properties 指定启用的环境:
spring.profiles.active=dev
也可以通过命令行指定:
java -jar app.jar --spring.profiles.active=prod
2. 声明多配置文件
当内容过多时,可以将配置信息进行拆分,如下:
application-mongodb.properties
spring.data.mongodb.host=127.0.0.1
spring.data.mongodb.port=27017
spring.data.mongodb.username=xxx
spring.data.mongodb.password=xxx
spring.data.mongodb.database=xxx
application-mail.properties
spring.mail.host=xxx
spring.mail.username=xxx
spring.mail.password=xxx
spring.mail.from=xxx
spring.mail.to=xxx
spring.mail.cc=xxx
在主配置文件指定包含关系:
application.properties
spring.profiles.include=mongodb,mail
参考文档
https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html
https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-profiles.html
欢迎继续关注"美码师的补习系列-springboot篇" ,如果觉得老司机的文章还不赖,请多多分享转发-
补习系列(10)-springboot 之配置读取的更多相关文章
- 补习系列(14)-springboot redis 整合-数据读写
目录 一.简介 二.SpringBoot Redis 读写 A. 引入 spring-data-redis B. 序列化 C. 读写样例 三.方法级缓存 四.连接池 小结 一.简介 在 补习系列(A3 ...
- 补习系列(15)-springboot 分布式会话原理
目录 一.背景 二.SpringBoot 分布式会话 三.样例程序 四.原理进阶 A. 序列化 B. 会话代理 C. 数据老化 小结 一.背景 在 补习系列(3)-springboot 几种scope ...
- 源码学习系列之SpringBoot自动配置(篇二)
源码学习系列之SpringBoot自动配置(篇二)之HttpEncodingAutoConfiguration 源码分析 继上一篇博客源码学习系列之SpringBoot自动配置(篇一)之后,本博客继续 ...
- 源码学习系列之SpringBoot自动配置(篇一)
源码学习系列之SpringBoot自动配置源码学习(篇一) ok,本博客尝试跟一下Springboot的自动配置源码,做一下笔记记录,自动配置是Springboot的一个很关键的特性,也容易被忽略的属 ...
- 补习系列(16)-springboot mongodb 数据库应用技巧
目录 一.关于 MongoDB 二.Spring-Data-Mongo 三.整合 MongoDB CRUD A. 引入框架 B. 数据库配置 C. 数据模型 D. 数据操作 E. 自定义操作 四.高级 ...
- 补习系列(19)-springboot JPA + PostGreSQL
目录 SpringBoot 整合 PostGreSQL 一.PostGreSQL简介 二.关于 SpringDataJPA 三.整合 PostGreSQL A. 依赖包 B. 配置文件 C. 模型定义 ...
- 补习系列(18)-springboot H2 迷你数据库
目录 关于 H2 一.H2 用作本地数据库 1. 引入依赖: 2. 配置文件 3. 样例数据 二.H2 用于单元测试 1. 依赖包 2. 测试配置 3. 测试代码 小结 关于 H2 H2 数据库是一个 ...
- 补习系列(17)-springboot mongodb 内嵌数据库
目录 简介 一.使用 flapdoodle.embed.mongo A. 引入依赖 B. 准备测试类 C. 完善配置 D. 启动测试 细节 二.使用Fongo A. 引入框架 B. 准备测试类 C.业 ...
- 补习系列(13)-springboot redis 与发布订阅
目录 一.订阅发布 常见应用 二.Redis 与订阅发布 三.SpringBoot 与订阅发布 A. 消息模型 B. 序列化 C. 发布消息 D. 接收消息 小结 一.订阅发布 订阅发布是一种常见的设 ...
随机推荐
- 匿名函数 javascript
匿名函数: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- Java_异常处理
这篇我们聊聊java中的异常.首先我们要知道什么是异常? Exception: exception翻译过来就是“意外”的意思.事实上,异常的本质就是程序的错误,包括程序逻辑错误和系统错误.错误在编写程 ...
- Java语法细节 - 可见性
目录 JAVA访问和修饰符的关系一览表 JAVA访问和修饰符的关系一览表 Modifier Class Package Subclass World public Y Y Y Y protected ...
- Linux 搭建 Nginx+PHP-FPM环境
安装PHP.Nginx和PHP-FPM sudo apt-get install php sudo apt-get install nginx sudo apt-get install php7-fp ...
- 微信测试号开发入门配置问题java
这个测试号配置弄了好几天了,入了无数坑,终于解决了...辛苦我了,手动安慰一下自己.. 为了萌新们以后不要再浪费时间绕半天做无用功.看看楼楼的艰苦历程吧. 此教程针对没有云服务器,没有自己的域名的.没 ...
- ssh网上商城源码
本人承诺源码免费,只是出于前期发布很多免费资源反而落不到好下场,总是被一些人说三道四.就算你去找到资源版本不符合你也运行不起来.如果想要资源加QQ1397617269,或者电话短信1395630164 ...
- mysql数据库表的修改及删除
一.对数据表的修改 1.重命名一张表: RENAME TABLE 原名 TO 新名字; ALTER TABLE 原名 RENAME 新名; ALTER TABLE 原名 RENAME TO 新名; 2 ...
- swust oj 1051
输出利用先序遍历创建的二叉树中的指定结点的孩子结点 1000(ms) 10000(kb) 2432 / 5430 利用先序递归遍历算法创建二叉树并输出该二叉树中指定结点的儿子结点.约定二叉树结点数据为 ...
- qt5.4解决输出中文乱码问题
需要在字符串前添加 QString::fromUtf8 例: b2 = new QPushButton(this); b2->setText(QString::fromUtf8("变化 ...
- [运维工具]linux下远程桌面rdesktop安装和使用
依然是解压 configure make make install 这些步骤 rdesktop -f 16 192.168.16.90 -f是全屏,退出全屏是CRTL+ALT+ENTER 记录一个li ...