分層:
將包分為entity dao service action四層
每層中的類依次都有以下注解:
@BeanType(type=BeanTypeEnum.Entity)
@BeanType(type=BeanTypeEnum.Repository)
@BeanType(type=BeanTypeEnum.Service)
@BeanType(type=BeanTypeEnum.Controller)
自動裝配bean:
1. 類信息包裝類BeanClassWrapper:
功能
裝載bean的屬性,產生一個裝配完畢的bean對象
查找方法(包括本類所有方法和父類public方法)
查找屬性(包括本類所有屬性和父類public屬性)
獲得bean注解
clazz:類Class
methodsMap :方法map,用于快速查找方法(包括本類所有方法和父類public方法)
fieldsMap:屬性map,用于查找屬性(包括本類所有屬性和父類public屬性)
fieldList:屬性list,用于遍歷屬性(包括本類所有屬性和父類public屬性)
tableName:對應的數據庫表名
beanType:bean類型注解,用于確定該包裝器對應bean屬于哪一層
2. 監聽器 BeanLoader
當web應用啟動的時候掃描src包下的所有子包,根據他們的beanType注解值來進行裝配到BeanContainer中的靜態MAP
如果是entity和controller,則保存相應的beanClassWrapper,每次需要就取出再用newInstance創建新的實體
如果是repository和service,則保存相應的dao和service bean對象,創建他們的bean對象,遍歷其中的fieldList,若注解Autowired不為空,則根據field的名字調用BeanContainer的靜態getbean方法,將相應的屬性注入到bean,然后保存bean到Map
值得注意的是,在進行掃描裝配時,要按entity-->dao-->service-->action的順序,因為后面的bean會把前面的bean作為屬性
至此,bean自動裝配完畢
處理請求:controller層
路由配置文件:mvc.cfg.properties? :? url = clazz.method
中央分發器:DispatcherServlet
分發器擁有一個屬性Properties prop,在init方法中進行初始化,將mvc.cfg.properties映射成prop對象
每次接收到請求時,導向到doPost方法中進行處理
1. 獲取servletURI
1.5 將request response存入到BeanContainer中的靜態MAP中
2.通過uri獲取需要調用的類的類名和方法名
3.通過類名調用getBean獲取相應的BeanClassWrapper
4.通過BCW獲得裝配好的bean
5.向裝配好的bean中注入前端請求中的參數(parameterMap)
6.通過BCW獲得需要調用的方法和Class
7.invoke調用相應的方法
8.根據action的返回,判斷方法responseType(JSON TEXT STREAM VIEW)注解的值,進行相應的處理
Action類
通用屬性在CommonAction中定義
page pageSize 分頁信息
sortby order 排序信息
其他屬性按照相應的實體類中的屬性來定義,用于接收參數
分為 EQUAL ?LIKE ?RANGE 三種類型
分別代表精確匹配 模糊匹配 范圍匹配
向service層傳入action類this應用,根據action類的屬性注解類型和值用反射技術自動生成增刪查改sql語句
將service的返回封裝成JSON對象返回給DispatcherServlet
Service層
僅擁有一個對應的dao對象,并帶有autowired注解
調用相應的dao實現業務邏輯
根據dao的增刪查改結果進行相應的業務邏輯處理,構造返回給action層
dao層繼承CommonDao類
擁有一個beanClassWrapper對象
有getCurrentSession()方法獲取DbSession類(類似JDBCTemplate)
DbSession對象綁定到了ThreadLocal
每個dao類都有增刪查改方法,自動生成sql語句
在從數據庫獲取結果后,裝配到entity視圖類返回
查詢方法在數據庫的返回結果有兩種類型,
一種是List<Map>視圖實體列表;
一種是Map 單個視圖實體
裝配過程用反射技術,將map中屬性裝入到entity中
返回給service