I need to know difference between below two ways of loading a property file.
Approach-1
<context:property-placeholder location="classpath:constants.properties"/>
Approach-2
<context:component-scan base-package="com.snippets.enterprise"/>
package com.snippets.enterprise;
@Configuration
@PropertySource("classpath:/constants.properties")
public class SpringConfig {}
I see in approach two keys and values are available when application context is loading. but in
approach one keys of the properties are not available when application context is loading and it says
key is not found. Please let me know the difference of these two approaches.
When property files are loading with the application context.
When key,values of property files get initialized in the container.
Both are actually quite independent. Let me try and clarify based on my understanding:
Approach 1 of using context:property-placeholder
registers a component which can resolve placeholders of form ${propertyname}
in bean definitions.
whereas the @PropertySource
annotation contributes properties to the active Spring environment.
Now, coming back to Approach 1, context:property-placeholder
actually is intelligent enough to know that it needs to look not just at the properties registered through its location
attribute but also to look at the properties available in the current active environment(to which properties have been added in through the @PropertySource
annotations like in your approach2).
So, if you want your placeholders to continue to be resolved you will need to use your approach1 with approach2.
If on the other hand you want to use approach 2 exclusively then, the best way is to inject in an environment where you need the property and explicitly look for the property, this way:
@Component
public class MyBean {
@Autowired
private Environment environment;
public void mymethod() {
..
environment.getProperty("mykey");
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With