Spring Boot中自定义@Configuration类被starter包同类覆盖如何解决
Spring Cloud AWS 自定义PropertySourceLocator被默认实现覆盖解决方案
PropertySourceLocator属于Spring Cloud Bootstrap上下文(父上下文)的加载逻辑,常规针对主应用上下文的@SpringBootApplication排除、普通优先级配置不生效,需要针对Bootstrap上下文做调整
方案1:直接禁用Starter默认的ParamStore配置
这是最直接的方案,直接关闭starter中默认的参数存储加载逻辑,在配置文件中添加如下配置:
# 需写在bootstrap.yml中;Spring Boot 2.4+ 若启用了bootstrap上下文也可写在application.yml spring: cloud: aws: paramstore: enabled: false
配置生效后默认的AwsParamStorePropertySourceLocator不会被实例化,只会加载你自定义的实现。
方案2:使用@Primary注解强制优先使用自定义实现
如果不需要完全关闭starter的自动配置,只需要让Spring优先选择你的自定义实现,给自定义的PropertySourceLocator Bean添加@Primary注解即可:
@Slf4j @Configuration @Primary // 新增注解,同类型Bean优先注入当前类实例 @Order(Ordered.HIGHEST_PRECEDENCE) // 配置最高优先级 @RequiredArgsConstructor public class CustomAwsParamStorePropertySourceLocatorConfig implements PropertySourceLocator { // 你的原有实现逻辑 }
如果你的自定义Locator是通过@Bean方式注册的,把@Primary加在@Bean方法上即可:
@Bean @Primary public PropertySourceLocator customAwsParamStoreLocator() { return new CustomAwsParamStorePropertySourceLocator(); }
方案3:显式排除Bootstrap上下文中的Starter自动配置
之前排除不生效是因为你用的@SpringBootApplication(exclude = xxx)只能排除主应用上下文的配置类,Bootstrap上下文的配置需要单独排除,在配置文件中添加:
spring: cloud: bootstrap: exclude: io.awspring.cloud.autoconfigure.paramstore.AwsParamStoreAutoConfiguration # 注意替换为你实际使用的starter中ParamStore自动配置类的全限定名,旧版本Spring Cloud AWS包名可能为com.amazonaws开头
额外校验点
- 确认你的自定义配置类已经正确注册到Bootstrap上下文的加载列表中:需要在
META-INF/spring.factories里配置org.springframework.cloud.bootstrap.BootstrapConfiguration指向你的自定义配置类全限定名 - Spring Boot 3.x版本注意自动配置的注册路径已经变更为
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports,不要使用旧的spring.factories路径注册主上下文自动配置
内容的提问来源于stack exchange,提问作者Deniss M.
相关产品推荐
相关产品推荐

