今日目标
分析请求转发流程
请求处理流程
前一篇初步分析soul如何对不同的请求进行转发,找到了类AbstractSoulPlugin下面的execute方法,其中的代码看起来是使用了模板方法(逻辑最后执行doExecute方法,而doExecute方法是抽象方法,具体实现在子类里)
各插件实现类与AbstractSoulPlugin关系如下,所有插件都实现了doExecute方法
那么在转发请求的过程中,如何触发插件执行逻辑呢,通过查找对execute方法的调用,找到soul-web模块下SoulWebHandler的内部类DefaultSoulPluginChain中的execute方法
如上图,execute方法中从plugins中获取插件对象,然后执行了插件的execute方法,再向上查找,SoulWebHandler的handle方法调用了DefaultSoulPluginChain的execute方法
而SoulWebHandler实现了WebHandler接口,handle方法正是处理web请求的实现逻辑
至此,我们找到了逻辑触发的源头,处理流程如下图
遗留问题
插件如何加载
插件调用链初始化时传入了一个插件列表,列表如何加载的
查找soul-web模块的代码,发现SoulConfiguration里创建了SoulWebHandler类型的名为webHandler的bean,参数plugins将由spring自动装配所有SoulPlugin的实现类
如何顺序触发调用插件
- 当前插件是根据当前索引从初始化的插件列表plugins中获取(然后索引+1)
- DefaultSoulPluginChain触发插件的execute时,将自身作为参数传了进去,而在插件的execute逻辑中最后会调用传入DefaultSoulPluginChain的execute方法,此时索引已经+1,获取到下一个插件
插件扩展方式
从前面分析的插件加载逻辑看,只要实现SoulPlugin接口,就能够在初始化的时候将扩展的插件加入插件列表,从而在根据插件链顺序调用时触发扩展的插件的doExecute方法,当然还需要相关的一些代理规则配置,具体的后面再分析