Spring中@Condition底层实现原理

@Condition是Spring中很关键的一个注解,它能够帮助我们只注册符合条件的Bean,我们可以通过配置、容器中的Bean、Java版本等筛选符合bean注册。

1.注解逻辑

以ConditionOnBean为例

@Target({
    ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(OnBeanCondition.class)
public @interface ConditionalOnBean {
   
}

本质上引入了OnBeanCondition类来进行筛选,而这个类是继承于Condition类来实现的。

@FunctionalInterface
public interface Condition {
   
	/**
	*	该方法用于判断该注解条件是否符合,符合返回true
	**/
	boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);

}

2.SpringBoot扩展

SpringBoot为了使这个注解能够更加全面,定义了抽象类SpringBootCondition,所有的条件注解都是继承于此类,但SB提供的所有注解都没有实现matches方法,只有在SpringBootCondition中有,那么我们可以得出其实是使用了模版方法

@Override
public final boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
   
	String classOrMethodName = getClassOrMethodName(metadata);
	try {
   
		// 本质通过子类getMatchOutcome来实现具体方法逻辑
		ConditionOutcome outcome = getMatchOutcome(context, metadata);
		logOutcome(classOrMethodName, outcome);
		recordEvaluation(context, classOrMethodName, outcome);
		return outcome.isMatch();
	}
	catch (NoClassDefFoundError ex) {
   
		xxx
	}
	catch (RuntimeException ex) {
   
		xxx
	}
}

3.具体的ge

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值