springboot~matchIfMissing正確的姿勢
matchIfMissing是@ConditionalOnProperty注解中的參數,它控制了在配置文件中沒有顯示聲明配置時,它的一個默認值,這個默認是false,就是說,當你有一個配置叫lind.redis.enabled,在配置文件中沒有聲明它,那么我們就認為它是false、當值為false時,你的bean不會被裝配;當你希望你的bean在不配置它時,它默認就可以被裝配,就把它設置為true,很多組件默認值都改成了true,比如一個redis組件,只要引用它的redis包,就自動開啟redis的功能,這時需要把值設置成true。
什么時候matchIfMissing設為false
我舉個實際的例子,我有個接口MissingBean,它有個默認的實現DefaultMissingBean,同時還有個v1版本的實現V1MissingBean,如果開發人員不顯示開啟v1時,就使用DefaultMissingBean,這時你就需要將matchIfMissing設置為false了
- 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");
}
}
我們配置文件里不設置test.v1.enabled,MissingBean會使用DefaultMissingBean,如果希望使用v1版本,只要在配置文件中手動設置test.v1.enabled為true即可
總結
- 如果MissingBean有默認的實現,通過@ConditionalOnMissingBean(MissingBean.class)的話
- 則V1MissingBean就不能使用@Bean的方式進行注入了
- 通過@Bean再注入一個V1MissingBean,spring會找到兩個實現,這時,需要將它聲明為@Primary才行,如果通過@Component聲明,就是正常的。
- 通過@ConditionalOnProperty注解來控制它,可以通過配置屬性來裝配它,做到default和v1的切換.
- @ConditionalOnProperty注解來控制它中matchIfMissing默認是false,當需要它來裝配時,需要在配置文件中改成true 反之,如果你的組件希望在配置文件中不配置的情況下也能裝配,那么就需要將matchIfMissing設置為true
浙公網安備 33010602011771號