You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

@ConditionalOnProperty在Spring Boot启动后是否会被重新评估?

问题描述

我正在开发一个Spring Boot项目,该项目可根据属性值选择使用MongoDB或PostgreSQL。

我有两个仓库实现:
MongoDB仓库:

@Repository
@ConditionalOnProperty(name = "app.storage", havingValue = "mongo")
public class MongoTreeRepository implements TreeRepository {
}

PostgreSQL仓库:

@Repository
@ConditionalOnProperty(name = "app.storage", havingValue = "postgres")
public class PostgresTreeRepository implements TreeRepository {
}

在application.properties中我会配置:

app.storage=mongo
# 或:
# app.storage=postgres

我的服务通过构造函数注入选中的仓库:

@Service 
public class TreeService {
    private final TreeRepository repository;

    public TreeService(TreeRepository repository) {
        this.repository = repository;
    } 
}

启动时该配置正常工作:若app.storage=mongo则注入MongoDB实现,若为postgres则注入PostgreSQL实现。

我的困惑在于Spring应用上下文启动后的情况:如果运行时修改属性值,注入的仓库不会变化,除非重启应用。

因此我的具体问题是:@ConditionalOnProperty仅在应用上下文创建时评估,还是无需重启或重建上下文即可在后续重新评估?

我并非询问如何设计完整的运行时切换系统,仅想了解@ConditionalOnProperty在启动后的生命周期行为。

回答

@ConditionalOnProperty仅在Spring应用上下文初始化阶段(启动时)进行评估,一旦上下文创建完成,后续即使修改属性值,这个注解也不会被重新评估,对应的Bean也不会被动态替换或重新创建。

这类Spring条件注解的核心作用是控制Bean的创建时机与是否创建,它们的逻辑只会在上下文启动时执行一次,用来判定哪些Bean应该被纳入Spring容器。一旦Bean被实例化并注入到依赖对象(比如你的TreeService)中,这些依赖关系就固定下来,运行时修改属性不会触发重新评估条件、销毁旧Bean或创建新Bean的操作。

所以你观察到的现象是正常的:运行时修改app.storage属性后,必须重启应用才能切换仓库实现。

内容的提问来源于stack exchange,提问作者J_oslee19

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.02 06:42:27