由示例引出本文的主角
首先新建两个Pojo,分别是People和Company
1 | java复制代码 |
1 | java复制代码 |
有了这两个Pojo我们可以开始搞事情了
定义一个ConditionText类,将Company作为bean注入IOC容器中并返回对象,并同样创建People作为bean依赖Company。
1 | java复制代码/** |
然后我们在测试类中注入People并输出people信息
1 | java复制代码@Slf4j |
发现正常输出没有毛病,也符合实际开发的需求。
那么问题来了,如果上面的Company没有注入成功,会出现什么事情
(将Company注释掉模拟没有注入成功的场景)
1 | java复制代码 |
启动直接空指针爆红了,这显然不是我们想要的结果,我们是要当Company已经注入成功那么实例化People,如果没有注入成功那么不实例化People。
那么我们该怎么做呢?
本文的重点来了:
@ConditionalOnBean注解的作用
将上述测试代码修改如下:
1 | java复制代码/** |
运行测试,发现这次没爆红,而且People如我们所愿没有实例化
ConditionalOnBean的作用是什么,它是怎么实现的呢?
注解ConditionalOnBean是什么
源码如下:
1 | java复制代码 |
其中我们看@Conditional(OnBeanCondition.class)是Spring4新提供的注解,它的作用是按照一定的条件进行判断,满足条件的才给容器注册Bean(有关于这个注解会另起一篇文章分析)
而@ConditionalOnBean作用是当给定的在bean存在时,则实例化当前Bean
需要注意配合上@Autowired(required = false)使用 required=false 的意思就是允许当前的Bean对象为null。
其实类似@ConditionalOnBean有很多注解
例如:
1 | less复制代码@ConditionalOnBean // 当给定的在bean存在时,则实例化当前Bean |
原理大致相同。
本文转载自: 掘金