Spring@ConditionalOnBean和@ConditionalOnMissingBean有什么区别
Posted 幽灵雾
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring@ConditionalOnBean和@ConditionalOnMissingBean有什么区别相关的知识,希望对你有一定的参考价值。
【提问】
Spring的注解中,@ConditionalOnBean和@ConditionalOnMissingBean有什么区别?
【解答】
@ConditionalOnBean和@ConditionalOnMissingBean均是@Conditional的派生注解,来给Bean的注入增加一些前提条件:
@Conditional是自定义注入的条件
@ConditionalOnBean是依赖某些Bean才能注入的条件
@ConditionalOnBean是排斥某Bean才能注入的条件
具体如下:
1、功能不同
@ConditionalOnBean 等价于 @Conditional(OnBeanCondition.class)
当给定的在Bean存在时,则实例化当前Bean,即:注册的前提是依赖某些Bean。
如图,“test”这个Bean在容器中存在的时候,TestBean2才会被注入:
特别的,如果ConditionalOnBean中没有添加任何参数,则不会注入TestBean2。可以这样理解:注册的前提是容器中存在(name=“空”)的Bean,但并没有这样的Bean在容器中,所以条件不满足,不予注册
@ConditionalOnMissingBean 等价于 @Conditional(OnBeanCondition.class)
当给定的在bean不存在时,则实例化当前Bean,即:注册的前提是排斥某些Bean。
如图,“test”这个Bean在容器中不存在的时候,TestBean2才会被注入:
特别的,如果ConditionalOnMissingBean中没有添加任何参数,则会注入TestBean2。可以这样理解:注册的前提是容器中不存在(name=“空”)的Bean,容器中确实没有这样的Bean,所以条件满足,进行注册
2、应用场景不同
@ConditionalOnBean 一般用于某个对象需要依赖于其他一些对象的场景。
同样,也可以使用同样功能的 @ConditionalOnClass 注解(当给定的Class在Bean存在时,则注入当前Bean)
@ConditionalOnMissingBean 一般用于指定备用或兜底Bean(例如:如果未配置实际数据库,则使用内存数据库)
同样,也可以使用同样功能的 @ConditionalOnMissingClass 注解(当给定的Class在Bean不存在时,则注入当前Bean)
@ConditionalOnExpression(当表达式为true的时候,才会实例化一个Bean)
@ConditionalOnMissingBean(仅仅在当前上下文中不存在某个对象时,才会实例化一个Bean)
@ConditionalOnMissingClass(某个class类路径上不存在的时候,才会实例化一个Bean)
@ConditionalOnNotWebApplication(不是web应用)
【补充知识点】
@Conditional除了上述派生注解之外,还有其他一些派生注解用来限制注入的条件:
@ConditionalOnExpression
当表达式为true的时候,则实例化当前Bean。具体:
@ConditionalOnExpression("${testbean.id}>=0&&'${testbean.name}'.equals('kid')")
@ConditionalOnNotWebApplication
不是web应用的时候,则实例化当前Bean。具体:
//不是SERVLET应用:org.springframework.web.context.support.GenericWebApplicationContext
//不是REACTIVE应用:org.springframework.web.reactive.HandlerResult
@ConditionalOnWebApplication(type= ConditionalOnWebApplication.Type.SERVLET)
@ConditionalOnJava
当java版本满足条件的时候,则实例化当前Bean。具体:
// 1.8及以上java版本会注入
@ConditionalOnJava(JavaVersion.EIGHT)
除此之外,@Conditional的派生注解还有很多,用来实现各种类型的条件
【前置知识点】
@Conditional 详解
以上是关于Spring@ConditionalOnBean和@ConditionalOnMissingBean有什么区别的主要内容,如果未能解决你的问题,请参考以下文章
Spring@ConditionalOnBean和@ConditionalOnMissingBean有什么区别
第三十一节:扫盲并发和并行同步和异步进程和线程阻塞和非阻塞响应和吞吐等
shell中$()和 ` `${}${!}${#}$[] 和$(()),[ ] 和(( ))和 [[ ]]