2020年去一線大廠面試先過SSM框架源碼這一關!

SSM框架介紹

(1)持久層(Mybatis):Dao層(mapper)

DAO層:DAO層主要是做數據持久層的工作,負責與數據庫進行聯絡的一些任務都封裝在此。

DAO層的設計首先是設計DAO的接口。

然後在Spring的配置文件中定義此接口的實現類。

然後就可在模塊中調用此接口來進行數據業務的處理,而不用關心此接口的具體實現類是哪個類,顯得結構非常清晰。

DAO層的數據源配置,以及有關數據庫連接的參數都在Spring的配置文件中進行配置。

(2)業務層(Spring):Service層

Service層:Service層主要負責業務模塊的邏輯應用設計。

首先設計接口,再設計其實現的類。

接着再在Spring的配置文件中配置其實現的關聯。這樣我們就可以在應用中調用Service接口來進行業務處理。

Service層的業務實現,具體要調用到已定義的DAO層的接口。

封裝Service層的業務邏輯有利於通用的業務邏輯的獨立性和重複利用性,程序顯得非常簡潔。

(3)表現層(springMVC):Controller層(Handler層)

Controller層:Controller層負責具體的業務模塊流程的控制。

在此層裏面要調用Service層的接口來控制業務流程。

控制的配置也同樣是在Spring的配置文件裏面進行,針對具體的業務流程,會有不同的控制器,我們具體的設計過程中可以將流程進行抽象歸納,設計出可以重複利用的子單元流程模塊,這樣不僅使程序結構變得清晰,也大大減少了代碼量。

(4)視圖層:View層

View層:View層與控制層結合比較緊密,需要二者結合起來協同工發。View層主要負責前臺jsp頁面的表示。

v2-87ab43d59ef4547c336eb199b8b13420_hd.png

關於框架源碼的大體知識總結了一個思維導圖分享給大家

v2-0357aaa7e2730e6fa29ee6e11850aaf8_hd.jpeg


SSM框架面試題

1、如何理解Spring?

2、介紹一下Spring的事物管理

3 、SSM優缺點、使用場景?

4、MyBatis 中使用#和$書寫佔位符有什麼區別?

5、解釋一下 MyBatis 中命名空間(namespace)的作用。

6、什麼是 IoC 和 DI?DI 是如何實現的?

7、解釋一下什麼叫 AOP(面向切面編程)?

8、你是如何理解"橫切關注"這個概念的?

9、你如何理解 AOP 中的連接點(Joinpoint)、切點(Pointcut)、增強(Advice)、引介(Introduction)、織入(Weaving)、切面(Aspect)這些概念?

10、Spring 支持的事務管理類型有哪些?你在項目中使用哪種方式?

11、Spring MVC的工作原理是怎樣的?

12、什麼是 XSS 攻ji?

13、SQL 注入攻ji?

14、什麼是CSRF攻ji?

15、簡述Mybatis一級、二級緩存

16、JDBC編程有哪些不足之處,MyBatis是如何解決這些問題的?

v2-a02745aa6c968d7f91361093a283fba1_hd.png


SSM框架面試題解析

1、如何理解Spring?

具體來說Spring是一個輕量級的容器,用於管理業務相關對象的。核心功能主要爲:IOC,AOP,MVC。

IOC:控制反轉,將對象的創建過程交給容器,讓容器管理對象的生命週期如創建,初始化,銷燬等。

AOP:面向切面編程,對關注點進行模塊化,通過對某一功能點進行編程,比如記錄日誌,有很多個類都需要記錄日誌的方法,則創建記錄日誌的代理方法,需要調用該功能是只需要調用代理方法,這就是AOP。

MVC:SpringMvc,Spring提供的基於MVC模式設計的Web框架,如今比較流行的框架之一。

2、介紹一下Spring的事物管理

事務就是對一系列的數據庫操作(比如插入多條數據)進行統一的提交或回滾操作,如果插入成功,那麼一起成功,如果中間有一條出現異常,那麼回滾之前的所有操作。這樣可以防止出現髒數據,防止數據庫數據出現問題。

開發中爲了避免這種情況一般都會進行事務管理。Spring中也有自己的事務管理機制,一般是使用TransactionMananger進行管 理,可以通過Spring的注入來完成此功能。

Spring支持如下兩種方式的事務管理:

編程式事務管理:這意味着你可以通過編程的方式管理事務,這種方式帶來了很大的靈活性,但很難維護。

聲明式事務管理:這種方式意味着你可以將事務管理和業務代碼分離。你只需要通過註解或者XML配置管理事務。

一般選擇聲明式事務管理,因爲這種方式和應用程序的關聯較少。

3 、SSM優缺點、使用場景?

(1)Mybatis和hibernate不同,它不完全是一個ORM框架,因爲MyBatis需要程序員自己編寫Sql語句,不過mybatis可以通過XML或註解方式靈活配置要運行的sql語句,並將java對象和sql語句映射生成最終執行的sql,最後將sql執行的結果再映射生成java對象。

(2)Mybatis學習門檻低,簡單易學,程序員直接編寫原生態sql,可嚴格控制sql執行性能,靈活度高,非常適合對關係數據模型要求不高的軟件開發,例如互聯網軟件、企業運營類軟件等,因爲這類軟件需求變化頻繁,一但需求變化要求成果輸出迅速。但是靈活的前提是mybatis無法做到數據庫無關性,如果需要實現支持多種數據庫的軟件則需要自定義多套sql映射文件,工作量大。

(3)Hibernate對象/關係映射能力強,數據庫無關性好,對於關係模型要求高的軟件(例如需求固定的定製化軟件)如果用hibernate開發可以節省很多代碼,提高效率。但是Hibernate的學習門檻高,要精通門檻更高,而且怎麼設計O/R映射,在性能和對象模型之間如何權衡,以及怎樣用好Hibernate需要具有很強的經驗和能力才行。

(4)總之,按照用戶的需求在有限的資源環境下只要能做出維護性、擴展性良好的軟件架構都是好架構,所以框架只有適合纔是最好。

4、MyBatis 中使用#和$書寫佔位符有什麼區別?

答:#將傳入的數據都當成一個字符串,會對傳入的數據自動加上引號;$將傳入的數據直接顯示生成在SQL 中。

注意:使用$佔位符可能會導致 SQL 注射攻ji,能用#的地方就不要使用$,寫 order by 子句的時候應該用$而不是#。

5、解釋一下 MyBatis 中命名空間(namespace)的作用。

答:在大型項目中,可能存在大量的 SQL 語句,這時候爲每個 SQL 語句起一個唯一的標識(ID)就變得並不容易了。爲了解決這個問題,在 MyBatis 中,可以爲每個映射文件起一個唯一的命名空間,這樣定義在這個映射文件中的每個 SQL 語句就成了定義在這個命名空間中的一個 ID。只要我們能夠保證每個命名空間中這個 ID 是唯一的,即使在不同映射文件中的語句 ID 相同,也不會再產生衝突了。

6、什麼是 IoC 和 DI?DI 是如何實現的?

答:IoC 叫控制反轉,是 Inversion of Control 的縮寫,DI(Dependency Injection)叫依賴注入,是對 IoC 更簡單的詮釋。控制反轉是把傳統上由程序代碼直接操控的對象的調用權交給容器,通過容器來實現對象組件的裝配和管理。所謂的"控制反轉"就是對組件對象控制權的轉移,從程序代碼本身轉移到了外部容器,由容器來創建對象並管理對象之間的依賴關係。IoC 體現了好萊塢原則 -"Don’tcallme,we willcallyou"。依賴注入的基本原則是應用組件不應該負責查找資源或者其他依賴的協作對象。配置對象的工作應該由容器負責,查找資源的邏輯應該從應用組件的代碼中抽取出來,交給容器來完成。DI 是對 IoC 更準確的描述,即組件之間的依賴關係由容器在運行期決定,形象的來說,即由容器動態的將某種依賴關係注入到組件之中。

7、解釋一下什麼叫 AOP(面向切面編程)?

答:AOP(Aspect-Oriented Programming)指一種程序設計範型,該範型以一種稱爲切面(aspect)的語言構造爲基礎,切面是一種新的模塊化機制,用來描述分散在對象、類或方法中的橫切關注點(crosscutting concern)。

8、你是如何理解"橫切關注"這個概念的?

答:"橫切關注"是會影響到整個應用程序的關注功能,它跟正常的業務邏輯是正交的,沒有必然的聯繫,但是幾乎所有的業務邏輯都會涉及到這些關注功能。通常,事務、日誌、安全性等關注就是應用中的橫切關注功能。

9、你如何理解 AOP 中的連接點(Joinpoint)、切點(Pointcut)、增強(Advice)、引介(Introduction)、織入(Weaving)、切面(Aspect)這些概念?

答:a. 連接點(Joinpoint):程序執行的某個特定位置(如:某個方法調用前、調用後,方法拋出異常後)。一個類或一段程序代碼擁有一些具有邊界性質的特定點,這些代碼中的特定點就是連接點。Spring 僅支持方法的連接點。

b. 切點(Pointcut):如果連接點相當於數據中的記錄,那麼切點相當於查詢條件,一個切點可以匹配多個連接點。Spring AOP 的規則解析引擎負責解析切點所設定的查詢條件,找到對應的連接點。

c. 增強(Advice):增強是織入到目標類連接點上的一段程序代碼。Spring 提供的增強接口都是帶方位名的,如:BeforeAdvice、AfterReturningAdvice、ThrowsAdvice 等。很多資料上將增強譯爲“通知”,這明顯是個詞不達意的翻譯,讓很多程序員困惑了許久。

說明: Advice 在國內的很多書面資料中都被翻譯成"通知",但是很顯然這個翻譯無法表達其本質,有少量的讀物上將這個詞翻譯爲"增強",這個翻譯是對 Advice 較爲準確的詮釋,我們通過 AOP 將橫切關注功能加到原有的業務邏輯上,這就是對原有業務邏輯的一種增強,這種增強可以是前置增強、後置增 強、返回後增強、拋異常時增強和包圍型增強。

d. 引介(Introduction):引介是一種特殊的增強,它爲類添加一些屬性和方法。這樣,即使一個業務類原本沒有實現某個接口,通過引介功能,可以動態的未該業務類添加接口的實現邏輯,讓業務類成爲 這個接口的實現類。

e. 織入(Weaving):織入是將增強添加到目標類具體連接點上的過程,AOP 有三種織入方式:

①編譯期織入:需要特殊的 Java 編譯期(例如 AspectJ 的 ajc);

②裝載期織入:要求使用特殊的類加載器, 在裝載類的時候對類進行增強;

③運行時織入:在運行時爲目標類生成代理實現增強。Spring 採用了動 態代理的方式實現了運行時織入,而 AspectJ 採用了編譯期織入和裝載期織入的方式。

f. 切面(Aspect):切面是由切點和增強(引介)組成的,它包括了對橫切關注功能的定義,也包括了對連接點的定義。

10、Spring 支持的事務管理類型有哪些?你在項目中使用哪種方式?

答:Spring 支持編程式事務管理和聲明式事務管理。許多 Spring 框架的用戶選擇聲明式事務管理,因爲這種方式和應用程序的關聯較少,因此更加符合輕量級容器的概念。聲明式事務管理要優於編程式事務管理,儘管在靈活性方面它弱於編程式事務管理,因爲編程式事務允許你通過代碼控制業務。

11、Spring MVC的工作原理是怎樣的?

答:SpringMVC工作原理圖如下:

v2-31f07efcbb649f1a6f85aae02f3c5c14_hd.jpg


(1)客戶端的所有請求都交給前端控制器 DispatcherServlet 來處理,它會負責調用系統的其他模塊來真正處理用戶的請求。

(2) DispatcherServlet 收到請求後,將根據請求的信息(包括 URL、HTTP 協議方法、請求頭、請求參數、Cookie 等)以及 HandlerMapping 的配置找到處理該請求的 Handler(任何一個對象都可以作爲請求的 Handler)。

(3)在這個地方 Spring 會通過 HandlerAdapter 對該處理器進行封裝。

(4)HandlerAdapter 是一個適配器,它用統一的接口對各種 Handler 中的方法進行調用。

(5)Handler 完成對用戶請求的處理後,會返回一個 ModelAndView 對象給 DispatcherServlet,ModelAndView 顧名思義,包含了數據模型以及相應的視圖的信息。

(6) ModelAndView 的視圖是邏輯視圖,DispatcherServlet 還要藉助 ViewResolver 完成從邏輯視圖到真實視圖對象的解析工作。

(7)當得到真正的視圖對象後,DispatcherServlet 會利用視圖對象對模型數據進行渲染。

(8)客戶端得到響應,可能是一個普通的 HTML 頁面,也可以是 XML 或 JSON 字符串,還可以是一張圖片或者一個 PDF 文件。

12、什麼是 XSS 攻ji?

答: XSS(Cross Site Script,跨站腳本攻ji)是向網頁中注入惡意腳本在用戶瀏覽網頁時在用戶瀏覽器中執行惡意腳本的攻ji方式。跨站腳本攻ji分有兩種形式:反射型攻ji(誘使用戶點擊一個嵌入惡意 腳本的鏈接以達到攻ji的目標,目前有很多攻ji者利用論壇、微博發佈含有惡意腳本的 URL 就屬於這種方式)和持久型攻ji(將惡意腳本提交到被攻ji網站的數據庫中,用戶瀏覽網頁時,惡意腳本從數據 庫中被加載到頁面執行,QQ 郵箱的早期版本就曾經被利用作爲持久型跨站腳本攻ji的平臺)。XSS 雖然不是什麼新鮮玩意,但是攻ji的手法卻不斷翻新,防範 XSS 主要有兩方面:消毒(對危險字符進行轉義)和HttpOnly (防範 XSS 攻ji者竊取 Cookie 數據)。

13、SQL 注入攻ji?

答: SQL 注入攻ji是注入攻ji最常見的形式(此外還有 OS 注入攻ji(Struts 2 的高危漏洞就是通過OGNL 實施 OS 注入攻ji導致的)),當服務器使用請求參數構造 SQL 語句時,惡意的 SQL 被嵌入到SQL 中交給數據庫執行。SQL 注入攻ji需要攻ji者對數據庫結構有所瞭解才能進行,攻ji者想要獲得表結構有多種方式:

(1)如果使用開源系統搭建網站,數據庫結構也是公開的(目前有很多現成的系統可以直接搭建論壇,電商網站,雖然方便快 捷但是風險是必須要認真評估的);

(2)錯誤回顯(如果將服務器的錯誤信息直接顯示在頁面上,攻ji者可以通過非法參數引發頁面錯誤從而通過錯誤信息瞭解數據庫結構,Web應用應當設置友好的錯誤頁,一方面符合最小驚訝原則,一方面屏蔽掉可能給系統帶來危險的錯誤回顯信息);

(3)盲注。防範 SQL 注入攻ji也可以採用消毒的方式,通過正則表達式對請求參數進行驗證,此外,參數綁定也是很好的手段,這樣惡意的 SQL 會被當做 SQL 的參數而不是命令被執行,JDBC 中的 PreparedStatement 就是支持參數綁定的語句對象,從性能和安全性上都明顯優於 Statement。

14、什麼是CSRF攻ji?

答: CSRF 攻ji(Cross Site Request Forgery,跨站請求僞造)是攻ji者通過跨站請求,以合法的用戶身份進行非法操作(如轉賬或發帖等)。CSRF 的原理是利用瀏覽器的 Cookie 或服務器的Session,盜取用戶身份,其原理如下圖所示。防範 CSRF 的主要手段是識別請求者的身份,主要有以下幾種方式:

(1) 在表單中添加令牌(token);

(2) 驗證碼;

(3) 檢查請求頭中的 Referer。

令牌和驗證都具有一次消費性的特徵,因此在原理上一致的,但是驗證碼是一種糟糕的用戶體驗,不是必要的情況下不要輕易使用驗證碼,目前很多網站的做法是如果在短時間內多次提交一個表單未獲得成功後纔要求提供驗證碼,這樣會獲得較好的用戶體驗。

v2-9ab025f2ff4dc0620ecd19f20b573f00_hd.png

15簡述Mybatis一級、二級緩存

1)一級緩存: 基於 PerpetualCache 的 HashMap 本地緩存,其存儲作用域爲 Session,當 Session flush 或 close 之後,該 Session 中的所有 Cache 就將清空。

2)二級緩存與一級緩存其機制相同,默認也是採用 PerpetualCache,HashMap 存儲,不同在於其存儲作用域爲 Mapper(Namespace),並且可自定義存儲源,如 Ehcache。要開啓二級緩存,你需要在你的 SQL 映射文件中添加一行:

3)對於緩存數據更新機制,當某一個作用域(一級緩存 Session/二級緩存Namespaces)的進行了C/U/D 操作後,默認該作用域下所有 select 中的緩存將被 clear。

16、JDBC編程有哪些不足之處,MyBatis是如何解決這些問題的?

(1)數據庫鏈接創建、釋放頻繁造成系統資源浪費從而影響系統性能,如果使用數據庫鏈接池可解決此問題。

解決:在SqlMapConfig.xml中配置數據鏈接池,使用連接池管理數據庫鏈接。

(2) Sql語句寫在代碼中造成代碼不易維護,實際應用sql變化的可能較大,sql變動需要改變java代碼。

解決:將Sql語句配置在XXXXmapper.xml文件中與java代碼分離。

(3) 向sql語句傳參數麻煩,因爲sql語句的where條件不一定,可能多也可能少,佔位符需要和參數一一對應。

解決: Mybatis自動將java對象映射至sql語句。

(4)對結果集解析麻煩,sql變化導致解析代碼變化,且解析前需要遍歷,如果能將數據庫記錄封裝成pojo對象解析比較方便。

解決:Mybatis自動將sql執行結果映射至java對象。

另外的參考回答

頻繁的創建數據連接,關閉資源,造成性能的下降,使用數據文庫連接池 解決這個問題用數據庫連接池.在SqlMapConfig.xml 配置數據庫連接池 c3p0 DBCP

Jdbc 編程sql 的可維護性不高. Mybatis採用配置文件的方式解決sql可維護的問題

在mapper.xml中配置 ,是sql與代碼分離 可維護行變高

Jdbc 傳入參數比較麻煩. 參數有時候多,參數要和佔位符一一對應.

Mybatis 使用statement 的 paremterType 定義輸入的參數類型

對結果解析比較麻煩. Mybatis 使用resultType 自動映射到pojo中解決了jdbc解析結果的麻煩

歡迎大家關注我的公種浩【程序員追風】,2019年多家公司java面試題整理了120多頁pdf文檔,文章都會在裏面更新,整理的資料也會放在裏面。

v2-37e1fed1005074684eeea8c104d15970_hd.png

最後

歡迎大家一起交流,喜歡文章記得關注我點個贊喲,感謝支持!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章