使用动态加载的属性创建自定义PropertySourcesPlaceholderConfigurer

时间:2014-09-23 00:22:18

标签: spring

我面临一些挑战,根据另一个属性文件中提供的某些值创建PropertySourcesPlaceholderConfigurer。 我有一个属性文件custom- {environment} .property,它包含一个值,用于设置PropertySourcesPlaceholderConfigurer的位置。

My CustomConfiguration类似于:

@Bean
public static PropertySourcesPlaceholderConfigurer placeholderConfigurer() {
    PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer();
    propertySourcesPlaceholderConfigurer.setLocation(customLocation);
    //Custom url location based on a String available in the properties file. This is the problem area
    return propertySourcesPlaceholderConfigurer;
}

我想从属性文件中填充此customLocation。尝试自动装配环境,但是当调用placeholderConfigurer()时环境为空,它失败了。尝试使用@PropertySource("custom-${environment}.property")然后使用@Value("**customLocation**"),但这也无效。

请让我知道如何做到这一点。提前谢谢。

2 个答案:

答案 0 :(得分:1)

我建议添加ApplicationContextInitializer来加载您的属性文件,而不是普通的@PropertySource。首先在您的可配置属性文件旁边加载custom-{environment}.properties

public class PropertySourceInitializer implements ApplicationContextInitializer {

    private static final String DEFAULT_CONFIG_FILE = "classpath:custom-${environment}.properties";

    @Override
    public void initialize(ConfigurableApplicationContext applicationContext) {
        final ConfigurableEnvironment env = applicationContext.getEnvironment();
        final MutablePropertySources mps = env.getPropertySources();    
        //
        Resource resource = applicationContext.getResource(env.resolvePlaceholders(DEFAULT_CONFIG_FILE));
        mps.addLast(new ResourcePropertySource(resource.getDescription(), resource));

        String additional = env.getProperty("name.of.property");
        if (StringUtils.hasText(additional) {
            Resource additionalResource = applicationContext.getResource(env.resolvePlaceholders(additional));
            if (additionalResource.isReadable() ) {
                mps.addLast(new ResourcePropertySource(resource.getDescription(), resource));
            }
        }
    }
}

尝试将其与@PropertySource一起使用会更加困难,因为创建PropertySourcesPlaceHolderConfigurer的阶段与扫描@PropertySource注释的阶段不同。分阶段加载@PropertySource(这基本上是你想要的)非常困难。 Spring Boot也有自己的加载机制(实际上也是ApplicationContextInitializer

答案 1 :(得分:0)

您可以尝试将您的位置设置为系统属性吗?

@Value("#{ systemProperties['myapp.location'] }") 
private String location;

您需要将“myapp.location”设置为系统属性。