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

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: 《SpringBoot系列十六》条件装配时ConfigurationCondition和Condition有什么区别?什么时候用ConfigurationCondition?

一、前言

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

  1. 《SpringBoot系列十一》:精讲如何使用@Conditional系列注解做条件装配
  2. 《SpringBoot系列十二》:如何自定义条件装配(由@ConditionalOnClass推导)
  3. 《SpringBoot启动流程六》:SpringBoot自动装配时做条件装配的原理(万字图文源码分析)(含@ConditionalOnClass原理)
  4. 《SpringBoot系列十三》:图文精讲@Conditional条件装配实现原理
  5. 《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.
         * <p>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.
         * <p>At the time that the condition is evaluated, all {@code @Configuration}
         * classes will have been parsed.
         */
        REGISTER_BEAN
    }

}

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

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

1、ConfigurationCondition和Condition的区别?

1> Condition评估的时机:

  1. ConfigurationCondition中提供配置阶段的概念,其包含两个阶段:PARSE_CONFIGURATION 和 REGISTER_BEAN,使用ConfigurationCondition接口实现类做Condition条件装配时,会判断传入的配置阶段和ConfigurationCondition#getConfigurationPhase()返回的配置阶段是否一致,如果不一致则不进行Condition评估;以此实现更细粒度的条件装配控制。
  2. Condition中没有配置阶段的概念,在任何时候都可以使用其进行Condition评估;

2> 使用对比:

  1. OnBeanCondition实现ConfigurationCondition接口,getConfigurationPhase()返回ConfigurationPhase.REGISTER_BEAN,表示只在注册Bean阶段进行Condition评估,其他阶段ConditionEvaluator#shouldSkip()方法均直接返回false。
  2. OnClassCondition实现Condition接口,配置类加载的任何阶段都可以进行条件评估。

1)OnBeanCondition

1> OnBeanCondition类图:
在这里插入图片描述
2> OnBeanCondition实现的方法:
在这里插入图片描述

2)OnClassCondition

1> OnBeanCondition类图:
在这里插入图片描述

2、什么时候用ConfigurationCondition?

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

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

相关文章
|
3月前
|
消息中间件 Java 数据库
解密Spring Boot:深入理解条件装配与条件注解
Spring Boot中的条件装配与条件注解提供了强大的工具,使得应用程序可以根据不同的条件动态装配Bean,从而实现灵活的配置和管理。通过合理使用这些条件注解,开发者可以根据实际需求动态调整应用的行为,提升代码的可维护性和可扩展性。希望本文能够帮助你深入理解Spring Boot中的条件装配与条件注解,在实际开发中更好地应用这些功能。
62 2
|
4月前
|
NoSQL Java 数据库连接
springBoot:整合其他框架&condition&切换web配置 (五)
本文档介绍了如何在Spring Boot项目中整合JUnit、Redis和MyBatis等框架,并提供了相应的依赖配置示例。同时,还展示了如何通过条件注解实现Bean的条件创建,以及如何切换Web服务器配置,从默认的Tomcat切换到Jetty。
|
8月前
|
Java Spring 容器
在 Spring Boot 中,条件装配(Conditional Configuration)和条件注解(Conditional Annotations)
在 Spring Boot 中,条件装配(Conditional Configuration)和条件注解(Conditional Annotations)
158 1
|
9月前
|
XML Java 数据库
【SpringBoot:详解Bean装配】
【SpringBoot:详解Bean装配】
|
9月前
|
Java
SpringBoot之@Conditional衍生条件装配详解
SpringBoot之@Conditional衍生条件装配详解
130 0
|
9月前
|
XML Java API
Springboot的自动装配解读
Spring Framework本身有一个IOC容器,该容器会统一管理其中的Bean对象,Bean对象可以理解为组件,要理解组件装配,首先要理解组件的概念。
|
9月前
|
存储 Java 开发工具
SpringBoot中Bean的条件装配
本文总结了在SpringBoot中常用的bean装配方法: * profile * conditional * ConditionalOn
100 1
|
Java 容器 Spring
Springboot Condition 实用讲解,只看一遍包学会
Springboot Condition 实用讲解,只看一遍包学会
313 0
Springboot Condition 实用讲解,只看一遍包学会
|
25天前
|
JavaScript Java 测试技术
基于SpringBoot+Vue实现的留守儿童爱心网站设计与实现(计算机毕设项目实战+源码+文档)
博主是一位全网粉丝超过100万的CSDN特邀作者、博客专家,专注于Java、Python、PHP等技术领域。提供SpringBoot、Vue、HTML、Uniapp、PHP、Python、NodeJS、爬虫、数据可视化等技术服务,涵盖免费选题、功能设计、开题报告、论文辅导、答辩PPT等。系统采用SpringBoot后端框架和Vue前端框架,确保高效开发与良好用户体验。所有代码由博主亲自开发,并提供全程录音录屏讲解服务,保障学习效果。欢迎点赞、收藏、关注、评论,获取更多精品案例源码。
59 10