读框架源码,一开始的时候还真是不知道如何下手。
本篇文字以motan框架为例,记录下我是从哪里入手开始看源码的,个人感觉有通用性。
本人读源码不多,大牛请无视。
motan框架代表着最典型的和Spring相结合的框架的组织模式。
包括如下几个部分:
1、自定义XML标签
2、把配置的标签转化成框架的对象
3、在标签生成的对象中进行框架服务初始化
4、利用SPI服务生成Handler配合框架服务发布
自定义XML配置,需要先定义配置的Schema,然后在Spring的配置文件中引用Schema和nameSpace。
将SCHEMA放置在META-INF目录下,然后在spring.schemas文件中定义namespace对应的xsd文件。
如:http://api.weibo.com/schema/motan.xsd=META-INF/motan.xsd
配置XML无非就是想通过配置生成框架需要使用的对象。
例如:
<motan:service interface="quickstart.FooService"ref="serviceImpl"registry="myzk"export="8080"/>
这句将通过怎样的方式生成怎样的对象?
Spring将先从META-INF目录下查找解析标签的handler
http://api.weibo.com/schema/motan=com.weibo.api.motan.config.springsupport.MotanNamespaceHandler
该类实现了NameSpaceHandlerSupport接口,其中在init方法中,有这样一句:
registerBeanDefinitionParser("service",new MotanBeanDefinitionParser(ServiceConfigBean.class,true));
意思是说,将service标签所对应的配置,转化成ServiceConfigBean对象。
所以我们的motan:service标签将映射成ServiceConfigBean对象。
这个对象有什么特别之处呢?看类签名:
public class ServiceConfigBean<T>extendsServiceConfig<T>
implements
BeanPostProcessor,
BeanFactoryAware,
InitializingBean,
DisposableBean,
ApplicationListener<ContextRefreshedEvent>{…}
发现了熟悉的Spring扩展接口:
BeanPostProcessor - 可以在Spring加载完Bean之前之后进行对象的处理
ApplicationListener - 在ApplicationContext的refresh方法中执行的监听器接口
motan框架的服务发布export方法就是在这个接口的方法中调用的
DisposableBean - 对象析构方法
除此之外,motan还配合SPI定义了很多Service,这些service将通过ExtensionLoader加载,像是SimpleConfigHandler,ClusterSpi等等。
了解到这些之后,就可以从对应的地方入手,关注自己感兴趣的地方了。