FWIW,我通过编写一个自定义
ApplicationListener事件来实现此目的,该自定义事件在周期的早期触发,但在Config Service
PropertySource加载后触发。如果有人感兴趣,我已在此处附加了代码。如果有一种“正式的”
Spring方式可以做到这一点,我仍然很感兴趣,但是可以这样做:
package com.example;import org.springframework.boot.context.event.ApplicationPreparedEvent;import org.springframework.context.ApplicationListener;import org.springframework.core.Ordered;import org.springframework.core.annotation.Order;import org.springframework.core.env.CompositePropertySource;import org.springframework.core.env.ConfigurableEnvironment;import org.springframework.core.env.MutablePropertySources;import org.springframework.core.env.PropertySource;@Order(Ordered.HIGHEST_PRECEDENCE)public class ConfigServicePropertyDeprioritizer implements ApplicationListener<ApplicationPreparedEvent>{ private static final String CONFIG_SOURCE = "bootstrap"; private static final String PRIORITY_SOURCE = "systemEnvironment"; @Override public void onApplicationEvent(ApplicationPreparedEvent event) { ConfigurableEnvironment environment = event.getApplicationContext() .getEnvironment(); MutablePropertySources sources = environment.getPropertySources(); PropertySource<?> bootstrap = findSourceToMove(sources); if (bootstrap != null) { sources.addAfter(PRIORITY_SOURCE, bootstrap); } } private PropertySource<?> findSourceToMove(MutablePropertySources sources) { boolean foundPrioritySource = false; for (PropertySource<?> source : sources) { if (PRIORITY_SOURCE.equals(source.getName())) { foundPrioritySource = true; continue; } if (CONFIG_SOURCE.equals(source.getName())) { // during bootstrapping, the "bootstrap" PropertySource // is a simple MapPropertySource, which we don't want to // use, as it's eventually removed. The real values will // be in a CompositePropertySource if (source instanceof CompositePropertySource) { return foundPrioritySource ? null : source; } } } return null; }}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)