@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
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做了扩展:
- ConditionalOnBean ConditionalOnMissingBean:容器中存在某个类或不存在某个Bean时进行Bean装载
- ConditionalOnClass ConditionalOnMissingClass:classpath下存在指定类或者不存在指定类时进行Bean装载
- ConditionalOnResource:指定资源是否存在于classpath下
- ConditionalOnProperty: 系统中指定的对应的属性是否有对应的值。
批量自动装配条件配置
SpringBoot 提供了spring-autoconfigure-metadata.properties实现批量自动装配条件配置
约定优于配置:
- 配置文件的路径和名称必须是META-INF/spring-autoconfigure-metadata.properties
- 配置文件中key的配置格式:自动配置类的类全路径名.条件=值
降低了SpringBoot启动时间,过滤发生在配置类的装配之前,降低Spring Boot启动时装载Bean的耗时。