被事务代理的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() 发布服务出去.
已有 0 人发表留言,猛击->> 这里<<-参与讨论
ITeye推荐