条件导入(@Conditional)

Exisi 2022-06-28 08:17:57
Categories: Tags:
  • @Conditional Spring4 版本新提供的注解,它的作用是按照设定的条件进行判断,把满足判断条件的 bean 注册到 Spring 容器。可以根据代码中设置的条件装载不同的 bean,符合条件则加载该 bean,不符合则不加载该 bean

 

参数

描述

value

指定实现 Condition 接口类的数组,默认为{}

指定的所有 Condition 接口类需要实现 matches 方法,返回 true 则注入 beanfalse 则不注入。

 

  • 可以通过实现Condtional接口类,自定Condtional类进行判断

示例

  • MyConditional.java

public class WindowsConditional implements Condition {

    @Override

    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {

        Environment environment = conditionContext.getEnvironment();

        String property = environment.getProperty("os.name");

        if(property.contains("Windows")){

            return true;

        }

        return false;

    }

}

 

  • PersonConfigure.java

@Configuration

// @Conditional({WindowsConditional.class})

public class PersonConfigure {

 

@Bean(name="bill")

@Conditional({WindowsConditional.class}) //如果满足MyConditional返回true,继续加载下面这个方法

public Person person1(){

return new Person("Bill Gates",62);

}

 

@Bean(name="linus")

@Conditional({WindowsConditional.class}) //如果满足MyConditional返回true,继续加载下面这个方法

public Person person2(){

return new Person("Linus",62);

}

 

}

 

  • PersonConfigure.java

@Configuration

@Conditional({WindowsConditional.class})

public class PersonConfigure {

 

@Bean(name="bill")

public Person person1(){

return new Person("Bill Gates",62);

}

 

@Bean(name="linus")

public Person person2(){

return new Person("Linus",62);

}

 

}

  • @Conditional 中的多个 Condition 都需要都满足,才会加载被注解的类

 

  • @Conditional 可以作用在方法上,也可以作用在类上。如果是类和方法都加了 @Conditional 注解,最终在方法上的注解为最终的条件,如果返回 true 则加入容器,反之不会加入容器。如果只是类上加了 @Conditional 注解,整个类的所有方法都会加入容器中。