条件注解
Spring 条件容器(Conditional Bean) 指的是: 只有在满足某些条件时,Spring 才会把 Bean 注册到 IoC 容器中。
@Conditional
原理
java
@Component
@Conditional(MyCondition.class)
public class UserService {}Spring 会先判断 MyCondition 是否成立:
- 成立 → 创建 Bean
- 不成立 → 不创建 Bean
java
@Target({TYPE, METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Conditional {
Class<? extends Condition>[] value();
}自定义条件(MyCondition)
- 创建条件类:实现
Condition接口:
java
public class MyCondition implements Condition {
@Override
public boolean matches(
ConditionContext context,
AnnotatedTypeMetadata metadata) {
return true; // true 才会注册 Bean
}
}返回值:
true→ 注册 Beanfalse→ 不注册
- 使用条件
java
@Configuration
public class AppConfig {
@Bean
@Conditional(MyCondition.class)
public UserService userService() {
return new UserService();
}
}常用条件注解
Spring 已经封装了大量条件注解。
@ConditionalOnProperty
根据配置文件创建 Bean。
@Bean
@ConditionalOnProperty(name="redis.enabled", havingValue="true")
public RedisService redisService() {
return new RedisService();
}只有配置:
redis.enabled=true才会创建。
@ConditionalOnClass
类存在才创建。
@ConditionalOnClass(name = "redis.clients.jedis.Jedis")如果没有 Redis 依赖,就不会创建 Redis Bean。
@ConditionalOnMissingBean
容器没有 Bean 时创建。
@Bean
@ConditionalOnMissingBean
public UserService userService() {
return new UserService();
}- 用户没定义 → Spring 自动创建
- 用户定义了 → Spring 不创建
@ConditionalOnBean
容器存在 Bean 才创建。
@ConditionalOnBean(DataSource.class)必须有 DataSource 才创建。
@ConditionalOnMissingClass
类不存在才创建。
@ConditionalOnMissingClass("redis.clients.jedis.Jedis")@ConditionalOnWebApplication
Web 环境才创建。
@ConditionalOnWebApplication