Spring @PropertySource пример

Пример Spring @PropertySource

spring-properties-example

В Spring вы можете использовать аннотацию@PropertySource для экстернализации вашей конфигурации в файл свойств. В этом руководстве мы покажем вам, как использовать@PropertySource для чтения файла свойств и отображения значений с помощью@Value иEnvironment.

P.S @PropertySource has been available since Spring 3.1

1. @PropertySource и @Value

Классический пример: чтение файла свойств и отображение с${}.

config.properties

mongodb.url=1.2.3.4
mongodb.db=hello

AppConfigMongoDB

package com.example.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
//...

@Configuration
@ComponentScan(basePackages = { "com.example.*" })
@PropertySource("classpath:config.properties")
public class AppConfigMongoDB {

    //1.2.3.4
    @Value("${mongodb.url}")
    private String mongodbUrl;

    //hello
    @Value("${mongodb.db}")
    private String defaultDb;

    @Bean
    public MongoTemplate mongoTemplate() throws Exception {

        MongoClientOptions mongoOptions =
            new MongoClientOptions.Builder().maxWaitTime(1000 * 60 * 5).build();
        MongoClient mongo = new MongoClient(mongodbUrl, mongoOptions);
        MongoDbFactory mongoDbFactory = new SimpleMongoDbFactory(mongo, defaultDb);
        return new MongoTemplate(mongoDbFactory);

    }

    //To resolve ${} in @Value
    @Bean
    public static PropertySourcesPlaceholderConfigurer propertyConfigInDev() {
        return new PropertySourcesPlaceholderConfigurer();
    }

}

Note
Чтобы разрешить $ \ {} в@Values, вы должны зарегистрировать статическийPropertySourcesPlaceholderConfigurer в файле конфигурации XML или аннотации.

2. @PropertySource и среда

Spring рекомендует использоватьEnvironment для получения значений свойств.

AppConfigMongoDB

package com.example.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
//...

@Configuration
@ComponentScan(basePackages = { "com.example.*" })
@PropertySource("classpath:config.properties")
public class AppConfigMongoDB {

    @Autowired
    private Environment env;

    @Bean
    public MongoTemplate mongoTemplate() throws Exception {

        String mongodbUrl = env.getProperty("mongodb.url");
        String defaultDb = env.getProperty("mongodb.db");

        MongoClientOptions mongoOptions =
            new MongoClientOptions.Builder().maxWaitTime(1000 * 60 * 5).build();
        MongoClient mongo = new MongoClient(mongodbUrl, mongoOptions);
        MongoDbFactory mongoDbFactory = new SimpleMongoDbFactory(mongo, defaultDb);
        return new MongoTemplate(mongoDbFactory);

    }

}

3. Дополнительные примеры @PropertySource

Более общие примеры.

3.1 Example to resolve $\{} within @PropertySource resource locations.

    @Configuration
    @PropertySource("file:${app.home}/app.properties")
    public class AppConfig {
        @Autowired
        Environment env;
    }

Установите системное свойство во время запуска.

    System.setProperty("app.home", "test");

    java -jar -Dapp.home="/home/mkyon/test" example.jar

3.2 Include multiple properties files.

    @Configuration
    @PropertySource({
        "classpath:config.properties",
        "classpath:db.properties" //if same key, this will 'win'
    })
    public class AppConfig {
        @Autowired
        Environment env;
    }

Примечание
. Если ключ свойства дублируется, последний объявленный файл будет «выигрывать» и иметь приоритет.

4. Spring 4 и @PropertySources

Некоторые улучшения Spring 4.

4.1 Introduces new @PropertySources to support Java 8 and better way to include multiple properties files.

    @Configuration
    @PropertySources({
        @PropertySource("classpath:config.properties"),
        @PropertySource("classpath:db.properties")
    })
    public class AppConfig {
        //...
    }

4.2 Allow @PropertySource to ignore the not found properties file.

    @Configuration
    @PropertySource("classpath:missing.properties")
    public class AppConfig {
        //...
    }

Еслиmissing.properties не найден, система не может запуститься и выдаетFileNotFoundException

    Caused by: java.io.FileNotFoundException:
        class path resource [missiong.properties] cannot be opened because it does not exist

В Spring 4 вы можете использоватьignoreResourceNotFound, чтобы игнорировать файл ненайденных свойств

    @Configuration
    @PropertySource(value="classpath:missing.properties", ignoreResourceNotFound=true)
    public class AppConfig {
        //...
    }
        @PropertySources({
        @PropertySource(value = "classpath:missing.properties", ignoreResourceNotFound=true),
        @PropertySource("classpath:config.properties")
        })

Готово.