- @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真正的用義。