springMvc Velocity tool 原始碼分析

muzhi121發表於2017-08-06

在公司使用pandoraboot配置了velocity tool,一直不明白官方支援的init方法沒有呼叫,而且不支援velocity tool 1.x版本的定義(1.x和2.x的定義見下面),而另一種沒使用pandoraboot的原始碼,確好好的,百思不得其解,然後各種斷點除錯了一天,發現了端倪,我們的starter中重寫了VelocityLayoutView.java類,在new Tool的時候,使用了BeanUtils.instantiate方法,然後導致velocity tool初始化時的各種特性丟失,然後順帶lou了一把Velocity tool的原始碼,這裡拋個磚。

velocity tool定義
1.x定義
<toolbox>
    <tool>
        <key>tool</key>
        <scope>request</scope>
        <class>org.apache.velocity.tools.generic.AlternatorTool</class>    
    </tool>
</toolbox>

2.x定義,key定義在類裡面,使用DefaultKey註解的形式
<tools>
  <toolbox scope="application">
    <tool class="org.apache.velocity.tools.generic.AlternatorTool"/>
  </toolbox>
</tools>

Velocity tool的使用方法就不貼了,不懂的自行百度,使用velocity離不開VelocityViewResolver,這個是velocity的根基,首先VelocityViewResolver繼承自AbstractTemplateViewResolver,實現了ApplicationContextAware介面,所以在VelocityViewResolver被spring初始化的時候,會呼叫initApplicationContext方法,這裡會設定viewClass,即VelocityToolboxView,

然後控制權會回到DispatcherServlet的render方法中,執行resolveViewName,對應的是呼叫VelocityViewResolver.buildView,在父類裡會呼叫spring方法BeanUtils.instantiateClass生成一個VelocityToolboxView(這個viewClass就是前面在VelocityViewResolver中設定的),同時呼叫setToolboxConfigLocation(),這個方法執行完成,VelocityViewResolver的工作就完成了,到這裡,我們才有了一個真正的view物件,render方法中繼續向前,就會到VelocityToolboxView中的createVelocityContext(),這裡會呼叫ServletToolboxManager.getInstance()方法,這個方法很重要,首先它新建一個會呼叫ServletToolboxManager,同時這個方法裡面載入了toolbox.xml檔案並解析(解析是在toolboxManager.load方法裡面,不展開了),load完成之後,各個tool類就被載入到ServletToolboxManager物件中了,注意這裡tool類還沒有被例項化,

最後會呼叫getToolbox()方法,這個方法裡面會例項化各個tool(例項化的時候作了相容,也就是會呼叫老1.x tool中的init方法,和2.x tool中configure(Map)),並放到sessionToolInfo和requestToolInfo中

然後流程到這裡就完了,有時間補下流程圖,睡覺了。

 

 

相關文章