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
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek-R1本地部署如何选择适合你的版本?看这里
· 开源的 DeepSeek-R1「GitHub 热点速览」
· 传国玉玺易主,ai.com竟然跳转到国产AI
· 揭秘 Sdcb Chats 如何解析 DeepSeek-R1 思维链
· 自己如何在本地电脑从零搭建DeepSeek!手把手教学,快来看看! (建议收藏)
2022-02-11 linux~添加组_添加用户_为用户加密码