在Config文件中用@Bean注解装配bean的一个问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Config文件中用@Bean注解装配bean的一个问题相关的知识,希望对你有一定的参考价值。

参考技术A Spring中配置与使用bean的一些方法参见 https://www.jianshu.com/p/f3eaa90fb51e
*******************正文分割线*******************

  我们通常会在 @Configuration 注解的的类中使用 @Bean 注解来生成让Spring管理的JavaBean,例如:

这样在其他地方就可以导入使用。

现在因为特殊原因,需要在项目中引入两个设置不同的RestTemplate

我们想通过不同的name让Spring区分并管理这两个JavaBean,然后在其他地方通过

来使用。但是使用过程中发现引入的restTemplateNew和restTemplateOld都是restTemplateB的实例,说明restTemplateA在Config文件中加入Spring的时候,被后加入的restTemplateB覆盖掉了。
一些想法:

  后来偶然发现原因是restTemplateA和restTemplateB使用了同样的方法名createRestTemplate导致的这个问题,因为方法的参数不同,所以编译器不会报错。换了不同的名字createRestTemplateA和createRestTemplateB,就正常了,如下所示:

  出错的地方找到了,那么原因呢?
  难道Spring生成Bean的时候根据相同的方法名,让restTemplateB覆盖掉了restTemplateA?文档上说@Bean这种方式默认的id是方法名,但是可以通过name或者value来改变。显然这种解释不对;我们将原来相同方法名的两个Bean放到两个不同的Config文件中,发现与改名一样,都起作用。

  经过反复实验,确认是方法名的锅。在Config文件中,可以所有bean都用一个方法名,然后设置不同的name,这是符合语法规范的,但是Spring创建bean的时候同一个class文件中的同名方法只有最后一个bean可以被创建(这也是为什么拆成两个文件就正常了)。
具体为什么,翻了一通源码,感觉还是看不懂。未完待续。

测试demo的地址: https://github.com/lamyoung/demo-http

以上是关于在Config文件中用@Bean注解装配bean的一个问题的主要内容,如果未能解决你的问题,请参考以下文章

基于java容器注解---基于泛型的自动装配

spring框架学习:Bean的装配方式 ——基于注解的装配自动装配

java之Spring装配Bean(手动装配自动装配注解装配)

(转)java之Spring(IOC)注解装配Bean详解

Bean装配之@Autowired注解

Spring常用注解,自动扫描装配Bean