• @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获取我为大家准备的资料

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