ConditionalOnMissingBean

什么? @ConditionalOnMissingBean 你没设置value

方法一 对之后的扩展不友好,因为 可能之后有需求,根据type 或者 enable 来决定开启哪几个类,这个时候就会发现 结构不清晰,不好拆分

方法二 可以 对config类 进行控制,结构上也更加清晰

到这 你看看上面的写法还有问题么

没错 就上面这短短几行代码还有问题

问题出在:返回值应该是 接口 ,不能是 实现类

@ConditionalOnMissingBean 和 @ConditionalOnMissingBean(xxx.class) 有区别么

这就需要知道@ConditionalOnMissingBean 如果不填的时候 默认值是怎么取的

其中最后的代码在

例子

这就相当于@ConditionalOnMissingBean(AImpl.class)

可是我们要的是 @ConditionalOnMissingBean(AIn.class)

这样才能让 AIn 只有一个实现的bean

一句话 可以使用 @ConditionalOnMissingBean 无参数 ,但是一定要返回 接口不能是 实现类

问一个额外的问题 @ConditionalOnMissingBean(AIn.class)

AIn.class 赋值在哪个属性上了

答案是 会赋值在 value 属性上

不赋值的时候 会自动获取 返回值的class 放到value中

大概意思是 会赋值在 value上,那是不是可以理解为 只要@interface 注解中有value ,默认就可以不指定 value元素了

例子 你以为到这 就结束了?

到这 会想到 不设置属性会去找 value 是怎么写的,我们可以自定义么?

首先我们要先确定 属于编译期间做的事 还是 解析的时候 做的事

这就涉及 java的编译

大概流程如下

简单的办法就是看class 文件,下面是 class文件的内容,发现还是没有 value=

​可以确定是 java 代码执行的时候 带的处理

其实这部分的解析 就是spring 对注解的解析

我们可以先看我们平时怎么获取 class中的注解的

实际代码 真正的解析代码

默认是value是下面这块,底层调用的native 方法

value 这个属性的默认值 是写在class 类中的

  • @Conditional 满足指定的条件,则进行组件注入,如果不满足,则不注入。
  • @ConditionalOnBean:表示当容器中存在某个组件才进行组件注入
  • @ConditionalOnMissingBean:表示当容器中没有某个组件才进行组件注入