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

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

2015-02-05 14:52 351 查看


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

使用 @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() 发布服务出去.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: