我想在通过XML配置刷新上下文之前将PropertySource添加到Spring Environment

Java配置方法是:

@Configuration
@PropertySource("classpath:....")
public ConfigStuff {
   // config
}


并且猜测以某种方式神奇地@PropertySource将在刷新/初始化上下文之前进行处理。

但是我想做一些动态的事情,而不仅仅是从类路径中加载。

我知道如何在刷新上下文之前配置Environment的唯一方法是实现ApplicationContextInitializer<ConfigurableApplicationContext>并注册它。

我强调寄存器部分,因为这需要通过servlet上下文和/或在单元测试的情况下为每个单元测试向@ContextConfiguration(value="this I don't mind", initializers="this I don't want to specify")告知您的环境上下文初始化程序。

我宁愿使用我的自定义初始化程序,还是实际上在情况下通过应用程序上下文xml文件加载自定义PropertySource,就像@PropertySource看起来如何工作一样。

最佳答案

查看@PropertySource的加载方式后,我弄清楚了需要实现哪个接口,以便可以在其他beanPostProcessor运行之前配置环境。诀窍是实现BeanDefinitionRegistryPostProcessor

public class ConfigResourcesEnvironment extends AbstractConfigResourcesFactoryBean implements ServletContextAware,
    ResourceLoaderAware, EnvironmentAware, BeanDefinitionRegistryPostProcessor {

    private Environment environment;

    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        if (environment instanceof ConfigurableEnvironment) {
            ConfigurableEnvironment env = ((ConfigurableEnvironment) this.environment);
            List<ResourcePropertySource> propertyFiles;
            try {
                propertyFiles = getResourcePropertySources();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
            //Spring prefers primacy ordering so we reverse the order of the files.
            reverse(propertyFiles);
            for (ResourcePropertySource rp : propertyFiles) {
                env.getPropertySources().addLast(rp);
            }
        }
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        //NOOP
    }

    @Override
    public void setEnvironment(Environment environment) {
        this.environment = environment;
    }


}


我的getResourcePropertySources()是自定义的,所以我没有花时间去显示它。附带说明,此方法可能不适用于调整环境配置文件。为此,您仍然需要使用初始化程序。

关于java - 手动添加@PropertySource:在刷新上下文之前配置环境,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28057056/

10-10 03:38