> 有其他人发现并解决了问题,希望官方能处理一下
> https://blog.csdn.net/liangshf520/article/details/79621345
这个问题和你碰到的循环依赖应该是两个问题。
你的这个问题今天我看了一下,主要原因是用于处理 dubbo 注解的
com.alibaba.dubbo.config.spring.AnnotationBean 实现的是 BeanPostProcessor
接口。这种实现方式是不太正确的,原因如下:
* 可能存在多个 BeanPostProcessor 注册,而 AnnotationBean 是其中的一个,并且位置不是最后一个,导致 dubbo 框架看到的
bean 实例和 spring 框架最终得到的 bean 实例有区别
* 即使 AnnotationBean 是 BeanPostProcessor 链中的最后一个,在某些场景下,比如需要解决循环依赖的时候,在
BeanPostProcessor 链执行完毕之后,spring 框架会继续对 bean 做处理,导致 spring 框架最终注册的 bean 和 dubbo
看到的仍然不一样:
```java
//
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory
protected Object doCreateBean(final String beanName, final
RootBeanDefinition mbd, final @Nullable Object[] args)
throws BeanCreationException {
...
if (earlySingletonExposure) {
Object earlySingletonReference = getSingleton(beanName,
false);
if (earlySingletonReference != null) {
if (exposedObject == bean) {
exposedObject = earlySingletonReference;
}
...
// Register bean as disposable.
try {
registerDisposableBeanIfNecessary(beanName, bean, mbd);
}
catch (BeanDefinitionValidationException ex) {
throw new BeanCreationException(
mbd.getResourceDescription(), beanName,
"Invalid destruction signature", ex);
}
return exposedObject;
}
```
所以,正确的做法应该是废弃掉 BeanPostProcessor 的做法,而是在 ApplicationListener 中开始暴露 dubbo
服务,也就是说,等 spring 组装完毕之后
(org.springframework.context.support.AbstractApplicationContext#finishRefresh),再开始暴露服务。
总结一下,对于 dubbo 要暴露的服务,在 spring 场景下,真正应该代理的类不是 service interface 是实现,而是被 spring
正确组装以及增强完毕之后的类。
[ Full content available at:
https://github.com/apache/incubator-dubbo/issues/2215 ]
This message was relayed via gitbox.apache.org for
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]