当前位置: 首页 > 知识库问答 >
问题:

当Spring发现两个同名的bean时,它会做什么?

陆英毅
2023-03-14

我们有一个Spring 4.0.5。我们错误地引入了两个同名的bean。这两个bean都是RestTemplate版本4.2.2的实例,该版本是用于进行HTTP调用的Spring框架:

第一个“restTemplate”bean

@Bean(name = "restTemplate")
protected RestTemplate restTemplate() {
    RestTemplate restTemplate = new RestTemplate();
    restTemplate.setErrorHandler(new RestTemplateErrorHandler());

    List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();
    MappingJackson2HttpMessageConverter jacksonConverter = new MappingJackson2HttpMessageConverter();
    ObjectMapper mapper = new ObjectMapper();
    mapper.configure(SerializationFeature.WRAP_ROOT_VALUE, true);
    // Disable exceptions on unknown incoming properties
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    jacksonConverter.setObjectMapper(mapper);
    messageConverters.add(jacksonConverter);
    messageConverters.add(new Jaxb2RootElementHttpMessageConverter());
    messageConverters.add(new StringHttpMessageConverter());

    restTemplate.setMessageConverters(messageConverters);

    return restTemplate;
}

第二个“restTemboard”豆,完全生的

@Bean(name = "restTemplate")
protected RestTemplate restTemplate() {
    RestTemplate restTemplate = new RestTemplate();

    return restTemplate;
}

两者之间的主要区别在于错误处理。这就是问题所在:

我们有四台服务器在运行,我们在每台服务器中部署了相同的war文件。根据日志,我们100%确定在前两台服务器中使用了带有错误处理的restTemplate实例。在另外两种情况下,不使用没有错误处理的实例。

为什么Spring会这样?它以完全不确定的方式注入“restTemboard”bean。这种行为的原因可能是什么?我希望在所有4台服务器中都有相同的“restTemboard”实例。

在这里,我把日志,显示我试图解释什么。看看大胆的声明!!

第一条:

[时间戳=19:09:23.846][线程="localhost-启动停止-1"][会话="未定义"][请求="未定义"][级别=INFO][logger=o. s. b. f. s. DefaultListableBeanFactory][class=org.springframework.beans.factory.support.DefaultListableBeanFactory][line=839]-用不同的定义重写bean'restTemboard'的bean定义:替换[Root bean: class[null];范围=;抽象=false; lazyInit=false; AutowireMode=3;依赖检查=0; autowireCandidate=true;主=false; factoryBeanName=配置通用;factoryomeodName=restTemboard; initomeodName=null;破坏的方法名称=(推断);定义在com.service.common.config.配置通用]与[根bean:类[null];范围=;抽象=false; lazyInit=false; AutowireMode=3;依赖检查=0; autowireCandidate=true;主=false; factoryBeanName=配置中心保留;factoryomeodName=restTemboard; initomeodName=null;破坏的方法名称=(推断);定义在com.service.centralreservations.config.ConfigCentralReservations]

服务器二:

[timestamp=19:04:41.717][thread=“localhost-startStop-1”][session=“undefined”][request=“undefined”][level=INFO][logger=o.s.b.f.s.DefaultListableBeanFactory][class=org.springframework.beans.factory.support.DefaultListableBeanFactory][line=839]-用不同的定义覆盖bean“restemplate”的bean定义:替换[Root bean:class[null];范围=;抽象=假;lazyInit=false;自动连线模式=3;dependencyCheck=0;autowireCandidate=true;主要=错误;factoryBeanName=configCentralReservations;factoryMethodName=restTemplate;initMethodName=null;destroyMethodName=(推断);在com中定义。服务中央储备。配置。ConfigCentralReservations]和[Root bean:class[null];范围=;抽象=假;lazyInit=false;自动连线模式=3;dependencyCheck=0;autowireCandidate=true;主要=错误;factoryBeanName=configCommon;factoryMethodName=restTemplate;initMethodName=null;destroyMethodName=(推断);在com中定义。服务常见的配置。配置通用]

共有1个答案

安博文
2023-03-14

我可以想象很多原因:

  • 类路径扫描以未指定的顺序返回带配置注释的类。
  • 配置类存储在没有指定顺序的HashMap中,
  • 类返回的方法。getMethods()以未指定的顺序返回,
  • 等等等等

你应该问问自己:为什么它应该使用一个而不是另一个?你在任何地方指定了订单吗?Spring在这方面提供了任何保证吗?如果没有,你不应该假设任何事情。

 类似资料:
  • 我做了研究,发现应该这样做我不知道java对象像指针一样工作。我以为只有当两个对象相等时才会传递值。我甚至创建了一个简单的测试应用程序,它可以设置和获取一个对象的数量。再一次,我把这两个对象都等同起来。更改一个对象的元素似乎也会影响另一个对象。我不知道该怎么在谷歌上搜索这个。所以我才把整个故事都告诉你。我只得到与c编程有关的文档。我觉得我的底子都碎了。我现在才知道是如何工作的。我试着做 这不影响N

  • 问题内容: 我有两个表,它们的定义如下: 和这里代表。 我做了一个简单的本地SQL只能加入到选择和为: 但是我在行上遇到异常: 堆栈跟踪 : 你能建议出什么事了吗? 问题答案: 您需要设置结果别名。

  • 在Spring3.1中,我试图通过JMX导出相同的bean,使用两个不同的bean名称和两个不同的接口。 但是,当我启动我的应用程序时,我得到了一个异常 有没有任何方法可以在两个不同的mbean名称下注册同一个bean实例,从而公开不同的接口?

  • 我是个新手,所以请不要介意我的问题是愚蠢的 我有一个实现两个接口的类 我正在上下文类中定义bean对象,如下所示:

  • 我有两个spring bean类实现相同的接口。 你能给我一个建议吗。

  • 在Spring IOC中,bean的两个定义(具有相同的名称和类)是否有效? 我有两个bean定义文件包含在web中。xml。参见下面的示例。 应用Context-beans1.xml applicationContext-beans2。xml 到目前为止,我还没有遇到任何问题。但是,这可能会影响到多线程和集群的现实环境吗? 注意:这两个XMLs都被加载,因为我可以使用在这两个XMLs中定义的其他