@Conditional条件装配

举报
周杰伦本人 发表于 2022/05/11 15:37:06 2022/05/11
【摘要】 @Conditional条件装配 自定义Condition SpringBoot中的Conditional 批量自动装配条件配置 总结 @Conditional条件装配@Conditional 提供自动装配的条件约束,一般与@Configuration和@Bean配合使用根据该注解配置的条件决定是否实现Bean的装配@Target({ElementType.TYPE, ElementTyp...

@Conditional条件装配

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

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

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @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配置类:

@Configuration
public 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自动装配的源码分析中就能看出来,主要是通过这两个来进行自动装配的。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。