目录

需求

常见方式

自定义配置


需求

在开发的应用的时候总是需要有多环境的配置,本地测试dev,测试服务器部署test,正式服务器部署prod,各个开发团队可能还有其他配置需求,这种配置文件是需要经常改的,可以写在一起,每次改的时候吧不需要的部分打成注释,但是多了以后相当麻烦,还容易出错。

我的开发环境是Springboot,也现在用的越来越多的框架,逐渐走向主流,配置文件主要有两种.properties和.yml,后者是Springboot的特色。

常见方式

框架提供多种加载配置文件的方式

1.最常见的@PropertySource在Bean的头上括号参数是配置文件的路径 @Value给变量自动赋值

2.@ConfigurationProperties + @PropertySource + @Value

3.YamlPropertiesFactoryBean + @Value

4.Environment自动生成Bean,内包含了所有配置信息

Springboot会自动加载配置文件,配置的是Springboot的自动配置类,配置的名称必须对应包里存在的,这种系统配置文件有固定的命名格式和指定的位置才能被Springboot读取并解析

有以下4个位置

(项目文件):./config/
(项目文件):./
(resources类路径):/config/
(resources类路径):/

命名必须以application开头

springboot 优化 springboot优化 properties_自定义


在主要的yml里配置 spring.profiles.active: dev 系统就会自动的按以上顺序在项目中找,同样名字的以优先先的为准。这样在切换环境的时候就只用改这一个地方。


自定义配置

但是,以上配置都不是自定义的参数。自定义配置文件可以出现在resources里的任何位置,通过@PropertySource等注解里的路径去找,不受系统环境管理,每次切换环境还得到配置文件里打注释,经常会忘而且麻烦。

最开始想到的是弄一个工具类,通过@Value读取所有配置,然后代码在用着工具类的配置,这样就只需要改两个地方。缺点:还是得改两个地方,一旦配置文件加减字段时,工具类也得动,麻烦。

后来的解决办法

springboot 优化 springboot优化 properties_springboot 优化_02

建立三个自定以配置文件,可以和系统文件不放在一起,毕竟有四个位置可以放,四选一。

在application-dev.yml中配置spring.profiles.include: config-dev,完美的解决了自定义配置和系统配置的绑定。再用Environment的方法读取

@Autowired
private Environment env;

env.getProperty("hello")


注意一个坑,Environment的Bean加载可能要比其他Bean晚,所以在给其他Bean类的全局变量赋值时可能是个null,所以只能在方法里使用。