首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >spring.main.allow-bean-definition-overriding=true是个不好的做法吗?

spring.main.allow-bean-definition-overriding=true是个不好的做法吗?
EN

Stack Overflow用户
提问于 2019-05-17 14:56:48
回答 3查看 3.3K关注 0票数 3

我正在构建一个服务器,以将遗留应用程序移植到一个更健壮的框架上。这是我第一个使用这些技术的项目。到目前为止,我已经用2个API建立了一个概念证明,回答是"Hello!“在JSON里。一个是开放的,另一个是用OAuth2保护的。我已经完成了根据需求对安全性进行调整。

我还构建了一个强大的测试结构,使用了用于集成测试的Rest和用于单元测试的Spring的组合,因此我确信我已经准备好开始使用TDD方法来实现真正的MockMvc。

我们在用Maven。我的问题是,一旦我对我们现有的工件有了依赖,我就会得到以下堆栈。我明白这意味着什么,但是我们的代码库很大,我不知道这是从哪里来的。当我问谷歌这个问题时,我经常会发现结果只是建议将spring.main.allow-bean-definition-overriding=true添加到我的属性中。这不就是把问题扫到地毯底下吗?我想这是一个很好的理由,为什么Spring默认不允许这样做。简单地用方便的应用程序属性忽略该错误会带来什么后果?

堆栈:

代码语言:javascript
运行
复制
*************************** APPLICATION FAILED TO START
***************************

Description:

The bean 'org.springframework.transaction.config.internalTransactionAdvisor', defined in class path resource [org/springframework/transaction/annotation/ProxyTransactionManagementConfiguration.class], could not be registered. A bean with that name has already been defined in null and overriding is disabled.

Action:

Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true

[WARNING]  java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke (Method.java:498)
    at org.springframework.boot.maven.AbstractRunMojo$LaunchRunner.run (AbstractRunMojo.java:558)
    at java.lang.Thread.run (Thread.java:748) Caused by: org.springframework.beans.factory.support.BeanDefinitionOverrideException: Invalid bean definition with name 'org.springframework.transaction.config.internalTransactionAdvisor' defined in class path resource [org/springframework/transaction/annotation/ProxyTransactionManagementConfiguration.class]: Cannot register bean definition [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration; factoryMethodName=transactionAdvisor; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/transaction/annotation/ProxyTransactionManagementConfiguration.class]] for bean 'org.springframework.transaction.config.internalTransactionAdvisor': There is already [Root bean: class [org.springframework.transaction.interceptor.BeanFactoryTransactionAttributeSourceAdvisor]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null] bound.
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.registerBeanDefinition (DefaultListableBeanFactory.java:897)
    at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForBeanMethod (ConfigurationClassBeanDefinitionReader.java:274)
    at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForConfigurationClass (ConfigurationClassBeanDefinitionReader.java:141)
    at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitions (ConfigurationClassBeanDefinitionReader.java:117)
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions (ConfigurationClassPostProcessor.java:327)
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry (ConfigurationClassPostProcessor.java:232)
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors (PostProcessorRegistrationDelegate.java:275)
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors (PostProcessorRegistrationDelegate.java:95)
    at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors (AbstractApplicationContext.java:705)
    at org.springframework.context.support.AbstractApplicationContext.refresh (AbstractApplicationContext.java:531)
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh (ServletWebServerApplicationContext.java:142)
    at org.springframework.boot.SpringApplication.refresh (SpringApplication.java:775)
    at org.springframework.boot.SpringApplication.refreshContext (SpringApplication.java:397)
    at org.springframework.boot.SpringApplication.run (SpringApplication.java:316)
    at org.springframework.boot.SpringApplication.run (SpringApplication.java:1260)
    at org.springframework.boot.SpringApplication.run (SpringApplication.java:1248)
    at ca.mycompany.oav.ResourceServerApplication.main (ResourceServerApplication.java:22)
    at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke (Method.java:498)
    at org.springframework.boot.maven.AbstractRunMojo$LaunchRunner.run (AbstractRunMojo.java:558)
    at java.lang.Thread.run (Thread.java:748)
EN

回答 3

Stack Overflow用户

发布于 2021-03-09 14:01:44

需要注意的是:通过添加这一点,很难猜测哪一个bean将具有优先级,因为bean的创建顺序是由运行时主要受影响的依赖关系决定的。因此,允许bean重写可能会产生意外的行为,除非我们充分了解bean的依赖层次结构。

参考文献

票数 3
EN

Stack Overflow用户

发布于 2021-07-26 07:48:52

答案是

不,不要尽可能多地使用重写。但有时可能是(但要小心)

为了更好地理解这一点,

启动应用程序时,Spring自动加载许多bean(为了提供开箱即用的功能),有些可能是必需的,有些可能不是。我们有两种选择

选项1:

  1. 让Spring加载功能
  2. 您稍后会覆盖

选项2:

  1. 请Spring不要加载您不需要的内容。
  2. 只是添加你自己的豆子

示例用例

Spring通过ConfigServicePropertySourceLocator提供了开箱即用的云配置。在实时场景中,我们将使用自己的安全配置服务器,而不是默认的配置服务器。

选项1:

  1. 让Spring加载ConfigServicePropertySourceLocator Bean
  2. 通过指定spring.main.allow-bean-definition-overriding=true启用覆盖
  3. 定义自定义Bean,但要确保添加了“Order”、“@主”等。

选项2:

  1. 通过添加ConfigServicePropertySourceLocator请求Spring不加载spring.cloud.config.enabled=false
  2. 只需定义你的定制豆。

您节省了启动时间,代码看起来也很干净。

参考文献:https://github.com/spring-cloud/spring-cloud-config/issues/177

票数 0
EN

Stack Overflow用户

发布于 2021-07-28 14:01:59

spring.main.allow-bean-definition-overriding=true关注使用与现有bean相同的bean名称覆盖bean。如果bean在您自己的代码中,则始终可以更改bean名称(如果使用@Bean,默认情况下名称是@Component的方法名或类名;但是有不同的方法来设置bean名称,检查文档)。

因此,设置此标志的唯一合理理由(据我所知)是,如果您无法控制的多个bean(即第三方代码)以相同的名称加载。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56188981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档