java面試總結(四)- 框架集錦

**1.Spring

1.1 Spring是什麼?**
Spring是一個輕量級的IoC和AOP容器框架。是爲Java應用程序提供基礎性服務的一套框架,目的是用於簡化企業應用程序的開發,它使得開發者只需要關心業務需求。常見的配置方式有三種:基於XML的配置、基於註解的配置、基於Java的配置。
主要由以下幾個模塊組成:

  • Spring Core:核心類庫,提供IOC服務;
  • Spring Context:提供框架式的Bean訪問方式,以及企業級功能(JNDI、定時任務等);
  • Spring AOP:AOP服務;
  • Spring DAO:對JDBC的抽象,簡化了數據訪問異常的處理;
  • Spring ORM:對現有的ORM框架的支持;
  • Spring Web:提供了基本的面向Web的綜合特性,例如多方文件上傳;
  • Spring MVC:提供面向Web應用的Model-View-Controller實現。

1.2 Spring 的優點?
(1)spring屬於低侵入式設計,代碼的污染極低;
(2)spring的DI機制將對象之間的依賴關係交由框架處理,減低組件的耦合性;
(3)Spring提供了AOP技術,支持將一些通用任務,如安全、事務、日誌、權限等進行集中式管理,從而提供更好的複用。
(4)spring對於主流的應用框架提供了集成支持。
1.3 Spring的AOP理解:

  • OOP面向對象,允許開發者定義縱向的關係,但並適用於定義橫向的關係,導致了大量代碼的重複,而不利於各個模塊的重用。

  • AOP,一般稱爲面向切面,作爲面向對象的一種補充,用於將那些與業務無關,但卻對多個對象產生影響的公共行爲和邏輯,抽取並封裝爲一個可重用的模塊,這個模塊被命名爲“切面”(Aspect),減少系統中的重複代碼,降低了模塊間的耦合度,同時提高了系統的可維護性。可用於權限認證、日誌、事務處理。

1.4 Spring的IoC理解:

(1)IOC就是控制反轉,是指創建對象的控制權的轉移,以前創建對象的主動權和時機是由自己把控的,而現在這種權力轉移到Spring容器中,並由容器根據配置文件去創建實例和管理各個實例之間的依賴關係,對象與對象之間鬆散耦合,也利於功能的複用。DI依賴注入,和控制反轉是同一個概念的不同角度的描述,即 應用程序在運行時依賴IoC容器來動態注入對象需要的外部資源。

(2)最直觀的表達就是,IOC讓對象的創建不用去new了,可以由spring自動生產,使用java的反射機制,根據配置文件在運行時動態的去創建對象以及管理對象,並調用對象的方法的。

(3)Spring的IOC有三種注入方式 :構造器注入、setter方法注入、根據註解注入。
1.5 Spring 框架中都用到了哪些設計模式?
(1)工廠模式:BeanFactory就是簡單工廠模式的體現,用來創建對象的實例;
(2)單例模式:Bean默認爲單例模式。
(3)代理模式:Spring的AOP功能用到了JDK的動態代理和CGLIB字節碼生成技術;
(4)模板方法:用來解決代碼重複的問題。比如. RestTemplate, JmsTemplate, JpaTemplate。
(5)觀察者模式:定義對象鍵一種一對多的依賴關係,當一個對象的狀態發生改變時,所有依賴於它的對象都會得到通知被制動更新,如Spring中listener的實現–ApplicationListener。
1.6 Spring如何處理線程併發問題?

在一般情況下,只有無狀態的Bean纔可以在多線程環境下共享,在Spring中,絕大部分Bean都可以聲明爲singleton作用域,因爲Spring對一些Bean中非線程安全狀態採用ThreadLocal進行處理,解決線程安全問題。

ThreadLocal和線程同步機制都是爲了解決多線程中相同變量的訪問衝突問題。同步機制採用了“時間換空間”的方式,僅提供一份變量,不同的線程在訪問前需要獲取鎖,沒獲得鎖的線程則需要排隊。而ThreadLocal採用了“空間換時間”的方式。

ThreadLocal會爲每一個線程提供一個獨立的變量副本,從而隔離了多個線程對數據的訪問衝突。因爲每一個線程都擁有自己的變量副本,從而也就沒有必要對該變量進行同步了。ThreadLocal提供了線程安全的共享對象,在編寫多線程代碼時,可以把不安全的變量封裝進ThreadLocal。

**2 Springmvc

2.1概述:**
Spring MVC是一個基於Java的實現了MVC設計模式的請求驅動類型的輕量級Web框架,通過把Model,View,Controller分離,將web層進行職責解耦,把複雜的web應用分成邏輯清晰的幾部分,簡化開發,減少出錯,方便組內開發人員之間的配合。Spring web mvc和Struts2都屬於表現層的框架,它是Spring框架的一部分。
2.2 處理流程
在這裏插入圖片描述
工作原理:
1)客戶端發送請求到 DispatcherServlet
2)DispatcherServlet 查詢 handlerMapping 找到處理請求的 Controller
3)Controller 調用業務邏輯後,返回 ModelAndView
4)DispatcherServlet 查詢 ModelAndView,找到指定視圖
5)視圖將結果返回到客戶端
框架結構:
在這裏插入圖片描述
架構流程:
1、用戶發送請求至前端控制器DispatcherServlet
2、DispatcherServlet收到請求調用HandlerMapping處理器映射器。
3、處理器映射器根據請求url找到具體的處理器,生成處理器對象及處理器攔截器(如果有則生成)一併返回給DispatcherServlet。
4、DispatcherServlet通過HandlerAdapter處理器適配器調用處理器
5、執行處理器(Controller,也叫後端控制器)。
6、Controller執行完成返回ModelAndView
7、HandlerAdapter將controller執行結果ModelAndView返回給DispatcherServlet
8、DispatcherServlet將ModelAndView傳給ViewReslover視圖解析器
9、ViewReslover解析後返回具體View
10、DispatcherServlet對View進行渲染視圖(即將模型數據填充至視圖中)。
11、DispatcherServlet響應用戶

2.3 Springmvc的優點:
(1)可以支持各種視圖技術,而不僅僅侷限於JSP;
(2)與Spring框架集成(如IoC容器、AOP等);
(3)清晰的角色分配:前端控制器(dispatcherServlet) , 請求到處理器映射(handlerMapping), 處理器適配器(HandlerAdapter), 視圖解析器(ViewResolver)。
(4) 支持各種請求資源的映射策略。

2.4 六個主要組件:

(1)前端控制器 DispatcherServlet(不需要程序員開發)
作用:接收請求、響應結果 相當於轉發器,有了DispatcherServlet 就減少了其它組件之間的耦合度。
(2)處理器映射器HandlerMapping(不需要程序員開發)
作用:根據請求的URL來查找Handler
(3)處理器適配器HandlerAdapter
注意:在編寫Handler的時候要按照HandlerAdapter要求的規則去編寫,這樣適配器HandlerAdapter纔可以正確的去執行Handler。
(4)處理器Handler(需要程序員開發)
(5)視圖解析器 ViewResolver(不需要程序員開發)
作用:進行視圖的解析 根據視圖邏輯名解析成真正的視圖(view)
(6)視圖View(需要程序員開發jsp)
View是一個接口, 它的實現類支持不同的視圖類型(jsp,freemarker,pdf等等)
2.5 springmvc與Struts2的區別:
1、springmvc的入口是一個servlet即前端控制器,而struts2入口是一個filter過濾器。
2、springmvc是基於方法開發(一個url對應一個方法),請求參數傳遞到方法的形參,可以設計爲單例或多例(建議單例),struts2是基於類開發,傳遞參數是通過類的屬性,只能設計爲多例。
3、Struts採用值棧存儲請求和響應的數據,通過OGNL存取數據, springmvc通過參數解析器是將request請求內容解析,並給方法形參賦值,將數據和視圖封裝成ModelAndView對象,最後又將ModelAndView中的模型數據通過request域傳輸到頁面。Jsp視圖解析器默認使用jstl。
2.6 SpringMvc 的控制器是不是單例模式,如果是,有什麼問題,怎麼解決?
答:是單例模式,所以在多線程訪問的時候有線程安全問題,不要用同步,會影響性能的,解方案是在控制器裏面不能寫字段。
2.7 SpringMvc 怎麼和 AJAX 相互調用的?
答:通過 Jackson 框架就可以把 Java 裏面的對象直接轉化成 Js 可以識別的 Json 對象具體步驟如下 :
1)加入 Jackson.jar
2)在配置文件中配置 json 的映射
3)在接受 Ajax 方法裏面可以直接返回 Object,List 等,但方法前面要加上@ResponseB註解。

**3 Mybatis

3.1什麼是Mybatis?**
(1)Mybatis是一個半ORM(對象關係映射)框架,它內部封裝了JDBC,開發時只需要關注SQL語句本身,不需要花費精力去處理加載驅動、創建連接、創建statement等繁雜的過程。程序員直接編寫原生態sql,可以嚴格控制sql執行性能,靈活度高。
(2)MyBatis 可以使用 XML 或註解來配置和映射原生信息,將 POJO映射成數據庫中的記錄,避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。
(3)通過xml 文件或註解的方式將要執行的各種 statement 配置起來,並通過java對象和 statement中sql的動態參數進行映射生成最終執行的sql語句,最後由mybatis框架執行sql並將結果映射爲java對象並返回。(從執行sql到返回result的過程)。
3.2、Mybaits的優點:
(1)基於SQL語句編程,相當靈活,不會對應用程序或者數據庫的現有設計造成任何影響,SQL寫在XML裏,解除sql與程序代碼的耦合,便於統一管理;提供XML標籤,支持編寫動態SQL語句,並可重用。
(2)與JDBC相比,減少了50%以上的代碼量,消除了JDBC大量冗餘的代碼,不需要手動開關連接;
(3)很好的與各種數據庫兼容(因爲MyBatis使用JDBC來連接數據庫,所以只要JDBC支持的數據庫MyBatis都支持)。
(4)能夠與Spring很好的集成;

