分層:
將包分為entity dao service action四層
每層中的類(lèi)依次都有以下注解:
@BeanType(type=BeanTypeEnum.Entity)
@BeanType(type=BeanTypeEnum.Repository)
@BeanType(type=BeanTypeEnum.Service)
@BeanType(type=BeanTypeEnum.Controller)
自動(dòng)裝配bean:
1. 類(lèi)信息包裝類(lèi)BeanClassWrapper:
功能
裝載bean的屬性,產(chǎn)生一個(gè)裝配完畢的bean對(duì)象
查找方法(包括本類(lèi)所有方法和父類(lèi)public方法)
查找屬性(包括本類(lèi)所有屬性和父類(lèi)public屬性)
獲得bean注解
clazz:類(lèi)Class
methodsMap :方法map李破,用于快速查找方法(包括本類(lèi)所有方法和父類(lèi)public方法)
fieldsMap:屬性map北发,用于查找屬性(包括本類(lèi)所有屬性和父類(lèi)public屬性)
fieldList:屬性list,用于遍歷屬性(包括本類(lèi)所有屬性和父類(lèi)public屬性)
tableName:對(duì)應(yīng)的數(shù)據(jù)庫(kù)表名
beanType:bean類(lèi)型注解喷屋,用于確定該包裝器對(duì)應(yīng)bean屬于哪一層
2. 監(jiān)聽(tīng)器 BeanLoader
當(dāng)web應(yīng)用啟動(dòng)的時(shí)候掃描src包下的所有子包琳拨,根據(jù)他們的beanType注解值來(lái)進(jìn)行裝配到BeanContainer中的靜態(tài)MAP
如果是entity和controller,則保存相應(yīng)的beanClassWrapper屯曹,每次需要就取出再用newInstance創(chuàng)建新的實(shí)體
如果是repository和service狱庇,則保存相應(yīng)的dao和service bean對(duì)象,創(chuàng)建他們的bean對(duì)象恶耽,遍歷其中的fieldList密任,若注解Autowired不為空,則根據(jù)field的名字調(diào)用BeanContainer的靜態(tài)getbean方法偷俭,將相應(yīng)的屬性注入到bean浪讳,然后保存bean到Map
值得注意的是,在進(jìn)行掃描裝配時(shí)涌萤,要按entity-->dao-->service-->action的順序淹遵,因?yàn)楹竺娴腷ean會(huì)把前面的bean作為屬性
至此,bean自動(dòng)裝配完畢
處理請(qǐng)求:controller層
路由配置文件:mvc.cfg.properties? :? url = clazz.method
中央分發(fā)器:DispatcherServlet
分發(fā)器擁有一個(gè)屬性Properties prop负溪,在init方法中進(jìn)行初始化透揣,將mvc.cfg.properties映射成prop對(duì)象
每次接收到請(qǐng)求時(shí),導(dǎo)向到doPost方法中進(jìn)行處理
1. 獲取servletURI
1.5 將request response存入到BeanContainer中的靜態(tài)MAP中
2.通過(guò)uri獲取需要調(diào)用的類(lèi)的類(lèi)名和方法名
3.通過(guò)類(lèi)名調(diào)用getBean獲取相應(yīng)的BeanClassWrapper
4.通過(guò)BCW獲得裝配好的bean
5.向裝配好的bean中注入前端請(qǐng)求中的參數(shù)(parameterMap)
6.通過(guò)BCW獲得需要調(diào)用的方法和Class
7.invoke調(diào)用相應(yīng)的方法
8.根據(jù)action的返回川抡,判斷方法responseType(JSON TEXT STREAM VIEW)注解的值辐真,進(jìn)行相應(yīng)的處理
Action類(lèi)
通用屬性在CommonAction中定義
page pageSize 分頁(yè)信息
sortby order 排序信息
其他屬性按照相應(yīng)的實(shí)體類(lèi)中的屬性來(lái)定義,用于接收參數(shù)
分為 EQUAL ?LIKE ?RANGE 三種類(lèi)型
分別代表精確匹配 模糊匹配 范圍匹配
向service層傳入action類(lèi)this應(yīng)用,根據(jù)action類(lèi)的屬性注解類(lèi)型和值用反射技術(shù)自動(dòng)生成增刪查改sql語(yǔ)句
將service的返回封裝成JSON對(duì)象返回給DispatcherServlet
Service層
僅擁有一個(gè)對(duì)應(yīng)的dao對(duì)象侍咱,并帶有autowired注解
調(diào)用相應(yīng)的dao實(shí)現(xiàn)業(yè)務(wù)邏輯
根據(jù)dao的增刪查改結(jié)果進(jìn)行相應(yīng)的業(yè)務(wù)邏輯處理耐床,構(gòu)造返回給action層
dao層繼承CommonDao類(lèi)
擁有一個(gè)beanClassWrapper對(duì)象
有g(shù)etCurrentSession()方法獲取DbSession類(lèi)(類(lèi)似JDBCTemplate)
DbSession對(duì)象綁定到了ThreadLocal
每個(gè)dao類(lèi)都有增刪查改方法,自動(dòng)生成sql語(yǔ)句
在從數(shù)據(jù)庫(kù)獲取結(jié)果后楔脯,裝配到entity視圖類(lèi)返回
查詢方法在數(shù)據(jù)庫(kù)的返回結(jié)果有兩種類(lèi)型咙咽,
一種是List<Map>視圖實(shí)體列表;
一種是Map 單個(gè)視圖實(shí)體
裝配過(guò)程用反射技術(shù),將map中屬性裝入到entity中
返回給service