liufeiyu1002 commented on issue #10335:
URL: https://github.com/apache/dubbo/issues/10335#issuecomment-1193318626
>
BCD三个类在注入依赖bean的时候,因为这三的属性名称一样且类型不一样(会走入你前面截图的逻辑里),按理注入的beanName应该分别为userInfo、userInfo#2、userInfo#3。我理解应该不会出现你所描述的
`beanDefinitionRegistry没有找到已经注册的bean`,我本地试了下没有问题,方便的话可以发一下你的demo我本地复现一下。
他截图部分的代码 会在 postProcessBeanFactory 和 postProcessMergedBeanDefinition 俩次触发执行,
第一次触发:(postProcessBeanFactory )
A类 beanDefinitionRegistry.registerBeanDefinition("test",
UserInfo的beanDefinition);
B类 beanDefinitionRegistry.registerBeanDefinition("userInfo",
MessageInfo的beanDefinition);
C类 注册了别名 beanDefinitionRegistry.registerAlias("test", "userInfo#2");
D 类 beanDefinitionRegistry.registerBeanDefinition("userInfo#2",
UserAInfo的beanDefinition);
第二次触发:(postProcessMergedBeanDefinition )

A类 B类 在上图代码中会从缓存中获取到直接返回
C类传入的referenceBeanName是userInfo 在 UserInfo类型对应的缓存中是 test/userInfo#2
没有命中缓存,会走到

这部分执行时 C类获取到 newReferenceBeanName 应该是 userInfo#3 ,因为 userInfo 和 userInfo#2 被
B 和 D 注册到了beanDefinitionRegistry中 ,此时会继续注册alias
beanDefinitionRegistry.registerAlias("test", "userInfo#3");
D 类 传入的referenceBeanName是userInfo 在 UserAInfo类型对应的缓存中是 userInfo#2
没有命中缓存,走到上图红框中执行
D 类获取到 newReferenceBeanName 应该是 userInfo#3 ,因为userInfo被B注册 userInfo#2
被他之前自己注册过了,之后会注册别名 userInfo#3: userInfo#2 此时因为别名 userInfo#3 被 test 注册过了 如果
allowBeanDefinitionOverriding 为false 则会抛出异常


如果允许覆盖则 别名会变成如图所示

之后当前D类的 AnnotatedFieldElement的 injectedObject 值被设置为 userInfo#3
在D类执行属性注入时 InjectedElement.inject 从spring中获取bean对象是 beanName 是
AnnotatedFieldElement.injectedObject 的值

此时从spring 获取bean的时候

会从 别名中获取到 真的 注入容器中的那个名称 test test 是UserInfo 类型的, 而D类注入的 类型UserAInfo

如图 field 是 UserAInfo injectObject 是 UserInfo类型的 dubbo 代理类,此时类型不匹配 会抛出异常
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]