(5)提供映射標籤,支持對象與數據庫的ORM字段關係映射;提供對象關係映射標籤,支持對象關係組件維護。
3.3、MyBatis框架的缺點:
(1)SQL語句的編寫工作量較大,尤其當字段多、關聯表多時,對開發人員編寫SQL語句的功底有一定要求。
(2)SQL語句依賴於數據庫,導致數據庫移植性差,不能隨意更換數據庫。
3.4、MyBatis框架適用場合:
(1)MyBatis專注於SQL本身,是一個足夠靈活的DAO層解決方案。
(2)對性能的要求很高,或者需求變化較多的項目,如互聯網項目,MyBatis將是不錯的選擇。
3.5、MyBatis與Hibernate有哪些不同?
(1)Mybatis和hibernate不同,它不完全是一個ORM框架,因爲MyBatis需要程序員自己編寫Sql語句。
(2)Mybatis直接編寫原生態sql,可以嚴格控制sql執行性能,靈活度高,非常適合對關係數據模型要求不高的軟件開發,因爲這類軟件需求變化頻繁,一但需求變化要求迅速輸出成果。但是靈活的前提是mybatis無法做到數據庫無關性,如果需要實現支持多種數據庫的軟件,則需要自定義多套sql映射文件,工作量大。
(3)Hibernate對象/關係映射能力強,數據庫無關性好,對於關係模型要求高的軟件,如果用hibernate開發可以節省很多代碼,提高效率。
**3.6、#{}和KaTeX parse error: Expected 'EOF', got '#' at position 13: {}的區別是什麼?** #̲{}是預編譯處理,{}是字符串替換。
Mybatis在處理#{}時,會將sql中的#{}替換爲?號,調用PreparedStatement的set方法來賦值;
Mybatis在處理{}時,就是把{}替換成變量的值。
使用#{}可以有效的防止SQL注入,提高系統安全性。
3.7、Mybatis是如何進行分頁的?分頁插件的原理是什麼?
Mybatis使用RowBounds對象進行分頁,它是針對ResultSet結果集執行的內存分頁,而非物理分頁。可以在sql內直接書寫帶有物理分頁的參數來完成物理分頁功能,也可以使用分頁插件來完成物理分頁。
分頁插件的基本原理是使用Mybatis提供的插件接口,實現自定義插件,在插件的攔截方法內攔截待執行的sql,然後重寫sql,根據dialect方言,添加對應的物理分頁語句和物理分頁參數。
3.8、Mybatis是如何將sql執行結果封裝爲目標對象並返回的?都有哪些映射形式?
第一種是使用標籤,逐一定義數據庫列名和對象屬性名之間的映射關係。
第二種是使用sql列的別名功能,將列的別名書寫爲對象屬性名。
有了列名與屬性名的映射關係後,Mybatis通過反射創建對象,同時使用反射給對象的屬性逐一賦值並返回,那些找不到映射關係的屬性,是無法完成賦值的。
3.9、Mybatis動態sql有什麼用?執行原理?有哪些動態sql?
Mybatis動態sql可以在Xml映射文件內,以標籤的形式編寫動態sql,執行原理是根據表達式的值 完成邏輯判斷並動態拼接sql的功能。
Mybatis提供了9種動態sql標籤:trim | where | set | foreach | if | choose | when | otherwise | bind。
3.10 Xml映射文件中,除了常見的select|insert|updae|delete標籤之外,還有哪些標籤?
答:、、、、,加上動態sql的9個標籤,其中爲sql片段標籤,通過標籤引入sql片段,爲不支持自增的主鍵生成策略標籤。
3.11、Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重複?
不同的Xml映射文件,如果配置了namespace,那麼id可以重複;如果沒有配置namespace,那麼id不能重複;原因就是namespace+id是作爲Map<String, MapperStatement>的key使用的,如果沒有namespace,就剩下id,那麼,id重複會導致數據互相覆蓋。有了namespace,自然id就可以重複,namespace不同,namespace+id自然也就不同。
3.12、爲什麼說Mybatis是半自動ORM映射工具?它與全自動的區別在哪裏?
Hibernate屬於全自動ORM映射工具,使用Hibernate查詢關聯對象或者關聯集合對象時,可以根據對象關係模型直接獲取,所以它是全自動的。而Mybatis在查詢關聯對象或關聯集合對象時,需要手動編寫sql來完成,所以,稱之爲半自動ORM映射工具。
3.13、使用MyBatis的mapper接口調用時有哪些要求?
① Mapper接口方法名和mapper.xml中定義的每個sql的id相同;
② Mapper接口方法的輸入參數類型和mapper.xml中定義的每個sql 的parameterType的類型相同;
③ Mapper接口方法的輸出參數類型和mapper.xml中定義的每個sql的resultType的類型相同;
④ Mapper.xml文件中的namespace即是mapper接口的類路徑。

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