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中$()和 ` `${}${!}${#}$[] 和$(()),[ ] 和(( ))和 [[ ]]

Java基础8---面向对象代码块和继承和this和super和重写和重载和final

Java基础8---面向对象代码块和继承和this和super和重写和重载和final