springboot~@ConditionalOnMissingBean一切为了可扩展性

本文探讨了@ConditionalOnMissingBean注解在Spring框架中的使用,特别是在Spring Boot和Spring Cloud组件中的常见应用。它强调了注解应添加在@Bean方法上而非@Service或@Component。通过一个故事,解释了当没有其他实现时,默认bean如何被注册并作为默认选择。当需要扩展时,开发者可以添加新的实现,而原有代码无需更改,体现了Spring的灵活性和可扩展性。文章还提及了作者整理的一系列Java面试题资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • @ConditionalOnMissingBean在很多spring框架里都得到很广泛的应用,如spring-boot-starter-security,spring-cloud-starter-oauth2中的应用。
  • 注意@ConditionalOnMissingBean这种注解需要添加在@Bean上面,而不是添加到@Service,@Component等上面。

主要是根本的使用方法,而本篇主要阐述它在可扩展性上的应用,通过一个例子来说明问题,以讲故事的方式来阐述给大家听:

  • 从前,有一个接口,它提供一个hello方法
public interface MissingBean {
  void hello();
}

  • 它有一个默认的实现,当没有其它实现时,就用这个默认的实现
public class DefaultMissingBean implements MissingBean {
  @Override
  public void hello() {
    System.out.println("default MissingBean");
  }
}

  • 通过配置类,将MissingBean的默认bean注册到ioc容器中,并声明为@ConditionalOnMissingBean,缺省的,默认的bean实例。
@Configuration
public class MissingBeanConfig {
  @Bean
  @ConditionalOnMissingBean(MissingBean.class)
  public MissingBean defaultMissingBean() {
    return new DefaultMissingBean();
  }
}

  • 开发人员在程序中调用了MissingBean,并输出了默认的结果
@RunWith(SpringRunner.class)
@SpringBootTest()
public class ConditionalOnClassTest {

  @Autowired
  MissingBean missingBean;

  /**
   * @ConditionalOnMissingBean.
   */
  @Test
  public void onMissingBean() {
    missingBean.hello();
  }
}

[图片上传失败...(image-49b245-1651029534795)]

  • 在具体项目中,开发人员觉得默认的DefaultMissingBean实现不能满足自己的要求,这时,它会进行扩展,添加了第一版实现V1MissingBean
@Component
public class V1MissingBean implements MissingBean {
  @Override
  public void hello() {
    System.out.println("v1 MissingBean");
  }
}

  • 这时,程序中的代码引用是不需要修改的,还是上面的代码,我们看一下输出的结果,它将是v1版本的结果
    [图片上传失败...(image-be7472-1651029534793)]

本人觉得,这才是@ConditionalOnMissingBean等一系列修饰@Bean注解的实际用法,也是spring真正的用义。

最近整理了一系列的Java面试题,包含了Java基础、进阶、多线程、并发编程、数据库(MySQL、Redis、MongoDB、Memcachedd等等)、Spring全家桶、MyBatis、ZooKeeper、Dubbo、Elasticsearch、RabbitMQ、Kafka、Linux、Netty、Tomcat以及阿里、腾讯、字节、百度等大厂的面试真题,另外可以微信搜索539413949获取我为大家准备的资料

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值