Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Spring Environment Property Source Configuration

Tags:

spring

I'm working on an application library with a utility class called "Config" which is backed by the Spring Environment object and provides strongly typed getters for all the applications configuration values.

The property sources for the configuration can vary depending on environment (DEV/PROD) and usage (standalone/test/webapp), and can range from the default ones (system & env props) to custom database and JNDI sources.

What I'm struggling with is how to let the apps consuming this library easily configure the property source(s) used by Environment, such that the properties are available for use in our Config class and via the PropertySourcesPlaceholderConfigurer.

We're still using XML configuration, so ideally this could be configured in XML something like.

<bean id="propertySources" class="...">
    <property name="sources">
        <list>
            <ref local="jndiPropertySource"/>
            <ref local="databasePropertySource"/>
        </list>
    </property>
</bean>

...and then injected somehow into the Environment's property sources collection.

I've read that something like this may not be possible due to the timing of the app context lifecycle, and that this may need to be done using an application initializer class.

Any ideas?

like image 353
WayneC Avatar asked Jan 19 '13 15:01

WayneC


People also ask

How do I set environment specific properties in spring Boot?

Environment-Specific Properties File. If we need to target different environments, there's a built-in mechanism for that in Boot. We can simply define an application-environment. properties file in the src/main/resources directory, and then set a Spring profile with the same environment name.

What is property Source in spring?

Spring @PropertySource annotation is used to provide properties file to Spring Environment. This annotation is used with @Configuration classes. Spring PropertySource annotation is repeatable, means you can have multiple PropertySource on a Configuration class.

How do you use property Source annotation?

@PropertySource is a convenient annotation for including PropertySource to Spring's Environment and allowing to inject properties via @Value into class attributes. ( PropertySource is an object representing a set of property pairs from a particular source.) @PropertySource is used together with @Configuration .

What is @configuration in spring Boot?

Spring @Configuration annotation is part of the spring core framework. Spring Configuration annotation indicates that the class has @Bean definition methods. So Spring container can process the class and generate Spring Beans to be used in the application.


1 Answers

It depends on how you want to use the properties, if it is to inject the properties using ${propertyname} syntax, then yes just having PropertySourcesPlaceHolderConfigurer will work, which internally has access to the PropertySources registered in the environment.

If you plan to use Environment directly, using say env.getProperty(), then you are right - the properties using PropertySourcesPlaceHolderConfigurer are not visible here. The only way then is to inject it using Java code, there are two ways that I know of:

a. Using Java Config:

@Configuration
@PropertySource("classpath:/app.properties")
public class SpringConfig{

}

b. Using a custom ApplicationContextInitializer, the way it is described here

like image 78
Biju Kunjummen Avatar answered Nov 16 '22 01:11

Biju Kunjummen