You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Spring Boot@Enable模式自定义Starter中让用户Bean覆盖内置Bean

解决方案

要解决用户自定义Formatter Bean时,Starter中对应Bean仍被注入的问题,只需修改自动配置类中的条件注解逻辑,无需改动@EnableFormatter模式,具体步骤如下:

  1. 给jsonFormatter方法添加@ConditionalOnClass注解,确保仅当Jackson的ObjectMapper类存在时才创建该Bean,避免无Jackson依赖时创建无效的JsonFormatter。
  2. 为两个@Bean方法统一添加@ConditionalOnMissingBean(Formatter.class)注解,该注解会检查容器中是否已存在任意Formatter类型的Bean——只要用户自定义了Formatter Bean,Starter中的两个Bean就不会被创建。

修改后的完整代码:

@Import(FormatterAutoConfiguration.class)
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface EnableFormatter {
}

@Configuration
public class FormatterAutoConfiguration {

    @Bean
    @ConditionalOnMissingBean(Formatter.class)
    @ConditionalOnClass(name = "com.fasterxml.jackson.databind.ObjectMapper")
    public Formatter jsonFormatter() {
        return new JsonFormatter();
    }

    @Bean
    @ConditionalOnMissingBean(Formatter.class)
    @ConditionalOnMissingClass(name = "com.fasterxml.jackson.databind.ObjectMapper")
    public Formatter defaultFormatter() {
        return new DefaultFormatter();
    }
}

原理说明

  • @ConditionalOnMissingBean(Formatter.class)会在Bean定义加载阶段检查容器中是否存在Formatter类型的Bean,用户定义的static类型Bean会在配置类初始化前就被注册到容器,因此能被该条件正确检测到。
  • 结合@ConditionalOnClass和@ConditionalOnMissingClass,保证了Starter仅在无用户自定义Bean且对应依赖存在/缺失时,才创建对应的默认Formatter Bean。

内容的提问来源于stack exchange,提问作者ght ggg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 06:54:53