> 有其他人发现并解决了问题,希望官方能处理一下
> 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]

Reply via email to