您的位置:首页 > 编程语言 > Java开发

被事务代理的spring service 不能使用注解方式发布dubbo服务的问题解决

2015-01-01 21:39 691 查看

问题:

       使用 @com.alibaba.dubbo.config.annotation.Service 发布dubbo服务的时候,当服务类没有加入@Transactional的时候没有问题.

 

       但是当加入事务后,spring bean 事务代理, dubbo的 AnnotationBean 扫描 类执行下面的代码的时候就获取不到对应的注解,也就发布不了服务:

 

Service service = bean.getClass().getAnnotation(Service.class);
if (service != null) {

 

 

因为被cglib 或者 java proxy 代理的类获取不到该dubbo service注解.

 

 

解决办法:

 

     思路:  让代理类可以获取@com.alibaba.dubbo.config.annotation.Service , name就需要在 该注解上加入

java.lang.annotation.Inherited   意思是: 使代理类继承该注解,使之可以通过bean.getClass().getAnnotation(Service.class) 获取到.

 

这样 dubbo的export() 发布逻辑可以正常执行 . 那么dubbo服务即可正常发布了.

 

缺点:

      需要侵入dubbo的源码,不过貌似没别的好些的办法.否则就只能手动通过 javaconfig 或者 xml 去发布服务.

 

优点:  

       因为dubbo使用的spring 版本默认比较老. 所以通过dubbo.xml的 方式发布会跟默认的spring 上下文的bean加载冲突.报一些莫名其妙的问题. 比如 bean找不到之类的. 原因就是 因为dubbo的bean初始化和 现有的工程的spring 高版本的初始化机制冲突.

 

那么通过这种方式.就不侵入现有的spring bean上下文. 只是 加载了一个 AnnotationBean 这么个bean 由这个bean 去扫描有dubbo service注解的类,找到对应的bean并且export() 发布服务出去.

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: