springboot~matchIfMissing精确的姿势

乌市泽哥  金牌会员 | 2025-2-12 12:46:45 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 893|帖子 893|积分 2679

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
  1. public interface MissingBean {
  2.         void hello();
  3. }
复制代码

  • DefaultMissingBean
  1. public class DefaultMissingBean implements MissingBean {
  2.         @Override
  3.         public void hello() {
  4.                 System.out.println("default MissingBean");
  5.         }
  6. }
复制代码

  • MissingBeanConfig
  1. @Configuration
  2. public class MissingBeanConfig {
  3.         /**
  4.          * @ConditionalOnMissingBean当没有其它MissingBean的bean时,就使用DefaultMissingBean这个bean.
  5.          * @return
  6.          */
  7.         @Bean
  8.         @ConditionalOnMissingBean(MissingBean.class)
  9.         public MissingBean defaultMissingBean() {
  10.                 return new DefaultMissingBean();
  11.         }
  12. }
复制代码

  • V1MissingBean
  1. @Component
  2. @ConditionalOnProperty(value = "test.v1.enabled")
  3. public class V1MissingBean implements MissingBean {
  4.         @Override
  5.         public void hello() {
  6.                 System.out.println("v1 MissingBean");
  7.         }
  8. }
复制代码
我们配置文件里不设置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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

乌市泽哥

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表