springboot~@ConditionalOnMissingBean一切為了可擴展性


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

之前寫過關於@ConditionalOnMissingBean注解的用過springboot~@ConditionalOnMissingBean注解的作用,主要是根本的使用方法,而本篇主要闡述它在可擴展性上的應用,通過一個例子來說明問題,以講故事的方式來闡述給大家聽:

  • 從前,有一個接口,它提供一個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();
  }
}

  • 在具體項目中,開發人員覺得默認的DefaultMissingBean實現不能滿足自己的要求,這時,它會進行擴展,添加了第一版實現V1MissingBean
@Component
public class V1MissingBean implements MissingBean {
  @Override
  public void hello() {
    System.out.println("v1 MissingBean");
  }
}
  • 這時,程序中的代碼引用是不需要修改的,還是上面的代碼,我們看一下輸出的結果,它將是v1版本的結果

本人覺得,這才是@ConditionalOnMissingBean等一系列修飾@Bean注解的實際用法,也是spring真正的用義。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM