1. 計(jì)算機(jī)網(wǎng)絡(luò)
- OSI七層架構(gòu)和TCP五層架構(gòu)
- OSI:應(yīng)用、表示、會(huì)話、傳輸、網(wǎng)絡(luò)、數(shù)據(jù)鏈路、物理
- TCP:應(yīng)用(報(bào)文)、傳輸(報(bào)文段)、網(wǎng)絡(luò)(分組)、數(shù)據(jù)鏈路(幀)、物理(比特)
- TCP五層對應(yīng)的協(xié)議
- 應(yīng)用層:為用戶提供交互應(yīng)用服務(wù)。DNS、HTTP、STMP
- 傳輸層:在兩臺(tái)主機(jī)之間進(jìn)行通信傳輸數(shù)據(jù)。TCP、UDP
- 網(wǎng)絡(luò)層:選擇合適的路由和交換節(jié)點(diǎn)。IP
- 數(shù)據(jù)鏈路層:在兩個(gè)相鄰節(jié)點(diǎn)傳輸幀
- 物理層:在相鄰節(jié)點(diǎn)間傳輸比特
- TCP和UDP的區(qū)別
-
TCP是面向連接的、可靠的、傳輸字節(jié)流、傳輸效率慢
- TCP通過三次握手建立連接,確保雙方能正常收發(fā)數(shù)據(jù)
- TCP通過四次揮手?jǐn)嚅_連接,確保雙方都已經(jīng)完成收發(fā)并且數(shù)據(jù)已經(jīng)被成功接收后才斷開連接
- 可靠性:通過確認(rèn)、超時(shí)重傳、流量控制、擁塞控制等機(jī)制確保傳輸數(shù)據(jù)的可靠性,即數(shù)據(jù)傳輸不丟包、數(shù)據(jù)無錯(cuò)誤、數(shù)據(jù)順序正確、不重傳
- 應(yīng)用:文件傳輸(FTP)、發(fā)送郵件(STMP)
-
UDP是無連接、不可靠的、傳輸數(shù)據(jù)報(bào)文段、傳輸效率高
- 不需要建立連接也不需要斷開連接
- 傳輸數(shù)據(jù)只管發(fā)送不管是否成功接收,效率高
- 應(yīng)用:發(fā)送語音、直播、視頻
-
- TCP如何保證可靠傳輸
確認(rèn):接收方的確認(rèn)報(bào)文ack約定發(fā)送方下一個(gè)報(bào)文的頭部。比如發(fā)送方發(fā)送報(bào)文123,接收方回應(yīng)ack報(bào)文約定發(fā)送方下一個(gè)報(bào)文的頭部必須是4。如果發(fā)送方的下一個(gè)報(bào)文的頭部不為4,接收方可以要求發(fā)送方重發(fā)報(bào)文
超時(shí)重傳:發(fā)送方發(fā)送了一個(gè)報(bào)文后,如果超過一段時(shí)間都沒有收到接收方的確認(rèn)報(bào)文,會(huì)重發(fā)這個(gè)報(bào)文
流量控制:如果發(fā)送方發(fā)送數(shù)據(jù)太快,會(huì)導(dǎo)致接收方來不及接收數(shù)據(jù)導(dǎo)致數(shù)據(jù)丟包。通過滑動(dòng)窗口進(jìn)行流量控制,接收方收到數(shù)據(jù)后,根據(jù)自身緩沖區(qū)的大小,將剩余窗口的大小通過確認(rèn)報(bào)文返回給發(fā)送方,發(fā)送方根據(jù)這個(gè)窗口大小確定下一次發(fā)送數(shù)據(jù)的長度
-
擁塞控制:也是基于滑動(dòng)窗口實(shí)現(xiàn),但是是發(fā)送方根據(jù)當(dāng)前網(wǎng)絡(luò)環(huán)境自己估算窗口大小
- 慢開始:一開始窗口大小為1,如果網(wǎng)絡(luò)好,大小呈指數(shù)增長
- 擁塞避免:因?yàn)槭浅手笖?shù)增長,當(dāng)窗口大小達(dá)到閾值時(shí),開始呈線性增長。當(dāng)出現(xiàn)網(wǎng)絡(luò)擁塞時(shí),窗口大小降為1,重新開始慢開始
- 快重傳:當(dāng)發(fā)送方接收到三個(gè)重復(fù)的確認(rèn)報(bào)文后,無需等待,直接重傳下一個(gè)報(bào)文
- 快恢復(fù):窗口大小降為快重傳發(fā)生時(shí)的1/2
- 三次握手、四次揮手
-
三次握手:假設(shè)發(fā)送方為客戶端,接收方為服務(wù)端
- 客戶端向服務(wù)端發(fā)起建立連接請求,客戶端生成一個(gè)序列號(hào)seq=x,將標(biāo)志位SYN=1和序列號(hào)seq=x發(fā)送給服務(wù)器端。此時(shí)客戶端狀態(tài)為SYN_SENT,服務(wù)端狀態(tài)為LISTEN
- 服務(wù)端收到客戶端的報(bào)文后,服務(wù)端生成一個(gè)序列號(hào)seq=y,將標(biāo)志位SYN=1,序列號(hào)seq=y,確認(rèn)報(bào)文ACK=1,確認(rèn)號(hào)ack=x+1發(fā)送給客戶端。此時(shí)客戶端狀態(tài)為SYN_SENT,服務(wù)端狀態(tài)為SYN_RECV
- 客戶端收到服務(wù)端的報(bào)文后,客戶端生成序列號(hào)seq=x+1,將標(biāo)志位ACK=1,序列號(hào)seq=x+1,確認(rèn)號(hào)ack=y+1發(fā)送給服務(wù)端。此時(shí)客戶端狀態(tài)為ESTABLISHED,服務(wù)器收到報(bào)文后,狀態(tài)也為ESTABLISHED
-
四次揮手
- 當(dāng)客戶端發(fā)送完報(bào)文后,客戶端向服務(wù)端發(fā)送終止報(bào)文(標(biāo)志位FIN=1,序列號(hào)seq=u),客戶端進(jìn)入FIN_WAIT1狀態(tài)
- 服務(wù)端收到終止報(bào)文,服務(wù)端向客戶端發(fā)送確認(rèn)報(bào)文(標(biāo)志位ACK=1,序列號(hào)seq=v,確認(rèn)號(hào)ack=u+1),服務(wù)端進(jìn)入CLOSE_WAIT狀態(tài)
- 服務(wù)端此時(shí)還會(huì)繼續(xù)發(fā)送剩余的未發(fā)送的數(shù)據(jù),當(dāng)數(shù)據(jù)發(fā)送完后,服務(wù)端向客戶端發(fā)送終止報(bào)文(標(biāo)志位FIN=1,標(biāo)志位ACK=1,序列號(hào)seq=w,確認(rèn)號(hào)ack=u+1),服務(wù)端進(jìn)入LAST_ACK狀態(tài)
- 客戶端收到服務(wù)端的終止報(bào)文后,向服務(wù)端發(fā)送確認(rèn)報(bào)文(標(biāo)志位ACK=1,序列號(hào)seq=u+1,確認(rèn)號(hào)ack=w+1),客戶端進(jìn)入TIME_WAIT狀態(tài),等待2MSL時(shí)間后,客戶端進(jìn)入CLOSE狀態(tài),當(dāng)服務(wù)端收到客戶端的確認(rèn)報(bào)文后,服務(wù)端也進(jìn)入CLOSE狀態(tài),服務(wù)端早于客戶端進(jìn)入CLOSE狀態(tài)
-
- 為什么是三次握手,兩次是否可以
- 假設(shè)只有兩次握手,那么如果第二次握手的時(shí)候,服務(wù)端返回給客戶端的確認(rèn)報(bào)文丟失了,客戶端沒有收到確認(rèn)報(bào)文,認(rèn)為沒有建立連接,但是服務(wù)端把報(bào)文發(fā)送出去了,認(rèn)為已經(jīng)建立了連接,但是實(shí)際連接是沒有成功建立
- 假設(shè)只有兩次握手,那么第一次客戶端發(fā)送的請求建立連接的報(bào)文沒有丟失,而是因?yàn)槌瑫r(shí)重傳,后面又發(fā)送了一次,如果只有兩次握手,當(dāng)服務(wù)端收到請求建立連接的報(bào)文后,又會(huì)建立另一個(gè)連接,但是這個(gè)連接不會(huì)進(jìn)行數(shù)據(jù)傳輸
- 為什么連接的時(shí)候是三次,斷開連接卻要四次
- 當(dāng)服務(wù)端收到客戶端的終止報(bào)文后,回復(fù)確認(rèn)報(bào)文之后,服務(wù)端要將剩余的數(shù)據(jù)繼續(xù)發(fā)送完才會(huì)發(fā)送終止報(bào)文給客戶端,這樣能保證數(shù)據(jù)傳輸?shù)耐暾?/li>
- 為什么第四次揮手時(shí)發(fā)出的確認(rèn)報(bào)文要等到2MSL時(shí)間才能釋放TCP連接
- 因?yàn)镸SL是報(bào)文在傳輸時(shí)存活的最長時(shí)間,當(dāng)?shù)谒拇螕]手時(shí)客戶端發(fā)送的確認(rèn)報(bào)文達(dá)到服務(wù)端,服務(wù)端再返回確認(rèn)報(bào)文,最長時(shí)間就是2MSL,如果超過2MSL還沒有收到服務(wù)端返回的確認(rèn)報(bào)文,就說明客戶端發(fā)送的報(bào)文丟失了,要重傳,否則服務(wù)端無法關(guān)閉連接
- HTTP和HTTPS
- HTTP端口80,HTTPS端口443
- HTTP無加密,HTTPS通過數(shù)字證書進(jìn)行加密
- HTTP基于TCP協(xié)議,傳輸明文內(nèi)容。HTTPS基于SSL協(xié)議,傳輸加密數(shù)據(jù)
- HTTP的請求有哪些:GET、POST、DELETE、PUT
- PUT:上傳文件
- DELETE:刪除文件
- POST:提交數(shù)據(jù),修改
- GET:獲取數(shù)據(jù),查詢
- HTTP狀態(tài)碼:200——成功、404——找不到、500——服務(wù)端錯(cuò)誤
- HTTP1.0、HTTP1.1、HTTP2.0(長連接和短連接)
- 1.0默認(rèn)采用短連接,每次傳輸數(shù)據(jù)都要通過三次握手建立TCP連接,數(shù)據(jù)傳輸完畢后就通過四次揮手?jǐn)嚅_連接
- 1.1采用長連接,在一個(gè)TCP連接存活的keepAlive時(shí)間里,可以多次使用該連接傳輸數(shù)據(jù)
- HTTP請求過程(從網(wǎng)址欄輸入U(xiǎn)RL到顯示主頁的過程)
- 對輸入的url進(jìn)行DNS解析,將域名轉(zhuǎn)換為IP地址
- 和目標(biāo)服務(wù)器建立TCP連接
- 向目標(biāo)服務(wù)器發(fā)送HTTP請求
- 目標(biāo)服務(wù)器處理請求并返回HTTP報(bào)文
- 瀏覽器解析并渲染頁面
- HTTPS請求過程(HTTPS加密過程)
- 客戶端和服務(wù)端經(jīng)過三次握手建立連接后,客戶端會(huì)發(fā)送一個(gè)請求給服務(wù)端,告訴服務(wù)端,客戶端支持的SSL版本、加密算法和密鑰長度
- 服務(wù)端將公鑰發(fā)給數(shù)字證書機(jī)構(gòu),得到公鑰證書,服務(wù)端將公鑰證書發(fā)給客戶端
- 客戶端收到證書后先校驗(yàn)證書是否有效,然后生成對稱密鑰,將對稱密鑰發(fā)送給服務(wù)端
- 服務(wù)端收到對稱密鑰后,使用私鑰進(jìn)行解密
- 然后客戶端跟服務(wù)端就可以通過對稱加密進(jìn)行通信
- 對稱加密和非對稱加密
- 對稱加密:加密和解密使用同一個(gè)密鑰,運(yùn)算快,但是要安全將密鑰傳輸給另一方,DES、AES
- 非對稱加密:公鑰加密的信息只能用私鑰解密,私鑰加密的信息只能用公鑰解密。RSA
- 重定向和轉(zhuǎn)發(fā)
- 重定向,是客戶端行為,瀏覽器根據(jù)服務(wù)端返回的狀態(tài)碼(3xx),對重定向的URL重新發(fā)起HTTP請求,URL會(huì)發(fā)生變化,不能共享數(shù)據(jù)??梢杂糜谟脩糇N后重定向到登錄頁面
- 轉(zhuǎn)發(fā),是服務(wù)端行為,URL不會(huì)發(fā)生變化,轉(zhuǎn)發(fā)和被轉(zhuǎn)發(fā)頁面可以共享request請求頭的數(shù)據(jù)。可以用于用戶登錄后將user數(shù)據(jù)轉(zhuǎn)發(fā)到指定頁面
- session、cookie、token
因?yàn)镠TTP協(xié)議是無狀態(tài)的,也就是客戶端每次想要和服務(wù)端通信,都要重新建立連接。cookie、session、token都是為了校驗(yàn)用戶
-
cookie:
- 流程:客戶端請求服務(wù)端,服務(wù)端生成一個(gè)session,將sessionid設(shè)置到cookie,返回給客戶端瀏覽器保存。
- 特點(diǎn):大小在4KB左右,瀏覽器每次請求都會(huì)在請求頭攜帶cookie
- 缺點(diǎn):不安全,存放在瀏覽器,可以被查看
-
session
- 流程:客戶端請求服務(wù)端,服務(wù)端生成一個(gè)session,保存到數(shù)據(jù)庫,然后將sessionid設(shè)置到cookie,返回給客戶端瀏覽器。下一次請求時(shí),通過cookie存放的sessionid校驗(yàn)
- 特點(diǎn):存放在服務(wù)端,存儲(chǔ)空間大
- 優(yōu)點(diǎn):安全,存放在服務(wù)端
- 缺點(diǎn):session相當(dāng)于存了整個(gè)用戶信息
-
token
- 流程:客戶端請求服務(wù)端,服務(wù)端校驗(yàn)通過后,將用戶id和其他一些信息進(jìn)行加密,生成token,保存到緩存或者數(shù)據(jù)庫,然后將token返回給客戶端,客戶端下一次請求時(shí)把token帶上,服務(wù)端校驗(yàn)token是否通過
- 特點(diǎn):體積小,是一段加密的字符
- 優(yōu)點(diǎn):安全,存放在服務(wù)端,且只存了用戶id,可以通過緩存層實(shí)現(xiàn)不需要去數(shù)據(jù)庫查詢用戶
- 如果客戶端禁止cookie,session還能用嗎
- 也可以,雖然session一般是通過將sessionid存放在cookie中實(shí)現(xiàn)的,但是如果cookie被禁用了,也可以將sessionid通過url傳遞,也能實(shí)現(xiàn)校驗(yàn)
- ping命令做了什么,是基于哪一層
- ping命令主要用來測試兩臺(tái)主機(jī)之間的連通性
- 原理:向目的主機(jī)發(fā)送請求報(bào)文,目的主機(jī)收到后發(fā)送回應(yīng)報(bào)文,根據(jù)收發(fā)時(shí)間和成功響應(yīng)的次數(shù)計(jì)算往返時(shí)間和丟包率
- 工作在網(wǎng)絡(luò)層
2. 操作系統(tǒng)
- CPU占用過高排查
- top命令查看當(dāng)前服務(wù)器的cpu、內(nèi)存占用情況
- 輸入P命令,查看CPU占用最高的進(jìn)程
- top -H -p [進(jìn)程id]:查看進(jìn)程的線程
- printf "%x\n" [進(jìn)程id],得到線程的16進(jìn)制id
- jstack [進(jìn)程id] | grep -A100 [線程id]
- 常用的Linux命令
- 查看目錄:ls
- 當(dāng)前路徑:pwd
- 查看文件:cat
- 查看前50行:cat xx.log | head -n 50
- 查看后50行:cat xx.log | tail -n 50
- 查詢文件:grep
- grep --c "xxx" xx.log
3. Spring:https://zhuanlan.zhihu.com/p/551246463
- Spring特點(diǎn)
- 輕量級:jar包
- 控制反轉(zhuǎn):通過IOC機(jī)制,將一個(gè)對象依賴的其他對象也會(huì)通過被動(dòng)的方式加載到IOC容器,不需要對象自己創(chuàng)建或查找依賴對象
- 面向切面:AOP
- 容器:IOC容器管理IocBean
- Spring核心模塊
- Spring-core核心包
- Spring-context上下文
- Spring-aop
- Spring-dao
- Spring-orm
- Spring-web
- Spring-mvc
- Spring注解
-
標(biāo)記Bean相關(guān)注解
- @Component
- @Controller:控制層,標(biāo)記一個(gè)類作為mvc控制器
- @Service:業(yè)務(wù)層,標(biāo)記一個(gè)類作為服務(wù)類
- @Repository:持久層,標(biāo)記一個(gè)類作為數(shù)據(jù)訪問對象
- @Bean:在方法上使用,該方法要注冊為上下文context中的bean
-
注入Bean相關(guān)注解
- @Autowired:由bean提供,按類型匹配,如果存在多個(gè),再按名稱匹配
- @Inject:由JSR-330提供,按類型匹配
- @Resource:由JSR-250提供,按名稱匹配,如果存在多個(gè),再按類型匹配
-
Java配置相關(guān)注解
- @Configuration:標(biāo)記一個(gè)類為配置類
-
AOP相關(guān)注解
- @Aspect:標(biāo)記一個(gè)類為切面類
- @Before:標(biāo)記在方法上,在該方法執(zhí)行之前執(zhí)行
- @After:標(biāo)記在方法上,在該方法執(zhí)行之后執(zhí)行
- @Around:標(biāo)記在方法上,在該方法執(zhí)行之前和執(zhí)行之后執(zhí)行
-
- Spring與第三方框架結(jié)合
- 權(quán)限:Shiro
- 緩存:Redis
- 持久化:Mybatis
- 什么是SpringIoc
- 也就是控制反轉(zhuǎn)。我們可以把這個(gè)詞拆開,分別看看控制什么,反轉(zhuǎn)了什么
- 控制:控制對象的創(chuàng)建、管理、銷毀,也就是控制了對象的生命周期
- 反轉(zhuǎn):傳統(tǒng)方式下對象是通過new創(chuàng)建的,然后我們再通過使用實(shí)例對象操作,而Spring是通過一個(gè)Ioc容器,將對象初始化出來放到容器里,我們使用的時(shí)候不需要new對象,可以直接從容器中拿出即可使用
- 也就是控制反轉(zhuǎn)。我們可以把這個(gè)詞拆開,分別看看控制什么,反轉(zhuǎn)了什么
- 什么是DI依賴注入
- 當(dāng)bean之間存在依賴關(guān)系,ioc容器也會(huì)自動(dòng)將依賴對象的實(shí)例進(jìn)行注入,基于反射實(shí)現(xiàn)(newInstance、invoke method)
- 接口注入
- setter注入
- 構(gòu)造器注入
- 當(dāng)bean之間存在依賴關(guān)系,ioc容器也會(huì)自動(dòng)將依賴對象的實(shí)例進(jìn)行注入,基于反射實(shí)現(xiàn)(newInstance、invoke method)
- 什么是Bean:被Ioc容器管理的對象,一般可以通過application.xml配置文件或者使用注解將一個(gè)類標(biāo)注為Bean
- 將一個(gè)類聲明為bean的注解
- @Component:通用注解,如果一個(gè)類不知道被標(biāo)記為哪個(gè)層,可以使用這個(gè)注解
- @Service:業(yè)務(wù)層,業(yè)務(wù)邏輯代碼
- @Repository:持久層dao,操作數(shù)據(jù)庫
- @Controller:mvc控制層,用于接收客戶端請求并調(diào)度Service業(yè)務(wù)邏輯
- @Component和@Bean的區(qū)別
- @Component用于類,@Bean用在方法
- @Component是通過@ComponentScan注解掃描類路徑自動(dòng)裝配到ioc容器的,@Bean則是告訴Spring這是某個(gè)類的實(shí)例,在需要使用時(shí)給我
- 當(dāng)使用第三方庫的類需要裝配到Spring容器時(shí),只能使用@Bean
- 注入Bean的注解有哪些
- @Autowired:spring提供
- @Inject:JSR-250
- @Resource:JSR-330
- @Autowired和@Resource的區(qū)別是什么
- @Autowired是spring內(nèi)置的注解,默認(rèn)根據(jù)bean的類型匹配,可配置@Qualifier指定bean的name根據(jù)名稱匹配
- @Resource是JDK的JSR-330,默認(rèn)根據(jù)bean的名稱匹配,有name和type兩個(gè)參數(shù)可以指定
- Bean的作用域
- Singleton:單例模式,在整個(gè)IOC容器中,只有一個(gè)Bean實(shí)例
- protoType:原型模式,也就是多例,每次通過getBean()獲取Bean都會(huì)創(chuàng)建一個(gè)新的Bean實(shí)例
- request:每次HTTP請求,都會(huì)創(chuàng)建不同的Bean實(shí)例
- session:每次HTTP Session請求,都會(huì)創(chuàng)建不同的Bean實(shí)例
- global session:使用HTTP Session的都只有一個(gè)Bean實(shí)例
- Controller是singleton,因?yàn)橐话悴粫?huì)在controller定義屬性
- Bean的生命周期
- 實(shí)例化:對應(yīng)傳統(tǒng)方式的構(gòu)造函數(shù)。通過XML配置文件、注解等方式,將定義好的Bean對象轉(zhuǎn)換為BeanDefination對象,完成對Bean對象的解析和加載,通過反射機(jī)制newInstance()創(chuàng)建Bean對象
- 屬性設(shè)置:對應(yīng)傳統(tǒng)方式的getter和setter方法。這階段會(huì)進(jìn)行依賴注入,將Bean對象依賴的其他Bean對象也加載到Ioc容器
- 初始化:AOP
- 調(diào)用aware接口相關(guān)方法,invokeAwareMethod()
- 調(diào)用BeanPostProcessor的前置處理方法
- 調(diào)用initMethod方法
- 調(diào)用BeanPostProcessor的后置處理方法
- 使用
- 銷毀:調(diào)用destoryMethod()方法
- 什么是SpringAop
- 在傳統(tǒng)方式下,進(jìn)行事務(wù)管理,比如try/catch/finaly這些代碼,或者在業(yè)務(wù)邏輯前后輸出日志,要寫重復(fù)的代碼。aop就是為了簡化這些重復(fù)代碼而出現(xiàn)的概念
- 通過橫向抽取的概念,把這些重復(fù)的代碼抽取到一個(gè)切面,通過切面的切入,實(shí)現(xiàn)在不同類的方法中加入事務(wù)管理、日志打印等功能
- 業(yè)務(wù)場景
- 在CRUD操作中打印每個(gè)操作的開始和結(jié)束日志:@Before、@After
- 在CRUD操作出現(xiàn)報(bào)錯(cuò)時(shí)回滾操作:@AfterThrowing
- 在CRUD操作后關(guān)閉數(shù)據(jù)庫連接:@After
- 統(tǒng)計(jì)CRUD操作的執(zhí)行時(shí)長:@Around
- aop的兩種代理方式:通過動(dòng)態(tài)代理,使得在程序運(yùn)行時(shí)可以動(dòng)態(tài)添加新的邏輯和功能
JDK動(dòng)態(tài)代理:當(dāng)目標(biāo)對象實(shí)現(xiàn)了一個(gè)接口時(shí),使用JDK動(dòng)態(tài)代理。通過newInstance()方法創(chuàng)建代理對象,通過invoke()方法插入額外的邏輯和功能,基于反射機(jī)制
CGLIB代理:當(dāng)目標(biāo)對象沒有實(shí)現(xiàn)接口,使用CGLIB代理,基于字節(jié)碼文件實(shí)現(xiàn)
- 什么是SpringMVC
- Model模型:負(fù)責(zé)數(shù)據(jù)的讀取、操作、存儲(chǔ)
- View視圖:負(fù)責(zé)數(shù)據(jù)的展示,web頁面
- Controller控制器:負(fù)責(zé)在Model和View之間進(jìn)行數(shù)據(jù)傳遞
- SpringMvc核心組件
- DispatchServlet:前端控制器,負(fù)責(zé)統(tǒng)一處理前端的請求和將請求轉(zhuǎn)發(fā)分配
- HandleMapping:將請求路徑映射到對應(yīng)的處理請求的控制器,使用@RequestMapping注解定義路徑
- Controller:實(shí)際處理請求的控制器,對請求進(jìn)行業(yè)務(wù)邏輯處理
- HanldeAdapter:負(fù)責(zé)將請求分派給控制器進(jìn)行處理
- ViewResolver:負(fù)責(zé)將邏輯視圖解析為實(shí)際的視圖對象
- View:視圖,負(fù)責(zé)渲染并展示最終的響應(yīng)內(nèi)容
- SpringMvc工作流程
- 前端請求發(fā)送到前端控制器DispatcherServlet
- DispatcherServlet收到請求后調(diào)用處理映射器HandlerMapping
- HandlerMapping根據(jù)映射的url路徑找到對應(yīng)的后端處理控制器Controller,將處理器對象返回給前端控制器DispatcherServlet
- DispatcherServlet再調(diào)用處理適配器HandlerAdapter調(diào)用對應(yīng)的后端控制器Controller(這里才是真正執(zhí)行后端的業(yè)務(wù)邏輯)
- Controller處理完之后,將ModelAndView結(jié)果返回給處理適配器HandlerAdapter
- HandleAdapter把ModelAndView返回給前端控制器DispatcherServlet
- DispatcherServlet再調(diào)用視圖解析器ViewResolver解析ModelAndView
- ViewResolver將ModelAndView的解析結(jié)果返回給View
- View渲染并展示響應(yīng)結(jié)果
-
SpringBoot的優(yōu)點(diǎn)
- properties配置文件和yml配置文件使得項(xiàng)目的配置更簡便
- 內(nèi)置了TOMCAT
SpringBoot配置文件:properties文件和yml文件
-
SpringBoot核心注解
- @SpringBootConfiguration:啟動(dòng)類的注解
- @EnableAutoConfiguration:打開自動(dòng)配置的功能
- @ComponentScan:Spring組件掃描。
4. Mybatis:(https://www.zhihu.com/people/zhao-yin-jing/posts)
- 注解實(shí)現(xiàn)動(dòng)態(tài)SQL:(https://blog.csdn.net/qq_43494025/article/details/89791321)
- @Select(SQL)、@Insert(SQL)、@Update(SQL)、@Delete(SQL)
- 動(dòng)態(tài)SQL:@SelectProvider(type="SQLProviderClass",method="SQLProviderMethod")
-
優(yōu)點(diǎn):
- 相比于JDBC,簡化了代碼,通過配置文件實(shí)現(xiàn)數(shù)據(jù)庫連接,封裝了JDBC加載驅(qū)動(dòng)、創(chuàng)建連接等繁瑣的復(fù)雜操作,只需要關(guān)注如何編寫SQL語句
- 可以通過XML或者注解的方式來配置mapper映射
-
{}和${}的區(qū)別
-
{}是預(yù)處理,可以防止SQL注入,安全性高
- ${}是字符串替換
-
4. Nutz框架
- (Nutz的mvc流程)項(xiàng)目中如何通過type協(xié)議號(hào),定位到對應(yīng)的執(zhí)行方法的(底層還是根據(jù)反射,先將facade方法注冊到一個(gè)map里,key是type協(xié)議號(hào),value是method方法,然后根據(jù)前端請求的參數(shù)type,從map中拿到對應(yīng)的method,然后反射invoke執(zhí)行方法,將方法執(zhí)行結(jié)構(gòu)的res返回)
起服時(shí),在MessageDispatcher類中,掃包,檢測使用了@Packet注解標(biāo)注的Facade方法,都其標(biāo)注的type協(xié)議號(hào)作為key,Method方法作為value,存入map中
當(dāng)前端發(fā)送請求時(shí),在MessageDispatcher類中,根據(jù)請求參數(shù)協(xié)議號(hào)type,從map拿到對應(yīng)的Method,new MessageFacadeInvoker(msg, callback),將msg請求參數(shù)和Method方法交給MessageFacadeInvoker反射執(zhí)行類
MessageFacadeInvoker類的run方法執(zhí)行,調(diào)用handleMessage(reqMsg,MethodCallback)
在handleMessage()方法中,先執(zhí)行methodCallback.handle()通過this.method.invoke()執(zhí)行方法
根據(jù)方法執(zhí)行返回的Res,填充本次請求的返回
-
NutzMvc
后臺(tái)請求處理:https://blog.csdn.net/weixin_43358075/article/details/93999678-
OperModule后臺(tái)web操作類
@IocBean
@At("/opt")
@Fail("void")
@Filters({ @By(type = DESDecryptFilter.class), @By(type = InvokeTimeFilter.class) })
public class OperateModule {@At("/recharge")
@Ok("json")
public WebResult recharge() {
...
}
} @IocBean:表明該類是IOC,會(huì)被解析到IOC容器,可通過@Inject注入其他IOC
@At:指定URL,類似@RequestMapping
@Fail:請求失敗的返回
@Filters:指定過濾器,每個(gè)請求都要經(jīng)過@By(type=filterClass)的過濾
@OK:請求成功后返回給客戶端的數(shù)據(jù)類型
-
DESDecryptFilter過濾器:
- 客戶端發(fā)送的param參數(shù)是一個(gè)用密鑰加密后的參數(shù)
- 通過DESCoder解密后才能得到請求的參數(shù)
-
InvokeTimeFilter過濾器:
- 計(jì)算方法從執(zhí)行到完畢的時(shí)間,打印日志
-
8. Web主模塊
/**
* web主模塊
*
* @author yaowenhao
* @date 2014年7月12日 下午4:44:02
*/
@Fail("void")
@IocBy(type = GameWebMain.class, args = { "" })
@Modules({ OperateModule.class, SystemModule.class })
public class MainModule {
}
9. @Modules:主模塊
10. @IocBy:指定通過xxx反轉(zhuǎn)注入
- NutDao
- AbsConfig:抽象配置解析類,所有系統(tǒng)的配置解析類都要繼承這個(gè)抽象類
- load()時(shí),注冊NutDao為IocBean
- 子類在setValue()時(shí),通過拼接的表名_小表名,dao從配置數(shù)據(jù)庫中讀取對應(yīng)的表(dao.query(tableName)),將表數(shù)據(jù)轉(zhuǎn)換為List<Record>,然后根據(jù)各個(gè)字段的@Config和對應(yīng)的解析方法,通過反射機(jī)制調(diào)用解析方法解析表字段配置
- AbsConfig:抽象配置解析類,所有系統(tǒng)的配置解析類都要繼承這個(gè)抽象類
- NutIoc
@IocBean:AnnotationIocLoader根據(jù)這個(gè)注解來判斷哪些類應(yīng)該被自己加載
@Inject:AnnotationIocLoader根據(jù)這個(gè)注解來了解類中的字段,具體的注入方式
使用了@IocBean注解標(biāo)注的class類,在服務(wù)器啟動(dòng)時(shí),通過AnnotationIocLoader將其轉(zhuǎn)換為IocBean,放到GameWebContext的全局Ioc容器中
@Inject
Json文件:JsonLoader加載server.js配置文件
- NutAop
- @Aop注解