写点什么

@Conditional 条件装配

作者:周杰伦本人
  • 2022 年 7 月 16 日
  • 本文字数:1513 字

    阅读完需:约 5 分钟

@Conditional 条件装配

@Conditional 提供自动装配的条件约束,一般与 @Configuration 和 @Bean 配合使用


根据该注解配置的条件决定是否实现 Bean 的装配


@Target({ElementType.TYPE, ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface Conditional {
/** * All {@link Condition Conditions} that must {@linkplain Condition#matches match} * in order for the component to be registered. */ Class<? extends Condition>[] value();
}
复制代码


Condition 是一个接口 ,提供 matches 方法,返回 true 表示可以注入 Bean,返回 false 表示不满足条件,不能注入 Bean

自定义 Condition

我们可以自定义 Condition


ConditionConfig 配置类:


@Configurationpublic class ConditionConfig {
@Bean @Conditional(XpCondition.class) public BeanClass beanClass(){ return new BeanClass(); }}
复制代码


public class XpCondition implements Condition{
@Override public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) { //此处进行条件判断,如果返回true,表示需要加载该配置类或者Bean //否则,表示加载 String os=conditionContext.getEnvironment().getProperty("os.name"); if(os.contains("Linux")){ return true; } return false; }}
复制代码


public class ConditionMain {
public static void main(String[] args) { AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext(ConditionConfig.class); BeanClass beanClass=context.getBean(BeanClass.class); System.out.println(beanClass); }}
复制代码


XpCondition 的 matches 返回 true 时候,才会将 BeanClass 装载到 Spring Ioc 容器中

SpringBoot 中的 Conditional

SpringBoot 针对 Conditional 做了扩展:


  • ConditionalOnBean ConditionalOnMissingBean:容器中存在某个类或不存在某个 Bean 时进行 Bean 装载

  • ConditionalOnClass ConditionalOnMissingClass:classpath 下存在指定类或者不存在指定类时进行 Bean 装载

  • ConditionalOnResource:指定资源是否存在于 classpath 下

  • ConditionalOnProperty: 系统中指定的对应的属性是否有对应的值。

  • ConditionalOnExpression:符合指定表达式的时候除此以外,SpringBoot 还扩展了别的 Conditional 注解的扩展类

批量自动装配条件配置

SpringBoot 提供了 spring-autoconfigure-metadata.properties 实现批量自动装配条件配置


约定优于配置:


  • 配置文件的路径和名称必须是 META-INF/spring-autoconfigure-metadata.properties

  • 配置文件中 key 的配置格式:自动配置类的类全路径名.条件=值


降低了 SpringBoot 启动时间,过滤发生在配置类的装配之前,降低 Spring Boot 启动时装载 Bean 的耗时。

总结

这篇文章从 @Conditional 注解出发,并且利用 @Conditional 注解自定义 Condition 类,同时讲解了一下 SpringBoot 基于 @Conditional 注解封装了一些自己的注解,比如 ConditionalOnBean 注解、ConditionalOnClass 注解等等,这些注解在 SpringBoot 和其他框架的源码中经常被使用,对于 Spring Boot 的批量自动装配,用约定大于配置的思想,规定配置文件必须是 META-INF/spring-autoconfigure-metadata.properties,而且这个文件中必须以 key value 形式的存储,springboot 除了这个自动装配条件以外,还有利用 spring-boot 的 SPI 机制来获得所有自动装配的配置信息,我们从上篇文章的 Springboot 的自动装配机制中对 Springboot 自动装配的源码分析中就能看出来,主要是通过这两个来进行自动装配的。

发布于: 刚刚阅读数: 4
用户头像

还未添加个人签名 2020.02.29 加入

公众号《盼盼小课堂》,多平台优质博主

评论

发布
暂无评论
@Conditional条件装配_7月月更_周杰伦本人_InfoQ写作社区