AI智能
改变未来

Spring – @Conditional全解

文章目录

  • 作用
  • 扩展注解
  • Code
  • Bean1 Bean2
  • 自定义比较规则
  • 配置类
  • 测试类
  • 如何校验自动配置类是否生效
  • 作用

    必须是@Conditional指定的条件成立,才给容器中添加组件,配置配里面的所有内容才生效

    扩展注解

    @Conditional扩展注解 作用(判断是否满足当前指定条件)
    @ConditionalOnJava 系统的java版本是否符合要求
    @ConditionalOnBean 容器中存在指定Bean;
    @ConditionalOnMissingBean 容器中不存在指定Bean;
    @ConditionalOnExpression 满足SpEL表达式指定
    @ConditionalOnClass 系统中有指定的类
    @ConditionalOnMissingClass 系统中没有指定的类
    @ConditionalOnSingleCandidate 容器中只有一个指定的Bean,或者这个Bean是首选Bean
    @ConditionalOnProperty 系统中指定的属性是否有指定的值
    @ConditionalOnResource 类路径下是否存在指定资源文件
    @ConditionalOnWebApplication 当前是web环境
    @ConditionalOnNotWebApplication 当前不是web环境
    @ConditionalOnJndi JNDI存在指定项

    Code

    Bean1 Bean2

    public class Bean1 {public Bean1() {System.out.println("我是Bean1的构造方法");}}
    public class Bean2 {public Bean2() {System.out.println("我是Bean2的构造方法");}}

    自定义比较规则

    import org.springframework.context.annotation.Condition;import org.springframework.context.annotation.ConditionContext;import org.springframework.core.type.AnnotatedTypeMetadata;public class ArtisanCondition implements Condition {@Overridepublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {//判断容器中是否有bean1的组件if(context.getBeanFactory().containsBean("bean1")) {return true;}return false;}}

    配置类

    import com.tuling.testconditional.compent.Bean1;import com.tuling.testconditional.compent.Bean2;import com.tuling.testconditional.condition.ArtisanCondition;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Conditional;public class MainConfig {@Beanpublic Bean1 bean1() {return new Bean1();}// 如果满足ArtisanCondition中定义的规则,就实例化Bean2@Bean@Conditional(value = ArtisanCondition.class)public Bean2 bean2() {return new Bean2();}}

    测试类

    import com.tuling.testconditional.config.MainConfig;import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class MainClass {public static void main(String[] args) {AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(MainConfig.class);for(String beanName:ctx.getBeanDefinitionNames()) {System.out.println("beanName:"+beanName);}}}

    为了测试效果

    重新测试

    如何校验自动配置类是否生效

    配置文件中增加

    启用 debug=true属性;来让控制台打印自动配置报告

    赞(0) 打赏
    未经允许不得转载:爱站程序员基地 » Spring – @Conditional全解