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

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

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

究其原因,是因为Dubbo提供的注解没有@Inherited元注解。

被事务代理的spring service 使用注解方式发布Dubbo服务_第1张图片

我们通过@Transactional标注过的Service产生一个代理类,这个代理类有两种生成方式。一种是jdk动态代理,一种是CGLib动态代理。

jdk动态代理生成的代理类与当前类共同实现相同的接口,所以与当前类也只是间接调用的关心,不在此次讨论范围。

CGLib生成的代理类为当前Service的子类,可以集成到当前Service的注解。

根据需求,我们需要更改Dubbo的源码

被事务代理的spring service 使用注解方式发布Dubbo服务_第2张图片


在Dubbo的Service注解上加上@Inherited,使这个注解变成可继承的。

然后再当前项目的spring的主配置文件中强制所有bean使用CGLib代理


这样服务即可正常发布。


你可能感兴趣的:(spring,dubbo)