文章目录
Springboot 如何简化Spring的配置文件?
- 默认只提供一个统一的固定名称的全局配置文件。
- 所有配置均有默认值,所以你可以不用配置任何内容,即可启动一个Springboot应用程序。
- 程序员基本上,只需要修改默认配置中属性的值就好了。
为什么要如此设计?
回想一下,你要使用Spring技术栈,去开发一个java的web应用。你都需要做些什么?
1、配置jdbc数据源
2、配置事务
3、配置aop
4、配置bean的装载
5、配置……
我知道此时的你估计已经奔溃。多,而且,非常容易出错。所以,对于传统的Spring开发,对于配置文件这一项的诟病,结合项目。做出如下总结:
- 手工编写,重复而且繁杂的配置文件
- 配置文件数量多。
- 每个人命名风格都不一样,配置文件名称不一,无形中抬高了学习和理解成本。
- 配置文件中,常见属性的命名风格不一,没有规范。程序的可读性、可移植性不好。
Springboot都支持哪些格式的配置文件?
- yaml格式
- Properties格式
- xml
- json
- ……
Springboot的配置文件的优先级
注意:优先级高的覆盖优先级低的,所有的配置文件中的属性形成互补
例如:
Springboot的application属性文件的加载优先级
原则:位置高的,覆盖位置低的
即:
1、当前目录下的/config子目录
2、当前目录
3、一个classpath下的?Config包
4、classpath的根路径
为什么更推荐使用yaml格式?
- 它是一种直观的,能够被电脑识别的数据序列化格式
- 是一个可读性高,并且容易被人类阅读
- 容易和脚本语言交互
如何读取配置文件的内容?
两种方式:
- 通过注解,@Value,或者@ConfigurationProperties去绑定到一个Javabean上
- 获取 Spring Boot 的环境变量
关键代码示例:
ConfigurableApplicationContext ctx = SpringApplication.run(SpringbootPropertiesApplication.class, args);
ctx.getEnvironment().getProperty("db.link.url");
或者:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
@Component
public class MyConf {
@Autowired
private Environment env;
public void show(){
System.out.println(env.getProperty("db.link.url"));
}
}
配置文件的最佳实践和项目实战技巧?
使用属性占位符
生成随机数
随机字符串
com.didispace.blog.value=${random.value}
随机int
com.didispace.blog.number=${random.int}
随机long
com.didispace.blog.bignumber=${random.long}
10以内的随机数
com.didispace.blog.test1=${random.int(10)}
10-20的随机数
com.didispace.blog.test2=${random.int[10,20]}
多环境配置
我们在开发Spring Boot应用时,通常同一套程序会被应用和安装到几个不同的环境,比如:开发、测试、生产等。其中每个环境的数据库地址、服务器端口等等配置都会不同,如果在为不同环境打包时都要频繁修改配置文件的话,那必将是个非常繁琐且容易发生错误的事。
对于多环境的配置,各种项目构建工具或是框架的基本思路是一致的,通过配置多份不同环境的配置文件,再通过打包命令指定需要打包的内容之后进行区分打包,Spring Boot也不例外,或者说更加简单。
在Spring Boot中多环境配置文件名需要满足application-{profile}.properties的格式,其中{profile}对应你的环境标识,比如:
application-dev.properties:开发环境
application-test.properties:测试环境
application-prod.properties:生产环境
针对各环境新建不同的配置文件application-dev.properties、application-test.properties、application-prod.properties
application.properties中设置spring.profiles.active=dev,就是说默认以dev环境设置
自定义配置文件
使用数组或者集合
项目中使用配置文件常见问题总结:
- 乱码问题(思路:所有乱码问题,基本原理都是因为,编码和解码的方式不一致导致的。所以,始终保持一致的编码格式)
- 加载不到配置文件的问题(思路:路径错误或者含路径含有中文、名称拼写是否一致。)
- 在项目中配置的属性,始终加载了错误的值(思路:搞清配置文件的加载优先级和覆盖问题,搞清楚外部配置文件之间,属性的互补性。)
思考:
从Springboot对配置文件的设计,我们能学到什么?
第一:约定大于配置
- 将常用配置属性提供标准统一的写法。程序员,只需要修改值就好了。
- 配置文件的名称,固定为application.properties 或者application.yml
第二:一切都要考虑提供默认值
第三:简化,只有一个入口!统一配置文件的入口。变多个为一个。提供全局的默认配置文件
附
1、使用devtools时,默认配置
2、 Springboot的常用默认配置
3、本文源码:https://github.com/bill4j/spring-boot-course/tree/master/spring-boot-config