在公司使用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中
然後流程到這裡就完了,有時間補下流程圖,睡覺了。