今天在测试多种Springboot注入bean时候意外发现了这个问题
这是我的config配置
这是我的lombok_pojo_pet类的配置
这是我的属性配置
这是主类
这是运行结果
发现了什么没
这里面有两个lombok_pojo_pet类型的bean,分别是通过属性绑定的lombok_pojo_pet和通过new建立的tomcat
这两个明明赋予了不同的数值,但是最后输出的结果一模一样,莫非是因为属性绑定优先一切,所以将tg prc两个属性覆盖掉了?
但是不对,people里面使用pet()赋值之后获得的数值却是tg prc
那么我们接着打debug查看
第一个断点我打在了student里面赋值部分,这里面我们注意到赋值并非是直接调用bean,而是用pet方法,其地址为5207
这里两个bean对应的数值完全一样,但是地址不一样,而且跟之前pet()方法返回的数值也不一样
由于我使用的是多例模式,我突然想到如果是单例的话结果会怎样
结果如下
发现什么了没有,这一次pet()返回的地址跟l2完全一样了,而数值上tg prc被覆盖掉了
由于我本人能力不足,无法完全深入源码进行解析,但是我们都知道,地址才是存贮的具体数值,tomcat这个名称是一个指针,故我做出如下猜想
创建bean的时候,由于bean的名称是唯一的,所以在多例模式下的赋值情况类似于
int i=4
i=5
第一次调用pet()的时候,我相当于设定了一个tomcat的数值为tg prc。这个数值被set方法注入到了people中保存,但是由于我开始属性注入,后面调用tomcat这个bean时候属性解析的数值将其覆盖
单例模式下,会先对tomcat这个bean进行正常注入,随后给所有lombok_pojo_pet统一注入数值,确保唯一性