如何保证spring容器中只有一个某一个接口类型的单例实现类?

现有个定制接口类型: Switcher,
自己写的自动配置中, 会注入默认的一个 SwitcherImpl 实现类.
别的地方引用这个模块时, 也可以定制一个 Switcher 覆盖默认的.
这样就需要保证, 整个 Spring 容器中, 只能存在一个 Switcher 接口类型的实现类.

请问, 这个改怎么保证?

阅读 378
评论 2019-05-02 提问
    1 个回答

    使用@ConditionalOnMissingBean即可

       @Configuration
       public class MyAutoConfiguration {
      
           @ConditionalOnMissingBean
           @Bean
           public Switcher defaultSwitcher() {
               ...
           }
      
       }

    不使用默认配置的项目手动创建自定义的bean即可,由于自动配置加了@ConditionalOnMissingBean,spring-boot检测到BeanFactory内存在Switcher类的Bean后便不会再创建默认的bean

       @Configuration
       public class SwitcherConfiguration {
      
           @Bean
           public Switcher customSwitcher() {
               ...
           }
      
       }

    如果非默认的bean也是自动配置通过自动配置注册的,则需要使用注解AutoConfigureBefore保证它先于默认bean的自动配置类执行

    
       @Configuration
       @AutoConfigureBefore(MyAutoConfiguration.class)
       public class CustomSwitcherAutoConfiguration {
      
           @Bean
           public Switcher customSwitcher() {
               ...
           }
      
       }
    评论 赞赏 2019-05-07
      撰写回答

      登录后参与交流、获取后续更新提醒