Spring ConfigurationCondition接口详解

Crq
Crq
Crq
1161
文章
0
评论
2022年5月6日12:23:51
评论
443 1078字阅读3分35秒
摘要

最近在看@ConditionalOnBean的时候,看到了ConfigurationCondition接口,对这个接口比较陌生,故了解一下。

介绍

ConfigurationCondition的定义是这样的,它继承了Condition类,如果读者对Condition类不不熟悉,可以在Spring @Conditional注解 详细讲解及示例 中了解。

package org.springframework.context.annotation;
public interface ConfigurationCondition extends Condition {
ConfigurationCondition.ConfigurationPhase getConfigurationPhase();
//可以翻译为构建阶段
public static enum ConfigurationPhase {
PARSE_CONFIGURATION,
REGISTER_BEAN;
private ConfigurationPhase() {
}
}
}

接口中有一个getConfigurationPhase方法,用来返回ConfigurationPhase枚举类型。

先来看看ConfigurationPhase枚举类型:
它有两个值:
PARSE_CONFIGURATION:Condition应评估@Configuration类,如果此时条件不匹配,@Configuration 则不会添加该类。
REGISTER_BEAN:该条件不会阻止 @Configuration添加类,在评估条件时,所有@Configurations都将被解析。

个人理解

ConfigurationPhase的作用就是根据条件来判断是否加载这个配置类,OnBeanCondition(此注解的功能就是判断是否存在某个bean,如果存在,则不注入标注的bean或者类)之所以返回REGISTER_BEAN,是因为需要无论如何都要加载这个配置类(如果是PARSE_CONFIGURATION,则有可能不加载),配置类中的bean的注入需要再根据bean的注入条件来判断。

再者,@onBeanCondition的设计是想如果matches方法返回true,则注入bean,如果返回false则不注入bean。如果枚举值选择了PARSE_CONFIGURATION,matches返回false整个配置将不被加载了,和设计有冲突。

总结

实验证明,ConfigurationPhase的作用并不是根据条件来判断是否加载这个配置类,实际ConfigurationPhase控制的是过滤的时机,是在创建Configuration类的时候过滤还是在创建bean的时候过滤(也可用条件注解的生效阶段来描述)。

weinxin
我的微信
这是我的微信扫一扫
Crq
  • 本文由 发表于 2022年5月6日12:23:51
  • 转载请注明:https://www.cncrq.com/10168.html
DevOps监控微服务的五原则 Linux教程

DevOps监控微服务的五原则

监控是微服务控制系统的关键部分,你的软件越复杂,那么你就越难了解其性能及问题排障。鉴于软件交付发生的巨大改变,监控系统同样需要进行彻底的改造,以便在微服务环境下表现更好。
Linux 中重置数据库的 root 密码的技巧 Linux教程

Linux 中重置数据库的 root 密码的技巧

其中一项是设置数据库 root 帐户的密码 - 你必须保持私密,并仅在绝对需要时使用。如果你忘记了密码或需要重置密码(例如,当数据库管理员换人或被裁员!),这篇文章会派上用场。
总说Linux,到底什么是Linux? Linux教程

总说Linux,到底什么是Linux?

Linux是最知名和最常用的开源操作系统。作为一个操作系统,Linux是一个软件,位于计算机上的所有其他软件的下面,从这些程序接收请求并将这些请求转发到计算机硬件。
Ubuntu12.04嵌入式交叉编译环境搭建 Linux教程

Ubuntu12.04嵌入式交叉编译环境搭建

在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,我们就称这种编译器支持交叉编译,这个编译过程就叫交叉编译。简单地说,就是在一个平台上生成另一个平台上的可执行代...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: