@Conditional
是 Spring 框架中的一个注解,用于条件化地加载 Bean。它的作用是根据指定的条件决定是否创建或注册某个 Bean。通过 @Conditional
,开发者可以根据环境、配置、系统属性等条件动态控制 Bean 的加载行为。
作用
@Conditional
的核心作用是条件化地控制 Bean 的创建。它允许开发者定义一些条件,只有当这些条件满足时,Spring 才会创建或注册对应的 Bean。
使用场景
- 环境适配:根据不同的环境(如开发、测试、生产)加载不同的 Bean。
- 配置依赖:根据配置文件中的某个属性值决定是否加载某个 Bean。
- 类路径依赖:根据类路径中是否存在某个类或资源决定是否加载某个 Bean。
- 系统属性:根据系统属性或 JVM 参数决定是否加载某个 Bean。
- 自定义条件:通过实现
Condition
接口,定义复杂的条件逻辑。
实现原理
@Conditional
注解需要与 Condition
接口配合使用。Condition
接口定义了一个 matches
方法,Spring 会调用该方法来判断是否满足条件。如果 matches
返回 true
,则加载对应的 Bean;否则不加载。
示例
1. 自定义条件类
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
public class MyCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
// 判断条件:检查某个系统属性是否存在
return System.getProperty("my.property") != null;
}
}
2. 使用 @Conditional
注解
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyConfig {
@Bean
@Conditional(MyCondition.class) // 只有当 MyCondition 的条件满足时,才会创建这个 Bean
public MyService myService() {
return new MyService();
}
}
在这个例子中,只有当系统属性 my.property
存在时,MyService
Bean 才会被创建。
Spring 内置的 @Conditional
派生注解
Spring 提供了许多基于 @Conditional
的派生注解,简化了常见条件的配置。例如:
@ConditionalOnProperty
:根据配置文件中的属性值决定是否加载 Bean。@ConditionalOnClass
:当类路径中存在某个类时加载 Bean。@ConditionalOnMissingBean
:当容器中不存在某个 Bean 时加载 Bean。@ConditionalOnExpression
:根据 SpEL 表达式的结果决定是否加载 Bean。@ConditionalOnWebApplication
:当应用是 Web 应用时加载 Bean。
示例:使用 @ConditionalOnProperty
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyConfig {
@Bean
@ConditionalOnProperty(name = "my.feature.enabled", havingValue = "true")
public MyService myService() {
return new MyService();
}
}
在这个例子中,只有当配置文件中 my.feature.enabled
的值为 true
时,MyService
Bean 才会被创建。
总结
@Conditional
是 Spring 中用于条件化加载 Bean 的核心注解。- 它可以与自定义的
Condition
实现类结合使用,也可以使用 Spring 提供的派生注解(如@ConditionalOnProperty
)。 - 通过
@Conditional
,开发者可以根据环境、配置、类路径等条件动态控制 Bean 的加载行为,从而实现更灵活的配置和优化。
THE END
暂无评论内容