• SpringBoot中Conditional的条件


    @Conditional只有满足一些列条件之后创建一个bean。自己自定义Condition之外,Spring还提供了很多Condition给我们用.
    spring.factories文件里每一个xxxAutoConfiguration文件一般都会有下面的条件注解:
    @ConditionalOnBean:当容器里有指定Bean的条件下

    @ConditionalOnClass:当类路径下有指定类的条件下

    @ConditionalOnExpression:基于SpEL表达式作为判断条件

    @ConditionalOnJava:基于JV版本作为判断条件

    @ConditionalOnJndi:在JNDI存在的条件下差在指定的位置

    @ConditionalOnMissingBean:当容器里没有指定Bean的情况下

    @ConditionalOnMissingClass:当类路径下没有指定类的条件下

    @ConditionalOnNotWebApplication:当前项目不是Web项目的条件下

    @ConditionalOnProperty:指定的属性是否有指定的值

    @ConditionalOnResource:类路径是否有指定的值

    @ConditionalOnSingleCandidate:当指定Bean在容器中只有一个,或者虽然有多个但是指定首选Bean

    @ConditionalOnWebApplication:当前项目是Web项目的条件下。

    上面@ConditionalOnXXX都是组合@Conditional元注解,使用了不同的条件Condition

    @ConditionalOnWebApplication注解:

    package org.springframework.boot.autoconfigure.condition;
    
    import java.lang.annotation.Documented;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    import org.springframework.context.annotation.Conditional;
    
    @Target({ ElementType.TYPE, ElementType.METHOD })
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Conditional(OnWebApplicationCondition.class)
    public @interface ConditionalOnWebApplication {
    }
    

    从源码我们可以看出,此注解使用的条件是OnWebApplicationCondition类.
    从isWebApplication方法可以看出,判断条件是:

    GenericWebApplicationContext是否在类路径中;
    容器中是否有名为session的scope;
    当前容器的Enviroment是否为StandardServletEnvironment;
    当前的ResourceLoader是否是WebApplicationContext(ResourceLoader是ApplicationContext的顶级接口之一);
    我们需要构建ConditionOutcome类的对象来帮助我们,最终通过ConditionOutcome.isMatch方法返回值来确定条件。

  • 相关阅读:
    RabbitMQ安装
    windows下安装Erlang
    利用StopWatch类监控Java代码执行时间并分析性能
    HttpClinet工具类
    Javap与JVM指令
    idea全局护眼色绿豆沙
    删除注册在Eureka的服务(无效,多余)
    Steam之两个list间交集、并集、差集
    微服务与SpringCloud简介
    VS code 豆沙绿护眼主题
  • 原文地址:https://www.cnblogs.com/anycc/p/15423020.html
Copyright © 2020-2023  润新知