《SpringBoot系列十六》条件装配时ConfigurationCondition和Condition有什么区别?什么时候用ConfigurationCondition?

网友投稿 307 2022-08-23

《SpringBoot系列十六》条件装配时ConfigurationCondition和Condition有什么区别?什么时候用ConfigurationCondition?

一、前言

针对条件装配我们讨论了如下内容:

​​《SpringBoot系列十一》:精讲如何使用@Conditional系列注解做条件装配​​​​《SpringBoot系列十二》:如何自定义条件装配(由@ConditionalOnClass推导)​​​​《SpringBoot启动流程六》:SpringBoot自动装配时做条件装配的原理(万字图文源码分析)(含@ConditionalOnClass原理)​​​​《SpringBoot系列十三》:图文精讲@Conditional条件装配实现原理​​​​《SpringBoot系列十四》:@ConditionalOnBean、@ConditionalOnMissingBean注解居然失效了!​​

在​​《SpringBoot系列十三》:图文精讲@Conditional条件装配实现原理​​一文中,我们知道了条件装配时是分两阶段(配置类解析、Bean注册)进行的。

二、ConfigurationCondition

ConfigurationCondition接口是Spring4.0提供的注解,位于org.springframework.context.annotation包内,继承自Condition接口;

public interface ConfigurationCondition extends Condition { /** * 返回当前Condition可以被评估的配置阶段 * Return the {@link ConfigurationPhase} in which the condition should be evaluated. */ ConfigurationPhase getConfigurationPhase(); /** * Condition应该被评估的各个配置阶段 * The various configuration phases where the condition could be evaluated. */ enum ConfigurationPhase { /** * 配置类解析阶段 * The {@link Condition} should be evaluated as a {@code @Configuration} * class is being parsed. *

If the condition does not match at this point, the {@code @Configuration} * class will not be added. */ PARSE_CONFIGURATION, /** * Bean注册阶段 * The {@link Condition} should be evaluated when adding a regular * (non {@code @Configuration}) bean. The condition will not prevent * {@code @Configuration} classes from being added. *

At the time that the condition is evaluated, all {@code @Configuration} * classes will have been parsed. */ REGISTER_BEAN }}

ConfigurationCondition中的​​getConfigurationPhase()​​方法,用于返回ConfigurationPhase配置阶段(ConfigurationPhase 的枚举);

​​PARSE_CONFIGURATION​​:表示在配置类解析阶段进行Condition的评估;​​REGISTER_BEAN​​:表示在注册Bean阶段进行Condition的评估;

1、ConfigurationCondition和Condition的区别?

1> Condition评估的时机:ConfigurationCondition中提供配置阶段的概念,其包含两个阶段:PARSE_CONFIGURATION 和 REGISTER_BEAN,使用ConfigurationCondition接口实现类做Condition条件装配时,会判断传入的配置阶段和ConfigurationCondition#getConfigurationPhase()返回的配置阶段是否一致,如果不一致则不进行Condition评估;以此实现更细粒度的条件装配控制。Condition中没有配置阶段的概念,在任何时候都可以使用其进行Condition评估;2> 使用对比:OnBeanCondition实现ConfigurationCondition接口,getConfigurationPhase()返回​​ConfigurationPhase.REGISTER_BEAN​​,表示只在注册Bean阶段进行Condition评估,其他阶段ConditionEvaluator#shouldSkip()方法均直接返回false。OnClassCondition实现Condition接口,配置类加载的任何阶段都可以进行条件评估。

1)OnBeanCondition

1> OnBeanCondition类图:

2> OnBeanCondition实现的方法:

2)OnClassCondition

1> OnBeanCondition类图:

2、什么时候用ConfigurationCondition?

ConfigurationPhase的作用是控制条件评估(过滤)的时机:是在解析配置类的时候 还是在创建Bean的时候。

一般而言ConfigurationCondition多用于 只在注册Bean阶段才进行条件评估的Condition中使用,比如OnBeanCondition。以OnBeanCondition为例,其中的很多条件评估的依据只有在注册Bean阶段才会相对更加完整。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:企业为什么要做营销推广?这几个点要明确!(公司为什么要做推广)
下一篇:《SpringBoot系列十五》源码+案例分析条件装配时多个Condition执行的顺序是什么样的?可以配置优先级吗?
相关文章

 发表评论

暂时没有评论,来抢沙发吧~