Spring Boot配置加载

Spring Boot默认加载的是application.propertiesapplication.yml,如果两个配置同时存在时,默认使用会使用properties的配置替换yml,可以理解为先加载yml,然后加载properties进行替换。

如果配置了spring.profiles.active属性时,还会加载application-{profiles}.propertiesapplication-{profiles}.yml

上面文件加载的顺序是:application.yml application-{profiles}.yml application.properties application-{profiles}.properties,后面的配置会替换前面的配置。

自定义配置

自定义properties

email.port=22
email.name=email-name
email.user.names=user-names
email-tencent.port=tencent-22
email-tencent.name=email-tencent-name
email-tencent.user.names=user-tencent-names

可以使用如下代码进行自动注入:

@ConfigurationProperties(prefix = "email")
@PropertySource(value = "email.properties")
...
private String port;
private String name;
@Value("${email.user.names}")
private String names;

portname可以自动注入,email.user.names需要写注解才可以设置正确的值。
如果不写@Value注解names的值会是null
如果@Value("${email.user.names}")注解放到name上面,name的值依旧是email-name,而不会变成user-names
最终上面三个变量的值是: 22/email-name/user-names

如果不写prefix时,上面portname的值是null

自定义yml

email :
  user :
    names : user-names
  port : 22
  name : email-name
email-tencent :
  user :
    names : user-tencent-names
  port : tencent-22
  name : email-tencent-name

代码如下:

@ConfigurationProperties
@PropertySource(value = "email.yml")
...
private String port;
private String name;
private String names;

yaml不支持@Value注解,只能自动解析了,不过names可以自动注入。
不过这里有一个问题就是不能区分emailemail-tencent了,后面的会替换前面的配置,最终三个变量的值是: tencent-22/email-tencent-name/user-tencent-names