Spring Boot如何在第三方库Bean初始化之前加载自定义配置Bean
最简方案:直接在local配置文件中定义变量
Spring Boot默认会将自身Environment中的配置同步到系统属性,你完全不需要写配置类,直接在application-local.properties(或yml)中添加对应配置即可:
ENV_1=TEST ENV_2=test
这个配置加载时机远早于Bean初始化,第三方过滤器的System.getProperty调用可以直接读到对应值。
如果因为特殊情况上面的方案不生效,可以用下面的兜底方案:
方案1:使用ApplicationContextInitializer(优先级最高,无顺序问题)
ApplicationContextInitializer的回调时机在Spring上下文刷新、所有Bean实例化之前,完全可以保证在第三方过滤器初始化前完成环境变量注入:
- 编写Initializer实现类:
@Profile("local") public class LocalEnvInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> { private static final Logger LOGGER = LoggerFactory.getLogger(LocalEnvInitializer.class); @Override public void initialize(ConfigurableApplicationContext applicationContext) { LOGGER.info("Injecting local variables configuration"); System.setProperty("ENV_1","TEST"); System.setProperty("ENV_2","test"); } }
- 注册到启动类:
@SpringBootApplication public class YourApplication { public static void main(String[] args) { SpringApplication app = new SpringApplication(YourApplication.class); app.addInitializers(new LocalEnvInitializer()); app.run(args); } }
方案2:动态修改第三方Bean依赖
如果你需要保留自定义配置类的逻辑,可以通过BeanDefinitionRegistryPostProcessor给第三方过滤器的Bean动态添加依赖规则,不需要修改第三方库代码:
@Configuration @ConditionalOnProperty(name = "spring.profiles.active", havingValue = "local") public class LocalEnvConfig { private static final Logger LOGGER = LoggerFactory.getLogger(LocalEnvConfig.class); // 定义环境变量初始化Bean @Bean("localEnvInit") public Object initLocalEnv() { LOGGER.info("Injecting local variables configuration"); System.setProperty("ENV_1","TEST"); System.setProperty("ENV_2","test"); return new Object(); } // 给第三方过滤器Bean添加dependsOn配置 @Bean public BeanDefinitionRegistryPostProcessor adjustFilterDependency() { return registry -> { // 替换为第三方过滤器在Spring容器中的实际Bean名,通常为类名首字母小写 String filterBeanName = "xxxWebFilter"; if (registry.containsBeanDefinition(filterBeanName)) { BeanDefinition filterDef = registry.getBeanDefinition(filterBeanName); filterDef.setDependsOn("localEnvInit"); } }; } }
注:你原有代码的问题是
@Bean注解的方法返回值为void,Spring不会将其识别为有效Bean,也不会执行对应逻辑,需要修正返回值。
内容的提问来源于stack exchange,提问作者Gabriel García Garrido
相关产品推荐
相关产品推荐

