springboot~matchIfMissing正確的姿勢
matchIfMissing是@ConditionalOnProperty注解中的參數,它控制了在配置文件中沒有顯示聲明配置時,它的一個默認值,這個默認是false,就是說,當你有一個配置叫lind.redis.enabled,在配置(zhi)文件中(zhong)沒有聲明它(ta)(ta),那么我們就認(ren)為它(ta)(ta)是false、當(dang)值為false時(shi),你(ni)的(de)bean不會被(bei)(bei)裝(zhuang)配;當(dang)你(ni)希望你(ni)的(de)bean在不配置(zhi)它(ta)(ta)時(shi),它(ta)(ta)默認(ren)就可以被(bei)(bei)裝(zhuang)配,就把它(ta)(ta)設置(zhi)為true,很多組(zu)件默認(ren)值都改成了true,比如一(yi)個redis組(zu)件,只要(yao)引用(yong)它(ta)(ta)的(de)redis包,就自動開(kai)啟redis的(de)功能,這時(shi)需要(yao)把值設置(zhi)成true。
什么時候matchIfMissing設為false
我舉個(ge)實(shi)際的(de)例子,我有(you)個(ge)接口MissingBean,它有(you)個(ge)默認的(de)實(shi)現DefaultMissingBean,同(tong)時(shi)還有(you)個(ge)v1版本的(de)實(shi)現V1MissingBean,如(ru)果開發人員(yuan)不(bu)顯示開啟v1時(shi),就(jiu)使用DefaultMissingBean,這時(shi)你就(jiu)需要將matchIfMissing設(she)置為false了(le)
- MissingBean
public interface MissingBean {
void hello();
}
- DefaultMissingBean
public class DefaultMissingBean implements MissingBean {
@Override
public void hello() {
System.out.println("default MissingBean");
}
}
- MissingBeanConfig
@Configuration
public class MissingBeanConfig {
/**
* @ConditionalOnMissingBean當沒有其它MissingBean的bean時,就使用DefaultMissingBean這個bean.
* @return
*/
@Bean
@ConditionalOnMissingBean(MissingBean.class)
public MissingBean defaultMissingBean() {
return new DefaultMissingBean();
}
}
- V1MissingBean
@Component
@ConditionalOnProperty(value = "test.v1.enabled")
public class V1MissingBean implements MissingBean {
@Override
public void hello() {
System.out.println("v1 MissingBean");
}
}
我們(men)配置文(wen)件里不(bu)設(she)置test.v1.enabled,MissingBean會(hui)使用(yong)DefaultMissingBean,如(ru)果希(xi)望使用(yong)v1版本(ben),只(zhi)要在配置文(wen)件中手(shou)動設(she)置test.v1.enabled為true即可
總結
- 如果MissingBean有默認的實現,通過@ConditionalOnMissingBean(MissingBean.class)的話
- 則V1MissingBean就不能使用@Bean的方式進行注入了
- 通過@Bean再注入一個V1MissingBean,spring會找到兩個實現,這時,需要將它聲明為@Primary才行,如果通過@Component聲明,就是正常的。
- 通過@ConditionalOnProperty注解來控制它,可以通過配置屬性來裝配它,做到default和v1的切換.
- @ConditionalOnProperty注解來控制它中matchIfMissing默認是false,當需要它來裝配時,需要在配置文件中改成true 反之,如果你的組件希望在配置文件中不配置的情況下也能裝配,那么就需要將matchIfMissing設置為true