2021年Java之Spring+MyBatis面試題
Java基礎(必學)
為初學者而著!
Spring面試題
1、Spring怎樣定義類的作用域
通過bean 定義中的scope屬性來定義。
2、Spring支援的幾種bean的作用域
支援以下五種bean的作用域:
singleton :
bean在每個Spring ioc 容器中只有一個例項。(預設預設)prototype:一個bean的定義可以有多個例項。
request:每次http請求都會建立一個bean,該作用域僅在基於web的Spring ApplicationContext情形下有效。
session:在一個HTTP Session中,一個bean定義對應一個例項。該作用域僅在基於web的Spring ApplicationContext情形下有效。
global-session:在一個全域性的HTTP Session中,一個bean定義對應一個例項。該作用域僅在基於web的Spring ApplicationContext情形下有效。
3、Spring支援的事務管理型別
程式設計式事務管理:這意味你通過程式設計的方式管理事務,給你帶來極大的靈活性,但是難維護。
宣告式事務管理:這意味著你可以將業務程式碼和事務管理分離,你只需用註解和XML配置來管理事務。
4、什麼是控制反轉(IOC)?什麼是依賴注入?
控制反轉(IOC) : 傳統應用程式是由我們自己在物件中主動控制去直接獲取依賴物件,現在由容器幫我們查詢及注入依賴物件,物件只是被動的接受依賴物件,所以是控制反轉。
依賴注入:元件之間依賴關係由容器在執行期決定,形象的說,即由容器動態的將某個依賴關係注入到元件之中。通過依賴注入機制,我們只需要通過簡單的配置,而無需任何程式碼就可指定目標需要的資源,完成自身的業務邏輯,而不需要關心具體的資源來自何處,由誰實現。
實現方式:構造器注入、Setter方法注入、介面注入。註解裝配在預設情況下是不開啟的,為了使用註解裝配,我們必須在Spring配置檔案中配置 <context:annotation-config/>元素。
5、Spring由幾大核心元件?
a、Bean 元件
b、Context 元件
c、Core 元件
6、Spring MVC核心工作流程 ?
a、使用者向伺服器傳送request請求,請求被SpringMVC中央控制器DispatcherServlet捕獲;
b、DispatcherServlet對請求URL進行解析,得到請求資源識別符號(URI)。然後根據該URI,呼叫HandlerMapping對映處理器,將請求傳送給指定的Controller。
c、 Controller執行完成後,將返回的資料資訊封裝到ModelAndView物件中,最後通過ViewResolver檢視解析器選擇一個合適的View 渲染檢視返回介面。
7、spring事務隔離級別(五種面試最好全部說出來)
a、DEFAULT 這是一個PlatfromTransactionManager預設的隔離級別,使用資料庫預設的事務隔離級別.
b、未提交讀(read uncommited) : 髒讀,不可重複讀,虛讀都有可能發生 。是最低的事務隔離級別,它允許另外一個事務可以看到這個事務未提交的資料。
c、已提交讀 (read commited): 避免髒讀。但是不可重複讀、虛讀有可能發生 。保證一個事物提交後才能被另外一個事務讀取。另外一個事務不能讀取該事物未提交的資料。Oracle 預設
d、可重複讀 (repeatable read): 這種事務隔離級別可以防止髒讀,不可重複讀。但是可能會出現幻象讀。它除了保證一個事務不能被另外一個事務讀取未提交的資料之外還避免了以下情況產生(不可重複讀)。Mysql 預設
e、序列化的 (serializable) : 這是花費最高代價、效率差但最可靠的事務隔離級別。事務被處理為順序執行。除了防止髒讀,不可重複讀之外,還避免了幻象讀(避免三種)。
8、Spring事務特性(四種面試最好全部說出來)
a、原子性 (atomicity): 一個事務中所有對資料庫的操作是一個不可分割的操作序列,要麼全做要麼全不做。
b、一致性 (consistency): 事務的執行的前後資料的完整性保持一致.
c、隔離性 (isolation): 一個事務執行的過程中,不應該受到其他事務的干擾
d、永續性(durability) : 一個事物一旦提交,它對資料庫的改變就是永久的
9、Spring事務七個傳播特性(七種面試說一兩個即可)
a、Propagation.REQUIRED (預設) 面試必須說出來這個。
呼叫方已經存在事務,則加入到同一個事務中執行,否則,自啟一個事務
b、Propagation.REQUIRES_NEW
無論何時自身都會開啟新事務
c、Propagation.SUPPORTS
呼叫方存在事務,則加入到同一個事務中執行,若不存在事務,則以非事務的方式執行
d、Propagation.NOT_SUPPORTED
呼叫方存在事務,則會被掛起,直到被呼叫方執行完畢後,事務恢復。
e、Propagation.MANDATORY
呼叫方存在事務,則加入到同一個事務中執行,若不存在,則丟擲異常
f、Propagation.NEVER
呼叫方存在事務,則丟擲異常
g、Propagation.NESTED
若呼叫方存在事務,則執行一個巢狀事務,若呼叫方不存在事務,則以Propagation.REQUIRED的方式執行,即開啟一個新的事務
10、簡述Spring Bean的生命週期
例項化、初始化、使用、銷燬。
關鍵詞:BeanFactoryPostProcessor 、BeanPostProcessor 、init-method/destroy-method
MyBatis面試題
1、#{}和${}的區別是什麼?
#{}是預編譯處理,${}是字串替換。
Mybatis在處理#{}時,會將sql中的#{}替換為?號,呼叫PreparedStatement的set方法來賦值;
Mybatis在處理${}時,就是把${}替換成變數的值。
使用#{}可以有效的防止SQL注入,提高系統安全性。
2、通常一個Xml對映檔案,都會寫一個Dao介面與之對應,請問,這個Dao介面的工作原理是什麼?Dao接口裡的方法,引數不同時,方法能過載嗎?
Dao介面,就是人們常說的Mapper介面,介面的全限名,就是對映檔案中的namespace的值,介面的方法名,就是對映檔案中MappedStatement的id值,介面方法內的引數,就是傳遞給sql的引數。Mapper介面是沒有實現類的,當呼叫介面方法時,介面全限名+方法名拼接字串作為key值,可唯一定位一個MappedStatement,舉例:com.mybatis3.mappers.StudentDao.findStudentById,可以唯一找到namespace為com.mybatis3.mappers.StudentDao下面id = findStudentById的MappedStatement。在Mybatis中,每一個<select>、<insert>、<update>、<delete>標籤,都會被解析為一個MappedStatement物件。
Dao接口裡的方法,是不能過載的,因為是全限名+方法名的儲存和尋找策略。
Dao介面的工作原理是JDK動態代理,Mybatis執行時會使用JDK動態代理為Dao介面生成代理proxy物件,代理物件proxy會攔截介面方法,轉而執行MappedStatement所代表的sql,然後將sql執行結果返回。
3、Mybatis是如何進行分頁的?分頁外掛的原理是什麼?
Mybatis使用RowBounds物件進行分頁,它是針對ResultSet結果集執行的記憶體分頁,而非物理分頁,可以在sql內直接書寫帶有物理分頁的引數來完成物理分頁功能,也可以使用分頁外掛來完成物理分頁。
分頁外掛的基本原理是使用Mybatis提供的外掛介面,實現自定義外掛,在外掛的攔截方法內攔截待執行的sql,然後重寫sql,根據dialect方言,新增對應的物理分頁語句和物理分頁引數。
4、Mybatis是如何將sql執行結果封裝為目標物件並返回的?都有哪些對映形式?
第一種是使用<resultMap>標籤,逐一定義列名和物件屬性名之間的對映關係。第二種是使用sql列的別名功能,將列別名書寫為物件屬性名,比如T_NAME AS NAME,物件屬性名一般是name,小寫,但是列名不區分大小寫,Mybatis會忽略列名大小寫,智慧找到與之對應物件屬性名,你甚至可以寫成T_NAME AS NaMe,Mybatis一樣可以正常工作。
有了列名與屬性名的對映關係後,Mybatis通過反射建立物件,同時使用反射給物件的屬性逐一賦值並返回,那些找不到對映關係的屬性,是無法完成賦值的。
5、Xml對映檔案中,除了常見的select|insert|update|delete標籤之外,還有哪些標籤?
注:這道題出自京東面試官。
還有很多其他的標籤,加上動態sql的9個標籤,trim|where|set|foreach|if|choose|when|otherwise|bind等,其中為sql片段標籤,通過標籤引入sql片段,為不支援自增的主鍵生成策略標籤。
6、簡述Mybatis的外掛執行原理,以及如何編寫一個外掛
Mybatis僅可以編寫針對ParameterHandler、ResultSetHandler、StatementHandler、Executor這4種介面的外掛,Mybatis使用JDK的動態代理,為需要攔截的介面生成代理物件以實現介面方法攔截功能,每當執行這4種介面物件的方法時,就會進入攔截方法,具體就是InvocationHandler的invoke()方法,當然,只會攔截那些你指定需要攔截的方法。實現Mybatis的Interceptor介面並複寫intercept()方法,然後在給外掛編寫註解,指定要攔截哪一個介面的哪些方法即可,記住,還需要在配置檔案中配置你編寫的外掛。
7、一級、二級快取
1)一級快取: 基於 PerpetualCache 的 HashMap 本地快取,其儲存作用域為 Session,當 Session flush 或 close 之後,該 Session 中的所有 Cache 就將清空。
2)二級快取與一級快取其機制相同,預設也是採用 PerpetualCache,HashMap 儲存,不同在於其儲存作用域為 Mapper(Namespace),並且可自定義儲存源,如 Ehcache。要開啟二級快取,你需要在你的 SQL 對映檔案中新增一行:<cache/>
3)對於快取資料更新機制,當某一個作用域(一級快取 Session/二級快取Namespaces)的進行了C/U/D 操作後,預設該作用域下所有 select 中的快取將被 clear。
8、Mybatis是否支援延遲載入?如果支援,它的實現原理是什麼?
Mybatis僅支援association關聯物件和collection關聯集合物件的延遲載入,association指的就是一對一,collection指的就是一對多查詢。在Mybatis配置檔案中,可以配置是否啟用延遲載入lazyLoadingEnabled=true|false。
它的原理是,使用CGLIB建立目標物件的代理物件,當呼叫目標方法時,進入攔截器方法,比如呼叫a.getB().getName(),攔截器invoke()方法發現a.getB()是null值,那麼就會單獨傳送事先儲存好的查詢關聯B物件的sql,把B查詢上來,然後呼叫a.setB(b),於是a的物件b屬性就有值了,接著完成a.getB().getName()方法的呼叫。這就是延遲載入的基本原理。
9、Mybatis對映檔案中,如果A標籤通過include引用了B標籤的內容,請問,B標籤能否定義在A標籤的後面,還是說必須定義在A標籤的前面?
雖然Mybatis解析Xml對映檔案是按照順序解析的,但是,被引用的B標籤依然可以定義在任何地方,Mybatis都可以正確識別。
原理是,Mybatis解析A標籤,發現A標籤引用了B標籤,但是B標籤尚未解析到,尚不存在,此時,Mybatis會將A標籤標記為未解析狀態,然後繼續解析餘下的標籤,包含B標籤,待所有標籤解析完畢,Mybatis會重新解析那些被標記為未解析的標籤,此時再解析A標籤時,B標籤已經存在,A標籤也就可以正常解析完成了。
10、簡述Mybatis的Xml對映檔案和Mybatis內部資料結構之間的對映關係?
Mybatis將所有Xml配置資訊都封裝到All-In-One重量級物件Configuration內部。在Xml對映檔案中,<parameterMap>標籤會被解析為ParameterMap物件,其每個子元素會被解析為ParameterMapping物件。<resultMap>標籤會被解析為ResultMap物件,其每個子元素會被解析為ResultMapping物件。每一個<select>、<insert>、<update>、<delete>標籤均會被解析為MappedStatement物件,標籤內的sql會被解析為BoundSql物件。