- 第一章: 介紹IDEA的使用回右,寫了個(gè)簡單的SERVLET猎唁、JSP罚舱,部署到TOMCAT蛀醉,展示了個(gè)HELLO WORLD.
- 第二章: 需求分析(WHAT TO DO 業(yè)務(wù)上的分析)、系統(tǒng)設(shè)計(jì)(系統(tǒng)怎樣設(shè)計(jì)布蔗、技術(shù)選型藤违、數(shù)據(jù)庫設(shè)計(jì)BALABALA、用例纵揍、界面原型顿乒、URL規(guī)范等等)、開發(fā)(搭建基礎(chǔ)環(huán)境【框架環(huán)境】泽谨、規(guī)劃項(xiàng)目目錄璧榄、數(shù)據(jù)庫與MODEL編寫、編寫基礎(chǔ)類及基礎(chǔ)架構(gòu)【攔截器之類的】吧雹、)骨杂,以及使用SERVLET+JSP簡單的完成了一個(gè)小功能,同時(shí)也暴露出了一些問題雄卷。Servlet數(shù)量過多搓蚪,請求參數(shù)獲取麻煩,自己管理依賴丁鹉,耦合度過高(無AOP)妒潭。
- 第三章: 搭建輕量級JAVA WEB框架悴能。為了解決上面存在的問題~ 我們打造一個(gè)框架。這個(gè)框架呢~ 把各個(gè)Servlet集成在一起杜耙, 名字叫做Controller搜骡,有一系列的Action標(biāo)注的方法來對應(yīng)各個(gè)URL拂盯、并且呢~Service方法通過注入而不是自己new佑女、能夠自動(dòng)處理請求和封裝請求參數(shù)、返回View類對象表示JSP頁面谈竿、返回Data類表示JSON數(shù)據(jù)团驱。
- 作為一個(gè)框架, 首先要低耦合空凸, 不能硬編碼~ 所以要搞一個(gè)配置文件來記錄需要用到的一些可變項(xiàng)(JDBC啊嚎花、靜態(tài)資源位置什么的)并且編寫相應(yīng)的讀配置文件的UTIL類。
- 為了實(shí)現(xiàn)利用注解(Action呀洲、controller...)來達(dá)成一些功能紊选, 首先要定義 這些注解, 然后我們首要任務(wù)是將這些注解對應(yīng)的類管理起來~ 那么怎么弄呢道逗? 寫一個(gè)ClassUtil類兵罢, 能夠?qū)崿F(xiàn)一個(gè)核心功能(將包下的所有類文件進(jìn)行加載,并且將加載過后的 Class類放進(jìn)一個(gè)ClassSet中)滓窍,再寫一個(gè)ClassHelper類卖词, 能夠?qū)崿F(xiàn)獲取應(yīng)用包下的Bean類(Service、Controller)【通過注解從所有類中過濾出來】吏夯。
- 實(shí)現(xiàn)BEAN容器此蜈。 封裝一個(gè)ReflectionUtil, 再定義一個(gè)BeanHelper(里面定義一個(gè)BeanMap<Class, Object>噪生,將新NEW出的對象封裝進(jìn)來)
- 實(shí)現(xiàn)依賴注入裆赵。遍歷所有的BeanMap,通過反射得到 每個(gè)Bean中的Field是否包含注入的注解跺嗽, 然后再通過反射得到Field的類型顾瞪,再通過反射設(shè)置進(jìn)去。
- 依賴 注入搞定了抛蚁, Bean容器也搞定了陈醒, 現(xiàn)在要解決Controller啦。這個(gè)Controller要干嘛呢瞧甩? 我們要根據(jù)Action中的http 方法和url 得到對應(yīng)的方法钉跷。第一步, 定義一個(gè)Request類肚逸, 封裝請求參數(shù)和請求路徑爷辙。第二步彬坏,定義一個(gè)Handler類,封裝一個(gè)Controller類以及action方法膝晾。第三步栓始, 定義一個(gè)ControllerHelper類, 用于初始化并存放ACTION_MAP<Request, Handler>血当。這樣不就解決問題了嗎幻赚, 只要得到http方法和url, 就可以封裝一個(gè)Request臊旭, 然后找到對應(yīng)的Handler落恼。
- 然后寫一個(gè)HelperLoader類來加載這些Helper類。
- 定義Param(封裝所有請求參數(shù))离熏、View(封裝路徑和數(shù)據(jù))佳谦、Data(封裝model),編寫請求轉(zhuǎn)發(fā)器DispatcherServlet(init時(shí)加載Helper類并且注冊處理JSP和靜態(tài)資源的Servlet滋戳、Service時(shí)獲取請求參數(shù)钻蔑、封裝param、得到Action奸鸯、調(diào)用方法咪笑、返回?cái)?shù)據(jù))。
- 總結(jié): 通過最后這個(gè)DispatcherServlet來處理所有的請求府喳, 根據(jù)請求信息從ControllerHelper中獲取相應(yīng)的Action方法蒲肋,然后使用反射技術(shù)調(diào)用Action方法,同時(shí)傳入需要的參數(shù)钝满,拿到返回值并根據(jù)類型進(jìn)行不同的處理兜粘。
- 第四章:使框架具備AOP特性。
- 代理是啥/代理模式是弯蚜? 經(jīng)濟(jì)人孔轴, 具體業(yè)務(wù)我不干, 但是我管控全局碎捺。
- 靜態(tài)代理路鹰, 。收厨。晋柱。
- JDK動(dòng)態(tài)代理:具體細(xì)節(jié)還是沒有琢磨, 大致是JDK在運(yùn)行期間诵叁, 動(dòng)態(tài)的生成的一個(gè)class代理類雁竞。步驟是先實(shí)現(xiàn)一個(gè)接口,在接口里實(shí)現(xiàn)invoke方法【before、targetmethod碑诉、after】彪腔,然后通過proxy.newProxyInstance搞出來〗裕【書上的說法也不錯(cuò):用定義的DynamicProxy類(實(shí)現(xiàn)invocationhandler)去包裝HelloImpl實(shí)例德挣,然后再調(diào)用JDK給我們提供的Proxy類的工廠方法newProxyInstance去動(dòng)態(tài)地創(chuàng)建一個(gè)Hello接口的代理類,最后調(diào)用這個(gè)代理類的方法】
- CGLIB:在運(yùn)行期間動(dòng)態(tài)生成字節(jié)碼的工具快毛。
- AOP格嗅,從具體業(yè)務(wù)邏輯中剝離出通用業(yè)務(wù)邏輯,比如性能監(jiān)控祸泪、日志記錄吗浩、權(quán)限控制建芙。也就是說没隘,通過AOP,可以解決代碼耦合的問題禁荸,使得類的職責(zé)更加單一右蒲。
- 動(dòng)態(tài)代理為什么比靜態(tài)代理犀利?動(dòng)態(tài)代理只有一個(gè)代理類,通過注入的object來實(shí)現(xiàn)代理類的不同(底層反射)赶熟、而靜態(tài)代理瑰妄,只能代理一種類。
- AOP五種增強(qiáng)映砖, 前增強(qiáng)间坐, 后增強(qiáng), 環(huán)繞增強(qiáng)邑退, 異常增強(qiáng)竹宋, 類增強(qiáng)(前4種屬于方法增強(qiáng), 最后一種是增強(qiáng)類地技, 在類中動(dòng)態(tài)注入方法)
- CGLIB創(chuàng)建代理慢蜈七, 但運(yùn)行速度快, JDK代理相反莫矗。
- AOP 幾個(gè)名詞飒硅, 切面(切點(diǎn)【要在哪些方法上動(dòng)手腳】+增強(qiáng)類【包含增強(qiáng)方法的類】)、連接點(diǎn)(當(dāng)前攔截到的方法)作谚、目標(biāo)對象三娩、增強(qiáng)(方法)、引入(類)妹懒。實(shí)際上要做的就是定義切面類雀监。
- SpringAOP 非主流, 最終落地的還是spring+AspectJ彬伦,幾種方式:
- 基于注解:通過AspectJ execution表達(dá)式攔截方法滔悉。
- 基于注解:通過AspectJ @annotation表達(dá)式攔截方法伊诵。
- 開發(fā)AOP框架
- 一波操作真是把我打醉了, 前面的那些東西快忘了回官, 其實(shí)最關(guān)鍵的還是整個(gè)問題的思路以及對應(yīng)到各個(gè)類的職責(zé)劃分曹宴。
- 首先定義了一個(gè)Aspect注解: 用于標(biāo)注在某個(gè)類上,使其成為切面類(并且注解的值為需要被代理的類)歉提。
- 定義一個(gè)代理接口proxy(提供一個(gè)doProxy方法(需要ProxyChain))笛坦、代理抽象類AspectProxy(實(shí)現(xiàn)doproxy邏輯)、具體ControllerAspect(實(shí)現(xiàn)before苔巨、after)
- 定義一個(gè)代理管理器(創(chuàng)建代理對象版扩, interceptor執(zhí)行 proxychain的doproxychain方法)
- 定義proxychain(代理鏈,一個(gè)鏈上擁有多個(gè)代理對象侄泽,順序執(zhí)行代理方法)
- doproxy和doproxychain這倆方法太6了相輔相成構(gòu)成了鏈?zhǔn)秸{(diào)用礁芦,簡單來說,就是先調(diào)用doproxychain然后悼尾,doproxychain會按順序調(diào)用doproxy柿扣,而doproxy在before后就會卡住,再執(zhí)行doproxychain闺魏,由此反復(fù)未状,得到一個(gè)before鏈,然后執(zhí)行被代理類的方法析桥,然后反著執(zhí)行after最后返回結(jié)果司草。
- ThreadLocal及自己實(shí)現(xiàn)
- ThreadLocal為每一個(gè)線程提供了獨(dú)立的副本, 相當(dāng)于線程獨(dú)占變量泡仗。 用處埋虹? 普通static 被各個(gè)線程調(diào)用會被共享, 而使用static ThreadLocal包裝后沮焕, 是線程獨(dú)占的吨岭。
- ThreadLocal簡化實(shí)現(xiàn)就是用了一個(gè)并發(fā)map,map<Thread, T>這樣峦树。
- 事務(wù)管理
- 事務(wù)的ACID
- 由事務(wù)并發(fā)引起的問題: 臟讀辣辫、 不可重復(fù)讀、 幻讀
- 事務(wù)隔離級別: 讀未提交魁巩、 讀已提交急灭、 可重復(fù)讀、 序列化
- 事務(wù)傳播行為
- 事務(wù)代理機(jī)制: 通過AOP在方法執(zhí)行前 開啟事務(wù)谷遂、 方法執(zhí)行完提交事務(wù)葬馋。
架構(gòu)探險(xiǎn) 從零開始寫JAVAWEB筆記
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
- 文/潘曉璐 我一進(jìn)店門亏钩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人欺旧,你說我怎么就攤上這事姑丑。” “怎么了辞友?”我有些...
- 文/不壞的土叔 我叫張陵栅哀,是天一觀的道長。 經(jīng)常有香客問我踏枣,道長昌屉,這世上最難降的妖魔是什么钙蒙? 我笑而不...
- 正文 為了忘掉前任茵瀑,我火速辦了婚禮,結(jié)果婚禮上躬厌,老公的妹妹穿的比我還像新娘马昨。我一直安慰自己,他們只是感情好扛施,可當(dāng)我...
- 文/花漫 我一把揭開白布鸿捧。 她就那樣靜靜地躺著,像睡著了一般疙渣。 火紅的嫁衣襯著肌膚如雪匙奴。 梳的紋絲不亂的頭發(fā)上,一...
- 文/蒼蘭香墨 我猛地睜開眼焊刹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起虐块,我...
- 序言:老撾萬榮一對情侶失蹤俩滥,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后贺奠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體举农,經(jīng)...
- 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
- 正文 我和宋清朗相戀三年敞嗡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了颁糟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
- 正文 年R本政府宣布,位于F島的核電站勺像,受9級特大地震影響障贸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜吟宦,卻給世界環(huán)境...
- 文/蒙蒙 一篮洁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧殃姓,春花似錦袁波、人聲如沸。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至踏幻,卻和暖如春枷颊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背该面。 一陣腳步聲響...
- 正文 我出身青樓听诸,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蚕泽。 傳聞我的和親對象是個(gè)殘疾皇子晌梨,可洞房花燭夜當(dāng)晚...
推薦閱讀更多精彩內(nèi)容
- 《架構(gòu)探險(xiǎn) 從零開始寫Java Web框架》筆記 第二章桥嗤,為Web應(yīng)用添加業(yè)務(wù)功能 需求分析與系統(tǒng)設(shè)計(jì) 這一章書中...
- Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
- 區(qū)塊鏈(英語:blockchain或block chain)是用分布式數(shù)據(jù)庫識別、傳播和記載信息的智能化對等網(wǎng)絡(luò)仔蝌,...