- @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真正的用義,
作者:倉儲大叔,張占嶺,
榮譽:微軟MVP
QQ:853066980
支付寶掃一掃,為大叔打賞!

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/443444.html
標籤:Java
