@Profile, @Conditional, @ConditionalOnMissingBean, @ConditionalOnClass
[Q&A] @Profile 引入背景
随着 Spring 应用在不同环境(开发、测试、生产)中部署的需求增加,配置文件的切换变得频繁。原有的方式需要手动修改配置或使用多个配置文件,维护成本高。@Profile 的出现使得开发者可以基于当前激活的 profile(如 dev、test、prod)来决定是否加载某个 Bean 或配置类。
[Q&A] @Conditional 引入背景
@Profile 虽然解决了环境差异问题,但无法满足更复杂的条件判断需求。@Conditional 提供了一个通用的条件化注册机制,允许开发者通过实现 Condition 接口自定义条件逻辑。
[Q&A] @ConditionalOnMissingBean 引入背景
Spring Boot 推出了自动配置机制,旨在减少用户手动配置。在自动装配过程中,为了避免重复创建相同类型的 Bean,引入了该注解,允许在容器中没有指定 Bean 时才进行自动创建。
[Q&A] @ConditionalOnClass 引入背景
Spring Boot 的自动配置模块中,很多配置依赖于第三方库的存在(如 Tomcat、Jackson、JPA 等)。如果项目中未引入这些依赖,自动配置类可能会因找不到类而报错。@ConditionalOnClass 的引入提供了一种优雅的方式,在类路径存在指定类时才加载相关配置,避免启动失败。
注解名称 | 所属模块 | 引入版本 | 作用维度 | 典型用途 |
---|---|---|---|---|
@Profile | Spring Framework | Spring 3.1 (2011) | 环境配置 | 根据环境加载不同配置,开发 / 测试 / 生产环境切换数据源 |
@Conditional | Spring Framework | Spring 4.0 (2013) | 自定义条件 | 动态控制 Bean 加载 |
@ConditionalOnMissingBean | Spring Boot | Spring Boot 1.0 (2014) | 容器状态 | 是否存在同类型 Bean,防止重复注册默认 Bean |
@ConditionalOnClass | Spring Boot | Spring Boot 1.0 (2014) | 类路径检查 | 类路径是否存在指定类,判断依赖是否存在以决定是否启用配置 |
注解名称 | 所属模块 | 引入版本 | 是否推荐使用 | 是否淘汰及替代建议 |
---|---|---|---|---|
@ConditionalOnExpression | spring-context-support / spring-boot-autoconfigure | Spring 3.1 (2011) / Boot 1.0 | ✔️ 是(灵活但复杂) | ❌ 否 |
@Conditional | spring-context | Spring 4.0 (2013) | ✔️ 是 | ❌ 否 |
@ConditionalOnMissingBean | spring-boot-autoconfigure | Spring Boot 1.0 (2014) | ✔️ 是 | ❌ 否 |
@ConditionalOnClass | spring-boot-autoconfigure | Spring Boot 1.0 (2014) | ✔️ 是 | ❌ 否 |
@ConditionalOnBean | spring-boot-autoconfigure | Spring Boot 1.0 (2014) | ✔️ 是 | ❌ 否 |
@ConditionalOnProperty | spring-boot-autoconfigure | Spring Boot 1.0 (2014) | ✔️ 是 | ❌ 否 |
@ConditionalOnResource | spring-boot-autoconfigure | Spring Boot 1.0 (2014) | ⚠️ 不常用 | ⚠️ 推荐替代: @ConditionalOnResourceCondition |
典型用法
Spring @Conditional, @ConditionalOnMissingBean, @ConditionalOnClass 等 典型用法
Spring @Profile 典型用法