一. 介绍
Condition 是 Spring 中的一个接口,它提供了一种在 Spring 配置中基于特定条件来决定是否注册一个 bean 或者一个配置类的机制。这种机制非常灵活,允许开发者基于环境变量、系统属性、类路径资源等多种条件来动态地包含或排除配置。
需要注意的是:Spring Boot 提供了许多内置的条件注解(如 @ConditionalOnProperty、@ConditionalOnClass 等),这些注解覆盖了大多数常见的使用场景,因此在可能的情况下,应优先考虑使用它们。
二. 使用场景
- 基于环境的配置:比如,你可能想要在开发环境中启用一个特定的 bean,而在生产环境中则禁用它;
- 条件性依赖:如果某个类路径下存在某个特定的库,你可能想基于这个库的存在与否来注册相关的 bean;
- 功能切换:根据某些配置或条件,启用或禁用应用中的某些功能;
Condition 接口包含了一个方法 matches(ConditionContext context, AnnotatedTypeMetadata metadata),这个方法会返回一个布尔值,表示条件是否满足,Spring 容器在注册 bean 或配置类时会调用这个方法,并根据返回值决定是否继续注册;
- ConditionContext:提供了访问注册 bean 定义的环境(如环境变量、系统属性等)的方法;
- AnnotatedTypeMetadata:提供了关于正在注册的 bean 或配置类的注解信息;
三. 使用示例
1、自定义 Condition 类,实现 matches();
public class EnvironmentCondition implements Condition {
/**
* 是否有 his 环境变量
*/
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
Environment environment = context.getEnvironment();
String hisProperty = environment.getProperty("his");
return StringUtils.isNoneEmpty(hisProperty);
}
}
2、配合 @Conditional 注解,可以作用在 @Configuration 和 @Bean 等注解上;
Spring 容器在注册 bean 或配置类时会调用该 condition 的 matches(),并根据返回值决定是否继续注册;
@Slf4j
@Configuration
//@Conditional(EnvironmentCondition.class)
public class ConditionalConfig {
@PostConstruct
public void postConstruct() {
log.info("ConditionalConfig-----");
}
@Bean
@Conditional(EnvironmentCondition.class)
public User myUser() {
log.info("myUser-----");
User user = new User();
return user;
}
}