在Spring Boot启动后,使用 @ConditionalOnProperty创建的Bean会重新评估吗?
我正在开发一个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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。