1. 程式人生 > >使用Service描述的服務與springAop衝突導致服務無法暴露

使用Service描述的服務與springAop衝突導致服務無法暴露

     我參與的這個專案架構中採用了dubbo+zookeeper,為了線上排錯方便用到了AOP攔截方法列印日誌.專案是聚合工程,結構如下,當AOP攔截facade層時會出現服務註冊不到dubbo上的情況.

                                                     

      出現這個問題的程式碼結構是:

@Service
public class demoFacadeImpl implements basicFacade{
    //業務程式碼
}
     原因分析:

     這個問題是和平哥一起研究的,平哥在群裡問了別人之後瞭解到已經有人在dubbo的github上提出來這個issues,我們現在使用的是com.alibaba.dubbo.config.annotation.Service標籤修飾該服務,出現這種情況的原因是配置有Spring aop的bean生成了代理物件,com.alibaba.dubbo.config.spring.AnnotationBean 這個類的postProcessAfterInitialization方法的Service service = bean.getClass().getAnnotation(Service.class); 這一行獲取到的是由cglib代理出來的物件,所以無法得到@service 註解,導致服務未暴露.

    解決方案:

    由於使用的是註解的方式,spring AOP先執行的攔截後註冊,導致服務不能暴露.我們修改了註冊方式,不使用註解的方式,使用了配置檔案的方式,在dubbo的配置檔案中使用bean的方式注入.