《SpringBoot系列十五》源码+案例分析条件装配时多个Condition执行的顺序是什么样的?可以配置优先级吗?

本文详细分析了SpringBoot中多个Condition执行的顺序,包括AnnotationAwareOrderComparator的排序机制和Condition的执行流程。讨论了如何通过实现PriorityOrdered接口或@Order注解来设置优先级,并通过案例展示了排序规则。总结了自动装配类的条件装配最佳实践。
摘要由CSDN通过智能技术生成

文章目录

一、前言

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

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

本文我们接着讨论多个Condition的执行顺序。

二、多个Condition的排序

在博文<《SpringBoot系列十三》:图文精讲@Conditional条件装配实现原理>中,我们讨论了Condition条件装配的原理,其中介绍了条件装配如何执行?入口为:ConditionEvaluator#shouldSkip(AnnotatedTypeMetadata,ConfigurationPhase)方法,其返回值为boolean类型,方法返回true表示当前类应该被过滤掉(即不符合条件装配的规则)、否则表示当前类应该被留下(即符合条件装配的规则)。

/**
 * Determine if an item should be skipped based on {@code @Conditional} annotations.
 * @param metadata the meta data
 * @param phase the phase of the call
 * @return if the item should be skipped
 */
public boolean shouldSkip(@Nullable AnnotatedTypeMetadata metadata, @Nullable ConfigurationPhase phase) {
	// 如果类没被@Conditional衍生注解标注,则直接返回FALSE,表示当前类不应该被过滤掉
	if (metadata == null || !metadata.isAnnotated(Conditional.class.getName())) {
		return false;
	}

	// 如果没设置条件装配的阶段,当类是配置类时,为 PARSE_CONFIGURATION 阶段,否则默认为 REGISTER_BEAN 阶段
	if (phase == null) {
		if (metadata instanceof AnnotationMetadata &&
				ConfigurationClassUtils.isConfigurationCandidate((AnnotationMetadata) metadata)) {
			return shouldSkip(metadata, ConfigurationPhase.PARSE_CONFIGURATION);
		}
		return shouldSkip(metadata, ConfigurationPhase.REGISTER_BEAN);
	}

	// 获取类上所有的@Conditional 子注解,返回@Conditional注解中的value值
	List<Condition> conditions = new ArrayList<>();
	for (String[] conditionClasses : getConditionClasses(metadata)) {
		for (String conditionClass : conditionClasses) {
			Condition condition = getCondition(conditionClass, this.context.getClassLoader());
			conditions.add(condition);
		}
	}

	// 对获取到的所有Condition接口的实现类进行排序
	AnnotationAwareOrderComparator.sort(conditions);

	// 遍历所有的Condition,进行match
	for (Condition condition : condi
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值