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

被事务代理的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() 发布服务出去.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值