gpt4 book ai didi

java - 有没有办法防止 bean 被 Spring Boot 覆盖?

转载 作者:搜寻专家 更新时间:2023-10-31 08:18:54 26 4
gpt4 key购买 nike

使用 Spring 的 AbstractRefreshableApplicationContext ,如果 Bean ID 或循环引用发生冲突,我可以通过设置几个标志并像这样刷新上下文来强制 Spring 失败:

AbstractRefreshableApplicationContext refreshableContext;
...
refreshableContext.setAllowBeanDefinitionOverriding(false);
refreshableContext.setAllowCircularReferences(false);
refreshableContext.refresh();

然而,Spring Boot 返回一个 ConfigurableApplicationContext它不是 AbstractRefreshableApplicationContext 的实例,并且似乎没有任何方法来防止 bean 定义覆盖或循环引用。

有没有人知道一种方法并举例说明如何防止这些类型的冲突?

对于上下文,这是针对混合了带注释和 xml 定义的 bean 的大型项目。使用的 Spring Boot 版本是 1.3.1.RELEASE。在某些情况下,人们在 xml 中添加了重复的 bean 定义,但应用程序启动正常并且在运行时问题开始出现之前不会立即明显地覆盖原始 bean。

这里的目标是防止应用程序在发生此类冲突时启动事件。从各种论坛我知道 Spring IDE 可以检测到这些,但希望在 CI 构建中强制执行此操作,这是一个更强大的安全网。

经过一些搜索,我在 Sprint Boot 返回的上下文中找不到对此的任何支持。如果这不能通过上下文完成,是否有不同的解决方案可用?

提前致谢。

最佳答案

您可以在构建 Spring Boot 应用程序时使用初始化程序:

@SpringBootApplication
public class SpringBootApp {

public static void main(String... args) {
new SpringApplicationBuilder(SpringBootApp.class)
.initializers(new ApplicationContextInitializer<GenericApplicationContext>() {
@Override
public void initialize(GenericApplicationContext applicationContext) {
applicationContext.setAllowBeanDefinitionOverriding(false);
}
})
.run(args);

}
}

或者使用 java 8:

new SpringApplicationBuilder(SpringBootApp.class)
.initializers((GenericApplicationContext c) -> c.setAllowBeanDefinitionOverriding(false) )
.run(args);

关于java - 有没有办法防止 bean 被 Spring Boot 覆盖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38794460/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com