Spring Boot 进阶-详解SpringBoot中条件注解使用

在这里插入图片描述
  作为使用Spring Boot框架的开发者来讲,如果你连如下的这些注解你都没有听说过,没有用过,那我劝你还是放弃吧?

  在Spring Boot中我们最常见到的注解应该是条件注解了吧!也就是@ConditionalXXX的注解。例如在我们自动配置类上经常会看到@ConditionalOnMissingBean,表示在容器中不存在这样一个Bean注入的时候才会生效。

  在Spring Boot的框架中使用了大量的这样的条件注解来实现根据不同的应用场景加载不同的配置项的逻辑,那么接下来我们就来看看在Spring Boot中都有那些值得我们学习和了解的注解呢?

@Conditional

  @Conditional注解是从Spring 4.0版本之后出现的注解,可以标注在任何的类型或者方法上面,通过这个注解来实现一些条件的判断,当满足了对应的条件之后标注了该注解的类或者方法才会被注入到容器中。

  在Spring 或者是SpringBoot中@Conditional注解被大量的使用,例如在控制某个JavaBean对象是否要被注入到容器中的时候,需要采用不同的条件判断来实现。例如前面提到的@ConditionalOnMissingBean、@ConditionalOnBean等等。

  而@Conditional源码相对来说比较简单,如下所示。

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

	/**
	 * All {@link Condition} classes that must {@linkplain Condition#matches match}
	 * in order for the component to be registered.
	 */
	Class<? extends Condition>[] value();

}

  在注解中有一个属性value,可以是一个也可以是多个,而对于这个注解的判断则是由Condition接口实现来进行判断,代码如下

@FunctionalInterface
public interface Condition {
   

	boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);

}

Condition接口

  在@Conditional注解判断中,条件是否城里取决于在value中指定的类对象是否是Condition接口的实现,在Condition接口中有一个matches()的方法,如果这个方法返回值为ture的时候则表示判断的条件城里,否则就表示判断条件不成立,也就不能往容器中进行注入操作。其中matches()方法有两个参数分别表示如下的含义

  • ConditionContext :表示要判断条件成立对应的上下文环境是什么,也就是说判断条件成立的时候需要从上下文环境中获取对应的判断条件。
  • AnnotatedTypeMetadata:表示被标记了@Conditional注解的对象的所有元数据信息。用来判断是否满足注入到容器中的条件。

  这其中AnnotatedTypeMetadata没有什么好说的,就是对象标注的信息,而ConditionContext则是条件判断的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nihui123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值