asp.net mvc项目实例_降龙-第13章:MVC开发准备
從這一章開始我將逐步研發一個MVC框架并內嵌在?我的開源項目中。由于內容會很多,所以我盡量拆分成多個章節來介紹,以展示框架研發的過程和一些?細節。
上面上傳的代碼是整套MVC框架設計的起點,這些都是我們在spring中常見的注解類,聲明好這些類后,在實際開發過程中我們就可以利用這些注解來生生成單例實例并交由spring管理了,在研發的這套框架中在能完成正常的業務開發需求之上,還簡化了了很多繁瑣的設計,然后還給自己的這一套注解類起了一個響亮的別名:My*系列。
一般的我們都是按照這樣的結構設計?項目的包目錄的:
只要有統一的父節點,包目錄分散的都不要緊,無非就是在掃描包的時候消耗一點性能,多掃一些無用的類罷了?。設計好包目錄結構后,再來配置一下掃描規則,?如下圖所示:
四個類型的包掃描配置,用數組的形式配置,支持你分散設計包的目錄結構,沒有任何限制,配置也很簡單。
下面我就按照我對spring的理解來分析一下整個spring項目的網狀交叉依賴關系是怎么啟動和注入完成的?。因為我的分析是直接給出的結論并沒有敘述思考問題的角度及得出結論的過程,所以會讓人看起來覺得很簡單,但是實際實現起來細枝末節的問題很多。
dao層掃描
首先根據我們多年開發的經驗知道,dao層代碼一般都是只定義接口類和方法,不會有交叉bean的引入的,所以第一步我們要先掃描dao層下的所有接口類。這里唯一和別的類不同的區別是dao的實例是動態代理實例,就是最終代碼在調用接口方法時會監聽該方法并由框架處理接口的實現。
service層掃描
把dao層下的所有接口掃描完,裝載到內存中,按照完整類名作為key,實例對象作為value存入到dao的map緩存中,然后開始掃描servcie層下的包。由于servcie層包確認是不會引入controller層的bean的,所以處理起來會相對簡單一點。
考慮到service層會依賴互相注入service層bean還會注入一些幫助類的bean,所以就得掃描自身類的同時繼續通過反射把類的成員變量中的所有bean也掃描出來。拿到類的成員變量后根據類名去對應類型的緩存中查詢下是否當前類的bean已經存在,?然后處理好創建和賦值操作。當類的成員變量也是bean且沒有在緩存中存在實例,則繼續對成員變量做掃描,直至掃描到最后一個bean為止。
controller層掃描
controller掃描還需要校驗url不能重復,url上的注解不能為空等,也就這些和別的掃描有些區別。然后還需要把url和controller的方法映射存儲起來,因為在做反射調用的時候是根據url來尋找controller類實例來執行對應方法的?。
component層掃描
這一層其實嵌套在service層內實現,也可以嵌套在controller內,在掃描上面的包的過程中掃描到component就已經完成了其bean的生成和注入了。
請求調度
整個所有的bean掃描完成后,就可以交由mvc的servlet調度控制類來做調度了。寫一個servlet類攔截所有servlet請求,交由mvc控制其任務的調度、務的控制、參數包裝、結果返回以及異常處理?。這樣整個mvc的?部分就算開發完了。
特別的,dao層的使用一般我們還需要借助xml文件來存儲sql文件,這是一個很方便書寫、管理和移植拓展的解決方案。所以在mvc框架開發的最后一步就是把前期手寫的字符串SQL替換為xml的mapper文件來處理?。而這個我也會單獨?出章節來講。在java最新的版本中已經支持字符串模板的寫法了,它支持一段字符串的直接所見即所得的寫法,非常適合寫html和sql文件,到時候我在看下能不能走這條路來支持sql這一塊的解析。?
總結
以上是生活随笔為你收集整理的asp.net mvc项目实例_降龙-第13章:MVC开发准备的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2.页面绘制和引入组件库uView
- 下一篇: Markdown 符号公式大全