一稼虎、SpringMVC
Spring Web MVC是一種基于Java的實(shí)現(xiàn)了Web MVC設(shè)計(jì)模式的請(qǐng)求驅(qū)動(dòng)類(lèi)型的輕量級(jí)Web框架,即使用了MVC架構(gòu)模式的思想糕篇,將web層進(jìn)行職責(zé)解耦火诸,基于請(qǐng)求驅(qū)動(dòng)指的就是使用請(qǐng)求-響應(yīng)模型,框架的目的就是幫助我們簡(jiǎn)化開(kāi)發(fā)它浅,Spring Web MVC也是要簡(jiǎn)化我們?nèi)粘eb開(kāi)發(fā)的译柏。
模型(Model )封裝了應(yīng)用程序的數(shù)據(jù)和一般他們會(huì)組成的POJO。
視圖(View)是負(fù)責(zé)呈現(xiàn)模型數(shù)據(jù)和一般它生成的HTML輸出姐霍,客戶端的瀏覽器能夠解釋鄙麦。
控制器(Controller )負(fù)責(zé)處理用戶的請(qǐng)求,并建立適當(dāng)?shù)哪P湍髡郏阉鼈鬟f給視圖渲染胯府。
Spring的web模型 - 視圖 - 控制器(MVC)框架是圍繞著處理所有的HTTP請(qǐng)求和響應(yīng)的DispatcherServlet的設(shè)計(jì)。
Spring Web MVC處理請(qǐng)求的流程
具體執(zhí)行步驟如下:
1恨胚、 首先用戶發(fā)送請(qǐng)求————>前端控制器骂因,前端控制器根據(jù)請(qǐng)求信息(如URL)來(lái)決定選擇哪一個(gè)頁(yè)面控制器進(jìn)行處理并把請(qǐng)求委托給它,即以前的控制器的控制邏輯部分赃泡;圖2-1中的1寒波、2步驟;
2升熊、 頁(yè)面控制器接收到請(qǐng)求后俄烁,進(jìn)行功能處理,首先需要收集和綁定請(qǐng)求參數(shù)到一個(gè)對(duì)象级野,這個(gè)對(duì)象在Spring Web MVC中叫命令對(duì)象页屠,并進(jìn)行驗(yàn)證,然后將命令對(duì)象委托給業(yè)務(wù)對(duì)象進(jìn)行處理蓖柔;處理完畢后返回一個(gè)ModelAndView(模型數(shù)據(jù)和邏輯視圖名)辰企;圖2-1中的3、4渊抽、5步驟蟆豫;
3、 前端控制器收回控制權(quán)懒闷,然后根據(jù)返回的邏輯視圖名十减,選擇相應(yīng)的視圖進(jìn)行渲染,并把模型數(shù)據(jù)傳入以便視圖渲染愤估;圖2-1中的步驟6帮辟、7;
4玩焰、 前端控制器再次收回控制權(quán)由驹,將響應(yīng)返回給用戶,圖2-1中的步驟8;至此整個(gè)結(jié)束蔓榄。
二并炮、Spring
2.1、IOC容器:
IOC容器就是具有依賴(lài)注入功能的容器甥郑,IOC容器負(fù)責(zé)實(shí)例化逃魄、定位、配置應(yīng)用程序中的對(duì)象及建立這些對(duì)象間的依賴(lài)澜搅。應(yīng)用程序無(wú)需直接在代碼中new相關(guān)的對(duì)象伍俘,應(yīng)用程序由IOC容器進(jìn)行組裝。在Spring中BeanFactory是IOC容器的實(shí)際代表者勉躺。
2.2癌瘾、AOP:
簡(jiǎn)單地說(shuō),就是將那些與業(yè)務(wù)無(wú)關(guān)饵溅,卻為業(yè)務(wù)模塊所共同調(diào)用的邏輯或責(zé)任封裝起來(lái)妨退,便于減少系統(tǒng)的重復(fù)代碼,降低模塊間的耦合度概说,并有利于未來(lái)的可操作性和可維護(hù)性碧注。AOP代表的是一個(gè)橫向的關(guān)系
AOP用來(lái)封裝橫切關(guān)注點(diǎn),具體可以在下面的場(chǎng)景中使用:
Authentication 權(quán)限
Caching 緩存
Context passing 內(nèi)容傳遞
Error handling 錯(cuò)誤處理
Lazy loading 懶加載
Debugging 調(diào)試
logging, tracing, profiling and monitoring 記錄跟蹤 優(yōu)化 校準(zhǔn)
Performance optimization 性能優(yōu)化
Persistence 持久化
Resource pooling 資源池
Synchronization 同步
Transactions 事務(wù)
三糖赔、Mybatis
MyBatis 是支持普通 SQL查詢(xún),存儲(chǔ)過(guò)程和高級(jí)映射的優(yōu)秀持久層框架轩端。MyBatis 消除了幾乎所有的JDBC代碼和參數(shù)的手工設(shè)置以及結(jié)果集的檢索放典。MyBatis 使用簡(jiǎn)單的 XML或注解用于配置和原始映射,將接口和 Java 的POJOs(Plain Old Java Objects基茵,普通的 Java對(duì)象)映射成數(shù)據(jù)庫(kù)中的記錄奋构。
總體流程:
(1)加載配置并初始化
觸發(fā)條件:加載配置文件
將SQL的配置信息加載成為一個(gè)個(gè)MappedStatement對(duì)象(包括了傳入?yún)?shù)映射配置、執(zhí)行的SQL語(yǔ)句拱层、結(jié)果映射配置)弥臼,存儲(chǔ)在內(nèi)存中。
(2)接收調(diào)用請(qǐng)求
觸發(fā)條件:調(diào)用Mybatis提供的API
傳入?yún)?shù):為SQL的ID和傳入?yún)?shù)對(duì)象
處理過(guò)程:將請(qǐng)求傳遞給下層的請(qǐng)求處理層進(jìn)行處理根灯。
(3)處理操作請(qǐng)求
觸發(fā)條件:API接口層傳遞請(qǐng)求過(guò)來(lái)
傳入?yún)?shù):為SQL的ID和傳入?yún)?shù)對(duì)象
處理過(guò)程:
(A)根據(jù)SQL的ID查找對(duì)應(yīng)的MappedStatement對(duì)象径缅。
(B)根據(jù)傳入?yún)?shù)對(duì)象解析MappedStatement對(duì)象,得到最終要執(zhí)行的SQL和執(zhí)行傳入?yún)?shù)烙肺。
(C)獲取數(shù)據(jù)庫(kù)連接纳猪,根據(jù)得到的最終SQL語(yǔ)句和執(zhí)行傳入?yún)?shù)到數(shù)據(jù)庫(kù)執(zhí)行,并得到執(zhí)行結(jié)果。
(D)根據(jù)MappedStatement對(duì)象中的結(jié)果映射配置對(duì)得到的執(zhí)行結(jié)果進(jìn)行轉(zhuǎn)換處理,并得到最終的處理結(jié)果述吸。
(E)釋放連接資源猾瘸。
(4)返回處理結(jié)果將最終的處理結(jié)果返回
MyBatis 最強(qiáng)大的特性之一就是它的動(dòng)態(tài)語(yǔ)句功能殿雪。如果您以前有使用JDBC或者類(lèi)似框架的經(jīng)歷娘纷,您就會(huì)明白把SQL語(yǔ)句條件連接在一起是多么的痛苦惜索,要確保不能忘記空格或者不要在columns列后面省略一個(gè)逗號(hào)等氛悬。動(dòng)態(tài)語(yǔ)句能夠完全解決掉這些痛苦购笆。
四粗悯、Dubbo
Dubbo是一個(gè)分布式服務(wù)框架,致力于提供高性能和透明化的RPC(遠(yuǎn)程過(guò)程調(diào)用協(xié)議)遠(yuǎn)程服務(wù)調(diào)用方案由桌,以及SOA服務(wù)治理方案为黎。簡(jiǎn)單的說(shuō),dubbo就是個(gè)服務(wù)框架行您,如果沒(méi)有分布式的需求铭乾,其實(shí)是不需要用的,只有在分布式的時(shí)候娃循,才有dubbo這樣的分布式服務(wù)框架的需求炕檩,并且本質(zhì)上是個(gè)服務(wù)調(diào)用的東東,說(shuō)白了就是個(gè)遠(yuǎn)程服務(wù)調(diào)用的分布式框架捌斧。
1笛质、透明化的遠(yuǎn)程方法調(diào)用,就像調(diào)用本地方法一樣調(diào)用遠(yuǎn)程方法捞蚂,只需簡(jiǎn)單配置妇押,沒(méi)有任何API侵入。
2姓迅、軟負(fù)載均衡及容錯(cuò)機(jī)制敲霍,可在內(nèi)網(wǎng)替代F5等硬件負(fù)載均衡器,降低成本丁存,減少單點(diǎn)肩杈。
3、 服務(wù)自動(dòng)注冊(cè)與發(fā)現(xiàn)解寝,不再需要寫(xiě)死服務(wù)提供方地址扩然,注冊(cè)中心基于接口名查詢(xún)服務(wù)提供者的IP地址,并且能夠平滑添加或刪除服務(wù)提供者聋伦。
節(jié)點(diǎn)角色說(shuō)明:
Provider: 暴露服務(wù)的服務(wù)提供方夫偶。
Consumer: 調(diào)用遠(yuǎn)程服務(wù)的服務(wù)消費(fèi)方。
Registry: 服務(wù)注冊(cè)與發(fā)現(xiàn)的注冊(cè)中心嘉抓。
Monitor: 統(tǒng)計(jì)服務(wù)的調(diào)用次調(diào)和調(diào)用時(shí)間的監(jiān)控中心索守。
Container: 服務(wù)運(yùn)行容器。
五抑片、Maven
Maven這個(gè)個(gè)項(xiàng)目管理和構(gòu)建自動(dòng)化工具卵佛,越來(lái)越多的開(kāi)發(fā)人員使用它來(lái)管理項(xiàng)目中的jar包。但是對(duì)于我們程序員來(lái)說(shuō),我們最關(guān)心的是它的項(xiàng)目構(gòu)建功能截汪。
六疾牲、RabbitMQ
消息隊(duì)列一般是在項(xiàng)目中,將一些無(wú)需即時(shí)返回且耗時(shí)的操作提取出來(lái)衙解,進(jìn)行了異步處理阳柔,而這種異步處理的方式大大的節(jié)省了服務(wù)器的請(qǐng)求響應(yīng)時(shí)間,從而提高了系統(tǒng)的吞吐量蚓峦。
RabbitMQ是用Erlang實(shí)現(xiàn)的一個(gè)高并發(fā)高可靠AMQP消息隊(duì)列服務(wù)器舌剂。
Erlang是一門(mén)動(dòng)態(tài)類(lèi)型的函數(shù)式編程語(yǔ)言。對(duì)應(yīng)到Erlang里暑椰,每個(gè)Actor對(duì)應(yīng)著一個(gè)Erlang進(jìn)程霍转,進(jìn)程之間通過(guò)消息傳遞進(jìn)行通信。相比共享內(nèi)存一汽,進(jìn)程間通過(guò)消息傳遞來(lái)通信帶來(lái)的直接好處就是消除了直接的鎖開(kāi)銷(xiāo)(不考慮Erlang虛擬機(jī)底層實(shí)現(xiàn)中的鎖應(yīng)用)避消。
AMQP(Advanced Message Queue Protocol)定義了一種消息系統(tǒng)規(guī)范。這個(gè)規(guī)范描述了在一個(gè)分布式的系統(tǒng)中各個(gè)子系統(tǒng)如何通過(guò)消息交互召夹。
七岩喷、Log4j
日志記錄的優(yōu)先級(jí),分為OFF监憎、FATAL纱意、ERROR、WARN鲸阔、INFO妇穴、DEBUG、ALL或者您定義的級(jí)別隶债。
八、Ehcache
EhCache 是一個(gè)純Java的進(jìn)程內(nèi)緩存框架跑筝,具有快速死讹、精干等特點(diǎn),是Hibernate中默認(rèn)的CacheProvider曲梗。Ehcache是一種廣泛使用的開(kāi)源Java分布式緩存赞警。主要面向通用緩存,Java EE和輕量級(jí)容器。它具有內(nèi)存和磁盤(pán)存儲(chǔ)虏两,緩存加載器,緩存擴(kuò)展愧旦,緩存異常處理程序,一個(gè)gzip緩存servlet過(guò)濾器定罢,支持REST和SOAP api等特點(diǎn)笤虫。
優(yōu)點(diǎn):
1、 快速
2、 簡(jiǎn)單
3琼蚯、 多種緩存策略
4酬凳、緩存數(shù)據(jù)有兩級(jí):內(nèi)存和磁盤(pán),因此無(wú)需擔(dān)心容量問(wèn)題
5遭庶、 緩存數(shù)據(jù)會(huì)在虛擬機(jī)重啟的過(guò)程中寫(xiě)入磁盤(pán)
6宁仔、可以通過(guò)RMI、可插入API等方式進(jìn)行分布式緩存
7峦睡、 具有緩存和緩存管理器的偵聽(tīng)接口
8翎苫、支持多緩存管理器實(shí)例,以及一個(gè)實(shí)例的多個(gè)緩存區(qū)域
9榨了、提供Hibernate的緩存實(shí)現(xiàn)
缺點(diǎn):
1煎谍、使用磁盤(pán)Cache的時(shí)候非常占用磁盤(pán)空間:這是因?yàn)镈iskCache的算法簡(jiǎn)單,該算法簡(jiǎn)單也導(dǎo)致Cache的效率非常高阻逮。它只是對(duì)元素直接追加存儲(chǔ)粱快。因此搜索元素的時(shí)候非常的快。如果使用DiskCache的叔扼,在很頻繁的應(yīng)用中事哭,很快磁盤(pán)會(huì)滿。
2瓜富、不能保證數(shù)據(jù)的安全:當(dāng)突然kill掉java的時(shí)候鳍咱,可能會(huì)產(chǎn)生沖突,EhCache的解決方法是如果文件沖突了与柑,則重建cache谤辜。這對(duì)于Cache數(shù)據(jù)需要保存的時(shí)候可能不利。當(dāng)然价捧,Cache只是簡(jiǎn)單的加速丑念,而不能保證數(shù)據(jù)的安全。如果想保證數(shù)據(jù)的存儲(chǔ)安全结蟋,可以使用Bekeley DB Java Edition版本脯倚。這是個(gè)嵌入式數(shù)據(jù)庫(kù)∏妒海可以確保存儲(chǔ)安全和空間的利用率推正。
九、Redis
redis是一個(gè)key-value存儲(chǔ)系統(tǒng)宝惰。和Memcached類(lèi)似植榕,它支持存儲(chǔ)的value類(lèi)型相對(duì)更多,包括string(字符串)尼夺、list(鏈表)尊残、set(集合)炒瘸、zset(sorted set –有序集合)和hash(哈希類(lèi)型)。這些數(shù)據(jù)類(lèi)型都支持push/pop夜郁、add/remove及取交集并集和差集及更豐富的操作什燕,而且這些操作都是原子性的。在此基礎(chǔ)上竞端,redis支持各種不同方式的排序屎即。與memcached一樣,為了保證效率事富,數(shù)據(jù)都是緩存在內(nèi)存中技俐。區(qū)別的是redis會(huì)周期性的把更新的數(shù)據(jù)寫(xiě)入磁盤(pán)或者把修改操作寫(xiě)入追加的記錄文件,并且在此基礎(chǔ)上實(shí)現(xiàn)了master-slave(主從)同步统台。
Redis數(shù)據(jù)庫(kù)完全在內(nèi)存中雕擂,使用磁盤(pán)僅用于持久性。相比許多鍵值數(shù)據(jù)存儲(chǔ)贱勃,Redis擁有一套較為豐富的數(shù)據(jù)類(lèi)型井赌。Redis可以將數(shù)據(jù)復(fù)制到任意數(shù)量的從服務(wù)器。
1.2贵扰、Redis優(yōu)點(diǎn):
(1)異吵鹚耄快速:Redis的速度非常快戚绕,每秒能執(zhí)行約11萬(wàn)集合纹坐,每秒約81000+條記錄。
(2)支持豐富的數(shù)據(jù)類(lèi)型:Redis支持最大多數(shù)開(kāi)發(fā)人員已經(jīng)知道像列表舞丛,集合耘子,有序集合,散列數(shù)據(jù)類(lèi)型球切。這使得它非常容易解決各種各樣的問(wèn)題谷誓,因?yàn)槲覀冎滥男﹩?wèn)題是可以處理通過(guò)它的數(shù)據(jù)類(lèi)型更好。
(3)操作都是原子性:所有Redis操作是原子的吨凑,這保證了如果兩個(gè)客戶端同時(shí)訪問(wèn)的Redis服務(wù)器將獲得更新后的值片林。
(4)多功能實(shí)用工具:Redis是一個(gè)多實(shí)用的工具,可以在多個(gè)用例如緩存怀骤,消息,隊(duì)列使用(Redis原生支持發(fā)布/訂閱)焕妙,任何短暫的數(shù)據(jù)蒋伦,應(yīng)用程序,如Web應(yīng)用程序會(huì)話焚鹊,網(wǎng)頁(yè)命中計(jì)數(shù)等痕届。
1.3韧献、Redis缺點(diǎn):
(1)單線程
(2)耗內(nèi)存
十、Shiro
Apache Shiro是Java的一個(gè)安全框架研叫,旨在簡(jiǎn)化身份驗(yàn)證和授權(quán)锤窑。Shiro在JavaSE和JavaEE項(xiàng)目中都可以使用。它主要用來(lái)處理身份認(rèn)證嚷炉,授權(quán)渊啰,企業(yè)會(huì)話管理和加密等。Shiro的具體功能點(diǎn)如下:
(1)身份認(rèn)證/登錄申屹,驗(yàn)證用戶是不是擁有相應(yīng)的身份绘证;
(2)授權(quán),即權(quán)限驗(yàn)證哗讥,驗(yàn)證某個(gè)已認(rèn)證的用戶是否擁有某個(gè)權(quán)限嚷那;即判斷用戶是否能做事情,常見(jiàn)的如:驗(yàn)證某個(gè)用戶是否擁有某個(gè)角色杆煞∥嚎恚或者細(xì)粒度的驗(yàn)證某個(gè)用戶對(duì)某個(gè)資源是否具有某個(gè)權(quán)限;
(3)會(huì)話管理决乎,即用戶登錄后就是一次會(huì)話队询,在沒(méi)有退出之前,它的所有信息都在會(huì)話中瑞驱;會(huì)話可以是普通JavaSE環(huán)境的娘摔,也可以是如Web環(huán)境的;
(4)加密唤反,保護(hù)數(shù)據(jù)的安全性凳寺,如密碼加密存儲(chǔ)到數(shù)據(jù)庫(kù),而不是明文存儲(chǔ)彤侍;
(5)Web支持肠缨,可以非常容易的集成到Web環(huán)境;
Caching:緩存盏阶,比如用戶登錄后晒奕,其用戶信息、擁有的角色/權(quán)限不必每次去查名斟,這樣可以提高效率脑慧;
(6)shiro支持多線程應(yīng)用的并發(fā)驗(yàn)證,即如在一個(gè)線程中開(kāi)啟另一個(gè)線程砰盐,能把權(quán)限自動(dòng)傳播過(guò)去闷袒;
(7)提供測(cè)試支持;
(8)允許一個(gè)用戶假裝為另一個(gè)用戶(如果他們?cè)试S)的身份進(jìn)行訪問(wèn)岩梳;
(9)記住我囊骤,這個(gè)是非常常見(jiàn)的功能晃择,即一次登錄后,下次再來(lái)的話不用登錄了也物。
文字描述可能并不能讓猿友們完全理解具體功能的意思宫屠。下面我們以登錄驗(yàn)證為例,向猿友們介紹Shiro的使用滑蚯。至于其他功能點(diǎn)浪蹂,猿友們用到的時(shí)候再去深究其用法也不遲。
十一膘魄、設(shè)計(jì)模式
這個(gè)算不上框架乌逐,可自行忽略,不過(guò)博主認(rèn)為設(shè)計(jì)模式的思想很有必要了解一下创葡。
思想:
開(kāi)閉原則:
開(kāi)閉原則就是說(shuō)對(duì)擴(kuò)展開(kāi)放浙踢,對(duì)修改關(guān)閉。在程序需要進(jìn)行拓展的時(shí)候灿渴,不能去修改原有的代碼洛波。
針對(duì)接口編程,針對(duì)接口編程骚露,依賴(lài)于抽象而不依賴(lài)于具體蹬挤。
盡量使用合成/聚合的方式,而不是使用繼承棘幸。
一個(gè)實(shí)體應(yīng)當(dāng)盡量少的與其他實(shí)體之間發(fā)生相互作用焰扳,使得系統(tǒng)功能模塊相對(duì)獨(dú)立。
使用多個(gè)隔離的接口误续,比使用單個(gè)接口要好吨悍。
里氏代換原則:
(1)子類(lèi)的能力必須大于等于父類(lèi),即父類(lèi)可以使用的方法蹋嵌,子類(lèi)都可以使用育瓜。
(2)返回值也是同樣的道理。假設(shè)一個(gè)父類(lèi)方法返回一個(gè)List栽烂,子類(lèi)返回一個(gè)ArrayList躏仇,這當(dāng)然可以。如果父類(lèi)方法返回一個(gè)ArrayList腺办,子類(lèi)返回一個(gè)List焰手,就說(shuō)不通了。這里子類(lèi)返回值的能力是比父類(lèi)小的怀喉。
(3)還有拋出異常的情況册倒。任何子類(lèi)方法可以聲明拋出父類(lèi)方法聲明異常的子類(lèi)。 而不能聲明拋出父類(lèi)沒(méi)有聲明的異常磺送。
我有一個(gè)微信公眾號(hào)驻子,經(jīng)常會(huì)分享一些Java技術(shù)相關(guān)的干貨;如果你喜歡我的分享估灿,可以用微信搜索“Java團(tuán)長(zhǎng)”或者“javatuanzhang”關(guān)注崇呵。