如何在Spring Boot@Enable模式自定义Starter中让用户Bean覆盖内置Bean
解决方案
要解决用户自定义Formatter Bean时,Starter中对应Bean仍被注入的问题,只需修改自动配置类中的条件注解逻辑,无需改动@EnableFormatter模式,具体步骤如下:
- 给
jsonFormatter方法添加@ConditionalOnClass注解,确保仅当Jackson的ObjectMapper类存在时才创建该Bean,避免无Jackson依赖时创建无效的JsonFormatter。 - 为两个
@Bean方法统一添加@ConditionalOnMissingBean(Formatter.class)注解,该注解会检查容器中是否已存在任意Formatter类型的Bean——只要用户自定义了FormatterBean,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且对应依赖存在/缺失时,才创建对应的默认FormatterBean。
内容的提问来源于stack exchange,提问作者ght ggg
相关产品推荐
相关产品推荐

