azi
azi

Reputation: 929

Priority of Various Sources in PropertySources

Spring has introduced a new annotation @PropertySources for all classes marked as @Configuration since 4.0. It takes different @PropertySource as argument.

@PropertySources({
    @PropertySource("classpath:application.properties"), @PropertySource("file:/tmp/application.properties")})

What I am interested is knowing is the ordering in case of conflict in values for the same key present in multiple properties file. I have not seen any documentation related to this that specifies an ordering. I have tries it multiple times and found that the PropertySource mentioned later is overwriting the value present in PropertySource mentioned before. But, how to be sure?

Upvotes: 16

Views: 9757

Answers (3)

bairamovazat
bairamovazat

Reputation: 51

HL'REB is right. "Win" the parameter from the last properties file. However, application.properties overrides all values. Checked for SPRING 5.1.6.

Upvotes: 5

Neil
Neil

Reputation: 25815

It seems likely that @PropertySource annotations inside of a @PropertySources annotation are processed in the order they appear, based on my tests, however if you set up a listener, they will print in reverse order.

Annotations:

@Configuration
@PropertySources({
  @PropertySource(value = "classpath:application.global.properties"),
  @PropertySource(
      value = "classpath:application.client-specific.properties",
      ignoreResourceNotFound = true),
  @PropertySource(
      value = "file:/etc/omnia/application.client-specific.properties",
      ignoreResourceNotFound = true),
  @PropertySource(value = "classpath:application.test.properties", ignoreResourceNotFound = true)
})

And the logging output:

Loading @PropertySource: 'configurationProperties'
Loading @PropertySource: 'servletConfigInitParams'
Loading @PropertySource: 'servletContextInitParams'
Loading @PropertySource: 'systemProperties'
Loading @PropertySource: 'systemEnvironment'
Loading @PropertySource: 'random'
Loading @PropertySource: 'URL [file:/etc/omnia/application.client-specific.properties]'
Loading @PropertySource: 'class path resource [application.global.properties]'

Upvotes: 3

HL'REB
HL'REB

Reputation: 866

The documentation of @PropertySources does not say anything about the case where the same property exists in more than one @PropertySource files.

However, the documentation of @PropertySource states the following :

In cases where a given property key exists in more than one .properties file, the last @PropertySource annotation processed will 'win' and override

Since the @PropertySource declarations within @PropertySources are actually a table, then it is fairly safe to assume that the last declared @PropertySource overrides the previous ones. This is consistent with the tests I've done and with this blog post.

However, as mentioned in the question, it is not indicated clearly in the documentation. So the behavior might "accidentally" change in the future.

Upvotes: 10

Related Questions