@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

