Spring Boot:当spring.properties和application.yml由spring boot应用程序加载时

时间:2017-05-22 14:16:36

标签: spring-boot

我希望记录应用程序正在加载application-profile.propeties或application.yml。怎么做。在哪种方法中,我可以监听并检测到它是否成功加载或失败。

4 个答案:

答案 0 :(得分:1)

您可以通过添加侦听ApplicationReadyEvent

的组件来记录已加载的属性源
@Component
public class LoadedConfigFileListener implements ApplicationListener<ApplicationReadyEvent>, Ordered {

    private static final Logger logger = LoggerFactory.getLogger(LoadedConfigFileListener.class);

    @Override
    public void onApplicationEvent(ApplicationReadyEvent event) {
        MutablePropertySources propertySources = event.getApplicationContext().getEnvironment().getPropertySources();
        Iterator<PropertySource<?>> propertySourceIterator = propertySources.iterator();
        propertySourceIterator.forEachRemaining(propertySource -> logger.info("Successfully loaded: \"{}\" into application context", propertySource.getName()));
    }

    @Override
    public int getOrder() {
        return ConfigFileApplicationListener.DEFAULT_ORDER + 1;
    }
}

答案 1 :(得分:1)

如果要调试加载属性,请添加以下环境变量(启动Java代码时的命令行参数):

logging.level.org.springframework.core.env=DEBUG

您可以在日志行中看到例如:

2017-05-23 08:37:00.773 DEBUG 26152 --- [           main] o.s.core.env.MutablePropertySources      : Adding [applicationConfig: [file:./application.properties]] PropertySource with lowest search precedence
...
2017-05-23 08:37:00.774 DEBUG 26152 --- [           main] o.s.c.e.PropertySourcesPropertyResolver  : Found key 'server.port' in [applicationConfig: [file:./application.properties]] with type [String]
...
2017-05-23 08:37:02.087 DEBUG 26152 --- [           main] o.s.c.e.PropertySourcesPropertyResolver  : Found key 'spring.datasource.url' in [applicationConfig: [file:./application.properties]] with type [String]

答案 2 :(得分:0)

24.4特定于配置文件的属性

请参阅http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-external-config-profile-specific-properties

application.properties 文件外,还可以使用命名约定application- {profile} .properties定义特定于配置文件的属性。

环境有一组默认配置文件(默认情况下为[默认]),如果未设置活动配置文件,则使用这些配置文件(即,如果没有显式激活配置文件,则加载application-default.properties中的属性)。

特定于配置文件的属性从与标准application.properties相同的位置加载,特定于配置文件的文件始终覆盖非特定文件,而不管特定于配置文件的文件是在打包的jar内部还是外部。

如果指定了多个配置文件,则应用最后获胜策略。例如,spring.profiles.active属性指定的配置文件是在通过SpringApplication API配置的配置文件之后添加的,因此优先。

例如:您可以在appliation.properties中设置个人资料名称

K

将加载dev配置文件。

答案 3 :(得分:0)

Spring Boot应用程序的初始日志输出有什么问题?当我开始一个开箱即用的春季启动应用程序时,前5行之一是:

2017-05-23 23:09:59 INFO e.r.t.MyApplication - No active profile set, falling back to default profiles: default

该日志输出告诉我已加载默认(application.yml)属性文件。对于所有处于活动状态的配置文件,将加载相应的属性文件。

例如,如果这是我的日志输出:

2017-05-23 23:14:32 INFO e.r.t.MyApplication - The following profiles are active: cloud, dev, special

然后将加载 ALL 这些属性文件(注意,您可以互换.properties和.yml):

application.yml

application-cloud.yml

application-dev.yml

application-special.yml

FURTHERMORE,请记住Spring Boot允许以读取属性文件的顺序覆盖属性,因此最后加载的属性文件获胜。在这种情况下,如果我声明了一个属性,在上述所有4个属性文件中调用它my.property,只会加载application-special.yml中的值,因为它是最后一个应用的配置文件。