每个组件嵌入到spring体系都需要一个入口,dubbo也不例外。而dubbo的入口类是AnnotationBean,一切都是由它开始的。
AnnotationBean继承类可以看到AnnotationBean继承于BeanFactoryPostProcessor、BeanPostProcessor。
BeanFactoryPostProcessor的作用是扫描有声明com.alibaba.dubbo.config.annotation.Service注解的bean(关于BeanFactoryPostProcessor原理,请详见 spring-灵魂深处 关于BeanFactoryPostProcessor)。
BeanPostProcessor的作用是在spring装载bean的时候,在装载之前和之后分别进行了操作(关于BeanPostProcessor的原理,请详见spring-灵魂深处 关于BeanPostProcessor)。而BeanPostProcessor接口的方法如下图:
BeanPostProcessor接口这里不解释BeanPostProcessor的原理,只做大概讲解。
postProcessBeforeInitialization()方法用于初始化服务调用者consumer。当装载spring bean扫描到字段有注解Reference的时候开始相关的初始化,而dubbo的consumer仅仅只是一个接口,没有具体的实现类,没错这个方法就是在spring装载bean的时候返回一个代理对象(详情请见dubbo从零单排-ReferenceBean)继而完成了consumer的初始化。
postProcessAfterInitialization()方法用于初始化服务生产者provider。当装载spring bean扫描到字段有注解Service的时候开始dubbo服务端的初始化(详情请见dubbo从零单排-ServiceBean)。
初始化完consumer和provider之后,继而完成了的dubbo组件的初始化。
所以综上的结论是,通过
声明的bean声明AnnotationBean,当spring启动时,会判断该bean是否有继承于BeanFactoryPostProcessor、BeanPostProcessor,如果有的话则自动成为spring体系的一员,成为加载解析第三方spring组件的bean,通过上述processor的方法。
网友评论