@Conditional 条件装配
@Conditional是spring Framework提供的一个核心注解, 作用是提供一个自动装配的条件约束,一般与@configuation 和@Bean配合使用
代码:
Conditional代码改注解可以接收一个Condition数组
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Conditional {
Class<? extends Condition>[] value();
}
Condition是一个函数式接口,提供了matches方法,返回true表示可以注入Bean
@FunctionalInterface
public interface Condition {
boolean matches(ConditionContext var1, AnnotatedTypeMetadata var2);
}
demo
定义condition
public class MyCondition implements Condition {
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
String os=conditionContext.getEnvironment().getProperty("os.name");
if (os.contains("Windows"))
{
return true;
}
return false;
}
}
定义类
public class MyBeanClass {
public String getName()
{
return "a";
}
}
定义条件Bean
@Configuration
public class MyConditionConfig {
@Bean
@Conditional(MyCondition.class)
public MyBeanClass myBeanClass()
{
return new MyBeanClass();
}
}
启动测试
public static void main(String[] args) {
ConfigurableApplicationContext context= SpringApplication.run(Application.class,args);
MyBeanClass firstClass=context.getBean(MyBeanClass.class);
System.out.println(firstClass.getName());
}
spring boot中的@Conditional
做了扩展提供了更简单的使用形式
ConditionalOnBean/ConditionalOnMissingBean下存在指定类或者不存在某个Bean时进行Bean加载
ConditaionalOnClass/ConditionalOnMissingClass:classpath下存在指定类或者不存在指定类时进行Bean加载
ConditionalOnCloudPlatform 只有运行在指定的云平台上才加载指定的bean
ConditionOnJava 只有运行在指定版本的Java才会加载Bean
ConditionalOnProperty 系统中指定属性有对应的值才加载Bean
ConditionalOnResource 要加载的Bean依赖指定的资源是否存在classpath中