Spring Vault中EnvironmentPostProcessor的Autowired注入Bean为null问题
问题原因分析
- 核心原因:
EnvironmentPostProcessor的执行时机远早于Spring Bean的初始化流程。Spring Boot启动阶段的顺序是:先触发所有注册的EnvironmentPostProcessor完成环境配置处理,之后才会启动Spring上下文扫描、实例化Bean、处理@Autowired依赖注入。你通过spring.factories注册的后置处理器在启动早期就被实例化调用,此时Spring上下文还未初始化完成,所有Bean都还没有被创建,@Autowired注解完全不会生效,因此注入的对象都是null。 - 次要排查点:你给
VaultTemplate、VaultPostProcessor、VaultCloudProperties都加了@Profile("cloud")注解,需要确认当前应用激活的Profile确实包含cloud,否则这两个Bean根本不会被注册到Spring容器中,就算后续上下文初始化完成也无法注入。 - 额外拼写问题:你配置类的
@ConfigurationProperties前缀写为core.applicaiton.vault,其中applicaiton是拼写错误,正确应为application,该问题会导致配置类无法读取到对应配置,但不是注入为null的直接原因。
修复方案
如果需要保留自定义环境变量的逻辑,推荐将实现改为ApplicationContextInitializer,该接口的执行时机在Spring上下文初始化后、刷新前,可以直接从上下文获取已经初始化完成的Bean,示例调整逻辑如下:
@Profile("cloud") @Component public class VaultPropertySourceInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext>, Ordered { private static final String VERSION_BACKEND_PREFIX = "^/v1/"; private int order = ConfigFileApplicationListener.DEFAULT_ORDER + 2; @Override public void initialize(ConfigurableApplicationContext applicationContext) { // 手动从上下文获取Bean,此时已经完成初始化 VaultTemplate vaultTemplate = applicationContext.getBean(VaultTemplate.class); VaultCloudProperties vaultCloudProperties = applicationContext.getBean(VaultCloudProperties.class); ConfigurableEnvironment environment = applicationContext.getEnvironment(); MutablePropertySources sources = environment.getPropertySources(); sources.addFirst(new VaultPropertySource(vaultTemplate, vaultCloudProperties.getServiceSecretPath().replaceAll(VERSION_BACKEND_PREFIX, ""))); sources.addFirst(new VaultPropertySource(vaultTemplate, vaultCloudProperties.getSpaceSecretPath().replaceAll(VERSION_BACKEND_PREFIX, ""))); sources.addFirst(new VaultPropertySource(vaultTemplate, vaultCloudProperties.getOrgSecretPath().replaceAll(VERSION_BACKEND_PREFIX, ""))); } @Override public int getOrder() { return order; } }
之后将该类注册到spring.factories的org.springframework.context.ApplicationContextInitializer配置项即可。
内容的提问来源于stack exchange,提问作者lapots
相关产品推荐
相关产品推荐

