腾讯二面:@Bean与@Component用在同一个类上,会怎么样?

作者:微信小助手

发布时间:2022-07-02T17:31:55

| 疑虑描述

最近,在进行开发的过程中,发现之前的一个写法,类似如下:


图片

以我的理解,@Configuration 加 @Bean 会创建一个 userName 不为 null 的 UserManager 对象,而 @Component 也会创建一个 userName 为 null 的 UserManager 对象。

那么我们在其他对象中注入 UserManager 对象时,到底注入的是哪个对象?

因为项目已经上线了很长一段时间了,所以这种写法没有编译报错,运行也没有出问题。后面去找同事了解下,实际是想让:

图片

生效,而实际也确实是它生效了。那么问题来了:Spring 容器中到底有几个 UserManager 类型的对象?

|  Spring Boot 版本

项目中用的 Spring Boot 版本是:2.0.3.RELEASE。对象的 scope 是默认值,也就是 singleton。

结果验证

验证方式有很多,可以 debug 跟源码,看看 Spring 容器中到底有几个 UserManager 对象,也可以直接从 UserManager 构造方法下手,看看哪几个构造方法被调用,等等。

我们从构造方法下手,看看 UserManager 到底实例化了几次。

图片

只有有参构造方法被调用了,无参构造方法岿然不动(根本没被调用)。如果想了解的更深一点,可以读读:Spring 的循环依赖,源码详细分析 → 真的非要三级缓存吗?