怎么用注解的方式发布dubbo服务

怎么用注解的方式发布dubbo服务,第1张

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

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

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

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

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

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

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

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

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

这样服务即可正常发布。

用于把dubbo.properties读到spring的environment中,

这个工作是由Spring的ConfigurationClassPostProcessor类来完成的.检测到某个需要注册的Bean上有@PropertySource注解,就会读该文件的配置信息,弄到environment对象的MutablePropertySources对象中。

后期会把配置信息弄到dubbo 配置类中.

该注解上还有@DubboComponentScan,@EnableDubboConfig,这两个注解是dubbo用注解与spring集成的核心了

该注解用@import导入了DubboConfigConfigurationRegistrar这个类

DubboConfigConfigurationRegistrar 实现了ImportBeanDefinitionRegistrar接口,那么spring在实例化的时候会调用DubboConfigConfigurationRegistrar重写ImportBeanDefinitionRegistrar接口的registerBeanDefinitions方法,并且将用@Import导入DubboConfigConfigurationRegistrar的类的元数据包装成importingClassMetadata对象。

其实就是为了获取入口类AnnoBean上的@EnableDubboConfig注解里的multiple属性配置的值,默认是true.

然后注册了两个DubboConfigConfiguration的内部类

通过读Class对象注册到ioc容器

类上有@EnableDubboConfigBindings,值为@EnableDubboConfigBinding数组

通过绑定,将有对应前缀的配置信息赋值到对应的配置类中

又用@Import导入DubboConfigBindingsRegistrar类,DubboConfigBindingsRegistrar这个类又实现了ImportBeanDefinitionRegistrar,EnvironmentAware接口

实现ImportBeanDefinitionRegistrar肯定是为了另外导入一些类,并且拿到导入的源类,获取源类上配置的信息

实现EnvironmentAware是为了拿到spring的environment对象,因为 dubbo.properties 已经被@PropertySource注解机制加载到了environment.MutablePropertySources中,在这里只对beanName的创建有作用。

registrar.registerBeanDefinitions :

注册的过程中,需要从environment对象中拿dubbo相关的配置,比如ApplicationConfig只拿

dubbo.application.*相关的配置,然后创建ApplicationConfig的BeanDefinition.

如果 @EnableDubboConfigBinding配置的multiple为true(默认为false),并且在配置文件中配置了同样前缀的属性,如:

这样会为同一种配置类型,生成两个BD.beanName不同的配置Bean,名称规则如下所示, #0表示的是'.'在配置的key中出现的位置

之后还会注册一个BeanPostProcessor类型的DubboConfigBindingBeanPostProcessor类的beanDefinition,BeanPostProcessor类型 会在每一个Bean实例化的过程中,根据配置的前缀,从environment拿出所需的配置,根据beanName来处理beanName相同的这一个配置Bean,把配置信息绑定到配置类的属性中。

DubboConfigBindingBeanPostProcessor.postProcessBeforeInitialization

利用 dubboConfigBinder 对象来绑定前缀为dubbo.application的配置信息到配置Bean中

这里dubboConfigBinder对象是DubboConfigBindingBeanPostProcessor中的一个属性,是在因为这个类实现了InitializingBean这个接口的afterPropertiesSet方法,dubboConfigBinder对象就是在这里初始化的

最后用的DataBinder的api把一个MutablePropertyValues绑定到Bean的属性

@import进来了DubboComponentScanRegistrar类

DubboComponentScanRegistrar又实现了ImportBeanDefinitionRegistrar接口,实现registerBeanDefinitions方法.

跟xml的逻辑一样,同样是


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11841413.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-19
下一篇2023-05-19

发表评论

登录后才能评论

评论列表(0条)

    保存