gpt4 book ai didi

java - 手动添加@PropertySource : Configuring Environment before context is refreshed

转载 作者:行者123 更新时间:2023-12-01 11:59:51 25 4
gpt4 key购买 nike

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

执行此操作的 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")对于每个单元测试。

我宁愿我的自定义初始值设定项或在我的情况下自定义 PropertySource 在正确的时间通过应用程序上下文 xml 文件加载,就像 @PropertySource 一样。似乎有效。

最佳答案

在查看了 @PropertySource 的加载方式之后,我弄清楚了需要实现哪个接口(interface),以便我可以在其他 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 : Configuring Environment before context is refreshed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28057056/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com