在Spring Boot启动后,使用 @ConditionalOnProperty创建的Bean会重新评估吗?

后端开发 2026-07-09

我正在开发一个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

or:

    app.storage=postgres

我的服务通过构造注入接收所选的仓库:

@Service public class TreeService {

        private final TreeRepository repository;

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

应用启动时,这些能够正确工作。如果app.storage=mongo,就注入MongoDB实现;如果app.storage=postgres,就注入PostgreSQL实现。

我的困惑在于Spring应用上下文已经启动之后会发生什么。

如果属性值在应用运行时改变,注入的仓库不会改变,除非我重新启动应用。

因此我的具体问题是:

Spring Boot是不是仅在应用上下文创建时评估 @ConditionalOnProperty,还是可以在不重启或重新构建上下文的情况下稍后重新评估条件?

我不是在此处问如何设计一个完整的运行时切换系统。我只想理解启动后 @ConditionalOnProperty的生命周期行为。

解决方案

  • @ConditionalOnProperty 仅在Spring Boot启动时评估吗?

  • 如果属性稍后改变,条件bean会自动重新创建吗?

  • 在运行时在仓库之间切换时,是否有其他方法或设计模式更合适?

将两个仓库注入到TreeService,并使用自定义机制来决定使用哪一个。不过现在看起来这两个仓库似乎完全相同,代码也一样。你需要确保每个仓库使用的是正确的数据源。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章