struts、hibernate、spring、 mybatis、 spring boot 等面试题汇总
1、談談你對Struts的理解。
答:
1. struts是一個按MVC模式設計的Web層框架,其實它就是一個大大的servlet,這個Servlet名為ActionServlet,或是ActionServlet的子類。我們可以在web.xml文件中將符合某種特征的所有請求交給這個Servlet處理,這個Servlet再參照一個配置文件(通常為/WEB-INF/struts-config.xml)將各個請求分別分配給不同的action去處理。
一個擴展知識點:struts的配置文件可以有多個,可以按模塊配置各自的配置文件,這樣可以防止配置文件的過度膨脹;
2.ActionServlet把請求交給action去處理之前,會將請求參數封裝成一個formbean對象(就是一個java類,這個類中的每個屬性對應一個請求參數),封裝成一個什么樣的formbean對象呢?看配置文件。
3.要說明的是, ActionServlet把formbean對象傳遞給action的execute方法之前,可能會調用formbean的validate方法進行校驗,只有校驗通過后才將這個formbean對象傳遞給action的execute方法,否則,它將返回一個錯誤頁面,這個錯誤頁面由input屬性指定,(看配置文件)作者為什么將這里命名為input屬性,而不是error屬性,我們后面結合實際的運行效果進行分析。
4.action執行完后要返回顯示的結果視圖,這個結果視圖是用一個ActionForward對象來表示的,actionforward對象通過struts-config.xml配置文件中的配置關聯到某個jsp頁面,因為程序中使用的是在struts-config.xml配置文件為jsp頁面設置的邏輯名,這樣可以實現action程序代碼與返回的jsp頁面名稱的解耦。
?
你對struts可能還有自己的應用方面的經驗,那也要一并說出來。
2、談談你對Hibernate的理解。
答:
1.面向對象設計的軟件內部運行過程可以理解成就是在不斷創建各種新對象、建立對象之間的關系,調用對象的方法來改變各個對象的狀態和對象消亡的過程,不管程序運行的過程和操作怎么樣,本質上都是要得到一個結果,程序上一個時刻和下一個時刻的運行結果的差異就表現在內存中的對象狀態發生了變化。
2.為了在關機和內存空間不夠的狀況下,保持程序的運行狀態,需要將內存中的對象狀態保存到持久化設備和從持久化設備中恢復出對象的狀態,通常都是保存到關系數據庫來保存大量對象信息。從Java程序的運行功能上來講,保存對象狀態的功能相比系統運行的其他功能來說,應該是一個很不起眼的附屬功能,java采用jdbc來實現這個功能,這個不起眼的功能卻要編寫大量的代碼,而做的事情僅僅是保存對象和恢復對象,并且那些大量的jdbc代碼并沒有什么技術含量,基本上是采用一套例行公事的標準代碼模板來編寫,是一種苦活和重復性的工作。
3.通過數據庫保存java程序運行時產生的對象和恢復對象,其實就是實現了java對象與關系數據庫記錄的映射關系,稱為ORM(即Object Relation Mapping),人們可以通過封裝JDBC代碼來實現了這種功能,封裝出來的產品稱之為ORM框架,Hibernate就是其中的一種流行ORM框架。使用Hibernate框架,不用寫JDBC代碼,僅僅是調用一個save方法,就可以將對象保存到關系數據庫中,僅僅是調用一個get方法,就可以從數據庫中加載出一個對象。
4.使用Hibernate的基本流程是:配置Configuration對象、產生SessionFactory、創建session對象,啟動事務,完成CRUD操作,提交事務,關閉session。
5.使用Hibernate時,先要配置hibernate.cfg.xml文件,其中配置數據庫連接信息和方言等,還要為每個實體配置相應的hbm.xml文件,hibernate.cfg.xml文件中需要登記每個hbm.xml文件。
6.在應用Hibernate時,重點要了解Session的緩存原理,級聯,延遲加載和hql查詢。
3、AOP的作用。
4、你對Spring的理解。
1.Spring實現了工廠模式的工廠類(在這里有必要解釋清楚什么是工廠模式),這個類名為BeanFactory(實際上是一個接口),在程序中通常BeanFactory的子類ApplicationContext。Spring相當于一個大的工廠類,在其配置文件中通過<bean>元素配置用于創建實例對象的類名和實例對象的屬性。
2.Spring提供了對IOC良好支持,IOC是一種編程思想,是一種架構藝術,利用這種思想可以很好地實現模塊之間的解耦。IOC也稱為DI(DepencyInjection),什么叫依賴注入呢?
譬如,Class Programmer {
??? Computer computer = null;
??? public void code(){
?????? //Computer computer = new IBMComputer();
?????? //Computer computer = beanfacotry.getComputer();
?????? computer.write();
??? } public void setComputer(Computer computer){
?????? this.computer = computer;
??? }
}
另外兩種方式都由依賴,第一個直接依賴于目標類,第二個把依賴轉移到工廠上,第三個徹底與目標和工廠解耦了。在spring的配置文件中配置片段如下:
<beanid=”computer” class=”cn.itcast.interview.Computer”>
</bean>
?
<beanid=”programmer” class=”cn.itcast.interview.Programmer”>
??? <property name=”computer”? ref=”computer”></property>
</bean>
3.Spring提供了對AOP技術的良好封裝, AOP稱為面向切面編程,就是系統中有很多各不相干的類的方法,在這些眾多方法中要加入某種系統功能的代碼,例如,加入日志,加入權限判斷,加入異常處理,這種應用稱為AOP。實現AOP功能采用的是代理技術,客戶端程序不再調用目標,而調用代理類,代理類與目標類對外具有相同的方法聲明,有兩種方式可以實現相同的方法聲明,一是實現相同的接口,二是作為目標的子類在,JDK中采用Proxy類產生動態代理的方式為某個接口生成實現類,如果要為某個類生成子類,則可以用CGLI B。在生成的代理類的方法中加入系統功能和調用目標類的相應方法,系統功能的代理以Advice對象進行提供,顯然要創建出代理對象,至少需要目標類和Advice類。spring提供了這種支持,只需要在spring配置文件中配置這兩個元素即可實現代理和aop功能,例如,
<beanid=”proxy” type=”org.spring.framework.aop.ProxyBeanFactory”>
??? <property name=”target”ref=””></property>
??? <property name=”advisor”ref=””></property>
?
</bean>
?
5、談談Struts中的Action servlet。
6、Struts優缺點
優點:
1. 實現MVC模式,結構清晰,使開發者只關注業務邏輯的實現.
2.有豐富的tag可以用,Struts的標記庫(Taglib),如能靈活動用,則能大大提高開發效率
3.頁面導航
??? 使系統的脈絡更加清晰。通過一個配置文件,即可把握整個系統各部分之間的聯系,這對于后期的維護有著莫大的好處。尤其是當另一批開發者接手這個項目時,這種優勢體現得更加明顯。
4.提供Exception處理機制.
5.數據庫鏈接池管理
6.支持I18N
缺點
一、???? 轉到展示層時,需要配置forward,如果有十個展示層的jsp,需要配置十次struts,而且還不包括有時候目錄、文件變更,需要重新修改forward,注意,每次修改配置之后,要求重新部署整個項目,而tomcate這樣的服務器,還必須重新啟動服務器
二、???? 二、Struts 的Action必需是thread-safe方式,它僅僅允許一個實例去處理所有的請求。所以action用到的所有的資源都必需統一同步,這個就引起了線程安全的問題。
三、???? ?測試不方便.Struts的每個Action都同Web層耦合在一起,這樣它的測試依賴于Web容器,單元測試也很難實現。不過有一個Junit的擴展工具StrutsTestCase可以實現它的單元測試。
四、???? ?類型的轉換.Struts的FormBean把所有的數據都作為String類型,它可以使用工具Commons-Beanutils進行類型轉化。但它的轉化都是在Class級別,而且轉化的類型是不可配置的。類型轉化時的錯誤信息返回給用戶也是非常困難的。
五、???? 對Servlet的依賴性過強. Struts處理Action時必需要依賴ServletRequest 和ServletResponse,所有它擺脫不了Servlet容器。
六、???? ?前端表達式語言方面.Struts集成了JSTL,所以它主要使用JSTL的表達式語言來獲取數據??墒?/span>JSTL的表達式語言在Collection和索引屬性方面處理顯得很弱。
七、???? ?對Action執行的控制困難. Struts創建一個Action,如果想控制它的執行順序將會非常困難。甚至你要重新去寫Servlet來實現你的這個功能需求。
八、???? ?對Action執行前和后的處理. Struts處理Action的時候是基于class的hierarchies,很難在action處理前和后進行操作。
九、???? ?對事件支持不夠. 在struts中,實際是一個表單Form對應一個Action類(或DispatchAction),換一句話說:在Struts中實際是一個表單只能對應一個事件,struts這種事件方式稱為application event,applicationevent和component event相比是一種粗粒度的事件
?
?
7、STRUTS的應用(如STRUTS架構)
Struts是采用JavaServlet/JavaServer Pages技術,開發Web應用程序的開放源碼的framework。采用Struts能開發出基于MVC(Model-View-Controller)設計模式的應用構架。 Struts有如下的主要功能:一.包含一個controllerservlet,能將用戶的請求發送到相應的Action對象。二.JSP自由tag庫,并且在controllerservlet中提供關聯支持,幫助開發員創建交互式表單應用。三.提供了一系列實用對象:XML處理、通過Java reflection APIs自動處理JavaBeans屬性、國際化的提示和消息。
?
8、說說struts1與struts2的區別。
1.都是MVC的WEB框架,
2struts1的老牌框架,應用很廣泛,有很好的群眾基礎,使用它開發風險很小,成本更低!struts2雖然基于這個框架,但是應用群眾并多,相對不成熟,未知的風險和變化很多,開發人員相對不好招,使用它開發項目的風險系數更大,用人成本更高!
3.struts2畢竟是站在前輩的基礎設計出來,它會改善和完善struts1中的一些缺陷,struts1中一些懸而未決問題在struts2得到了解決。
4.struts1的前端控制器是一個Servlet,名稱為ActionServlet,struts2的前端控制器是一個filter,在struts2.0中叫FilterDispatcher,在struts2.1中叫StrutsPrepareAndExecuteFilter。
5.struts1的action需要繼承Action類,struts2的action可以不繼承任何類;struts1對同一個路徑的所有請求共享一個Action實例,struts2對同一個路徑的每個請求分別使用一個獨立Action實例對象,所有對于struts2的Action不用考慮線程安全問題。
6.在struts1中使用formbean封裝請求參數,在struts2中直接使用action的屬性來封裝請求參數。
7.struts1中的多個業務方法放在一個Action中時(即繼承DispatchAction時),要么都校驗,要么都不校驗;對于struts2,可以指定只對某個方法進行校驗,當一個Action繼承了ActionSupport且在這個類中只編寫了validateXxx()方法,那么則只對Xxx()方法進行校驗。
?
(一個請求來了的執行流程進行分析,struts2是自動支持分模塊開發,并可以不同模塊設置不同的url前綴,這是通過package的namespace來實現的;struts2是支持多種類型的視圖;struts2的視圖地址可以是動態的,即視圖的名稱是支持變量方式的,舉例,論壇發帖失敗后回來還要傳遞boardid。視圖內容顯示方面:它的標簽用ognl,要el強大很多,在國際化方面支持分模塊管理,兩個模塊用到同樣的key,對應不同的消息;)
?
???
與Struts1不同,Struts2對用戶的每一次請求都會創建一個Action,所以Struts2中的Action是線程安全的。
?
給我印象最深刻的是:struts配置文件中的redirect視圖的url不能接受參數,而struts2配置文件中的redirect視圖可以接受參數。
?
?
9、hibernate中的update()和saveOrUpdate()的區別,session的load()和get()的區別。
10、簡述 Hibernate 和 JDBC 的優缺點? 如何書寫一個 one to many 配置文件.
11、iBatis與Hibernate有什么不同?
相同點:屏蔽jdbc api的底層訪問細節,使用我們不用與jdbc api打交道,就可以訪問數據。
jdbcapi編程流程固定,還將sql語句與java代碼混雜在了一起,經常需要拼湊sql語句,細節很繁瑣。
ibatis的好處:屏蔽jdbc api的底層訪問細節;將sql語句與java代碼進行分離;提供了將結果集自動封裝稱為實體對象和對象的集合的功能,queryForList返回對象集合,用queryForObject返回單個對象;提供了自動將實體對象的屬性傳遞給sql語句的參數。
?
Hibernate是一個全自動的orm映射工具,它可以自動生成sql語句,ibatis需要我們自己在xml配置文件中寫sql語句,hibernate要比ibatis功能負責和強大很多。因為hibernate自動生成sql語句,我們無法控制該語句,我們就無法去寫特定的高效率的sql。對于一些不太復雜的sql查詢,hibernate可以很好幫我們完成,但是,對于特別復雜的查詢,hibernate就很難適應了,這時候用ibatis就是不錯的選擇,因為ibatis還是由我們自己寫sql語句。
?
?
12、寫Hibernate的一對多和多對一雙向關聯的orm配置?
9、hibernate的inverse屬性的作用?
解決方案一,按照Object[]數據取出數據,然后自己組bean
解決方案二,對每個表的bean寫構造函數,比如表一要查出field1,field2兩個字段,那么有一個構造函數就是Bean(type1 filed1,type2
field2),然后在hql里面就可以直接生成這個bean了。
?
13、在DAO中如何體現DAO設計模式?
解決方案一,按照Object[]數據取出數據,然后自己組bean
解決方案二,對每個表的bean寫構造函數,比如表一要查出field1,field2兩個字段,那么有一個構造函數就是Bean(type1 filed1,type2
field2),然后在hql里面就可以直接生成這個bean了。
?
14、spring+Hibernate中委托方案怎么配置?
解決方案一,按照Object[]數據取出數據,然后自己組bean
解決方案二,對每個表的bean寫構造函數,比如表一要查出field1,field2兩個字段,那么有一個構造函數就是Bean(type1 filed1,type2
field2),然后在hql里面就可以直接生成這個bean了。
?
15、spring+Hibernate中委托方案怎么配置?
解決方案一,按照Object[]數據取出數據,然后自己組bean
解決方案二,對每個表的bean寫構造函數,比如表一要查出field1,field2兩個字段,那么有一個構造函數就是Bean(type1 filed1,type2
field2),然后在hql里面就可以直接生成這個bean了。
?
16.hibernate進行多表查詢每個表中各取幾個字段,也就是說查詢出來的結果集沒有一個實體類與之對應如何解決;
?
解決方案一,按照Object[]數據取出數據,然后自己組bean
解決方案二,對每個表的bean寫構造函數,比如表一要查出field1,field2兩個字段,那么有一個構造函數就是Bean(type1 filed1,type2
field2),然后在hql里面就可以直接生成這個bean了。
17.介紹一下Hibernate的二級緩存
?
按照以下思路來回答:(1)首先說清楚什么是緩存,(2)再說有了hibernate的Session就是一級緩存,即有了一級緩存,為什么還要有二級緩存,(3)最后再說如何配置Hibernate的二級緩存。
(1)緩存就是把以前從數據庫中查詢出來和使用過的對象保存在內存中(一個數據結構中),這個數據結構通常是或類似Hashmap,當以后要使用某個對象時,先查詢緩存中是否有這個對象,如果有則使用緩存中的對象,如果沒有則去查詢數據庫,并將查詢出來的對象保存在緩存中,以便下次使用。下面是緩存的偽代碼:
引出hibernate的第二級緩存,用下面的偽代碼分析了Cache的實現原理
Dao{
??? hashmap map = new map();
??? User getUser(integer id) {
?????? User user = map.get(id)
?????? if(user == null) {
?????????? user = session.get(id);
?????????? map.put(id,user);
?????? }
?????? return user;
??? }
}
?
Dao{
??? Cache cache =null
??? setCache(Cachecache) {
?????? this.cache = cache
??? }
??? User getUser(int id) {
?????? if(cache!=null) {
?????????? User user = cache.get(id);
?????????? if(user ==null) {
????????????? user = session.get(id);
????????????? cache.put(id,user);
?????????? }
?????????? return user;
?????? }
?????? return session.get(id);
??? }
}
(2)Hibernate的Session就是一種緩存,我們通常將之稱為Hibernate的一級緩存,當想使用session從數據庫中查詢出一個對象時,Session也是先從自己內部查看是否存在這個對象,存在則直接返回,不存在才去訪問數據庫,并將查詢的結果保存在自己內部。由于Session代表一次會話過程,一個Session與一個數據庫連接相關連,所以Session最好不要長時間保持打開,通常僅用于一個事務當中,在事務結束時就應關閉。并且Session是線程不安全的,被多個線程共享時容易出現問題。通常只有那種全局意義上的緩存才是真正的緩存應用,才有較大的緩存價值,因此,Hibernate的Session這一級緩存的緩存作用并不明顯,應用價值不大。Hibernate的二級緩存就是要為Hibernate配置一種全局緩存,讓多個線程和多個事務都可以共享這個緩存。我們希望的是一個人使用過,其他人也可以使用,session沒有這種效果。
(3)二級緩存是獨立于Hibernate的軟件部件,屬于第三方的產品,多個廠商和組織都提供有緩存產品,例如,EHCache和OSCache等等。在Hibernate中使用二級緩存,首先就要在hibernate.cfg.xml配置文件中配置使用哪個廠家的緩存產品,接著需要配置該緩存產品自己的配置文件,最后要配置Hibernate中的哪些實體對象要納入到二級緩存的管理中。明白了二級緩存原理和有了這個思路后,很容易配置起Hibernate的二級緩存。擴展知識:一個SessionFactory可以關聯一個二級緩存,也即一個二級緩存只能負責緩存一個數據庫中的數據,當使用Hibernate 的二級緩存后,注意不要有其他的應用或SessionFactory來更改當前數據庫中的數據,這樣緩存的數據就會與數據庫中的實際數據不一致。
?
18、Spring 的依賴注入是什么意思? 給一個 Bean 的 message 屬性, 字符串類型, 注入值為 "Hello" 的 XML 配置文件該怎么寫?
?
19、Jdo是什么?
?
JDO是Java對象持久化的新的規范,為java data object的簡稱,也是一個用于存取某種數據倉庫中的對象的標準化API。JDO提供了透明的對象存儲,因此對開發人員來說,存儲數據對象完全不需要額外的代碼(如JDBC API的使用)。這些繁瑣的例行工作已經轉移到JDO產品提供商身上,使開發人員解脫出來,從而集中時間和精力在業務邏輯上。另外,JDO很靈活,因為它可以在任何數據底層上運行。JDBC只是面向關系數據庫(RDBMS)JDO更通用,提供到任何數據底層的存儲功能,比如關系數據庫、文件、XML以及對象數據庫(ODBMS)等等,使得應用可移植性更強。
20、三大框架各起的作用?
?
struts 在SSH 框架中起控制的作用 , 其核心是(控制器)Controller, 即ActionServlet,而 ActionServlet 的核心就是Struts-config.xml. 主要控制邏輯關系的處理 .???hibernate 是數據持久化層 , 是一種新的對象、關系的映射工具 , 提供了從 Java 類到數據表的映射,也提供了數據查詢和恢復等機制 , 大大減少數據訪問的復雜度。把對數據庫的直接操作 , 轉換為對持久對象的操作。
spring 是一個輕量級的控制反轉 (IoC) 和面向切面 (AOP) 的容器框架, 面向接口的編程 , 由容器控制程序之間的(依賴)關系,而非傳統實現中,由程序代碼直接操控。這也就是所謂“ 控制反轉” 的概念所在:(依賴)控制權由應用代碼中轉到了外部容器,控制權的轉移,是所謂反轉。依賴注入,即組件之間的依賴關系由容器在運行期決定,形象的來說,即由容器動態的將某種依賴關系注入到組件之中? 起到的主要作用是解耦。
21 簡述SSH工作流程
?
JSP頁面發出請求,Struts接收頁面請求,Struts的action調用業務邏輯,業務邏輯調用業務組件(其中使用到Spring的依賴注入?IOC,或者AOP等);業務組件根據Hibernate的對象/關系數據庫的映射關系查詢數據庫。Struts根據結果返回頁面。
?
22 談談Spring和Spring?MVC的流程和事務;spring配置文件都寫什么?
?
(1)spring提供兩種管理事務的方式:一種是聲明式事務,一種是編程式事務。
Spring的聲明式事務管理,基于Spring的AOP,基于Spring?AOP實現,幾乎就是xml文件的配置,不再需要不停地寫commit,rollback,(但Spring仍然沒有放棄編程式的事務管理策略。
Spring的編程式事務管理,統一的事務編碼風格,幾乎是一個模板化的。
為我們提供了一個TransactionTemplate,使用回調機制,將應用代碼從樣板式的資源獲取和釋放代碼中解放出來,不再有大量的try/catch/finally/try/catch代碼塊。
(2)springMVC的流程和事務:動態注入,讓一個對象的創建不用new了,可以自動的生產,這其實就是利用java里的反射?,反射其實就是在運行時動態的去創建、調用對象,Spring就是在運行時,跟xml?Spring的配置?
文件來動態的創建對象,和調用對象里的方法的?。
Spring還有一個核心就是AOP這個就是面向切面編程,可以為某一類對象?進行監督和控制(也就是在調用這類對象的具體方法的前后去調用你指定的?模塊)從而達到對一個模塊擴充的功能。這些都是通過?配置類達到的。Spring目的:就是讓對象與對象(模塊與模塊)之間的關系沒有通過代碼來關聯,都是通過配置類說明管理的(Spring根據這些配置?內部通過反射去動態的組裝對象)?。
要記住:Spring是一個容器,凡是在容器里的對象才會有Spring所提供的這些服務和功能。
(3)spring的配置文件:一、引用外部屬性文件;二、常用數據源的配置;三、配置事務管理器;四、context:component-scan<!--?對包中的所有類進行掃描,以完成Bean創建和自動依賴注入的功能?-->;五、aop注解支持;六、緩存配置;七、<!--?Spring、MyBatis的整合,需要在?Spring?應用上下文中定義至少兩樣東西:一個SqlSessionFactory和至少一個數據映射器類(UserMapper->iocContext.xml)。
23 ssm和ssh的區別?
?
(1)基于MVC三層架構,使用ssh框架?or?ssm框架?or?ssi框架,采用面向接口的方式編程。
共同點是struts、spring,不同點是nibernate和mybatis、ibatis。
(2)相對Hibernate“O/R”而言,iBATIS?是一種“Sql?Mapping”的ORM實現。
(3)由于hibernate是完全面向對象的編程,在實現dao中就非常的方便,而且不重復;當mybatis在.java代碼中也是可以做到不重復,麻煩一點的是,每個映射文件都必須編寫幾乎相同的配置,除了resultType不一樣。
(4)hibernate在實際編程中可以把基礎的CRUD封裝,比如BaseDao類。其它類只要去繼承BaseDao就能執行所有的基礎的CRUD。這樣就非常方便。這個帶來的好處還有,可以建立BaseService和BaseAction。?
由于mybatis的映射文件中,雖然SQL語句中的表名可以通過parameterType指定,但是resultType必須定死,不能以參數?的形式給予指定。導致的結果就是所有的DAO類的每個CRUD都必須和指定的映射文件綁定在一起,以至于不可能存在BaseDao類。當然也就不能建立?BaseService和BaseAction。
?
24 spring核心:aop和ioc的解釋?隔離范圍??3種注入方法?
?
(1)aop:Spring提供了對AOP技術的良好封裝,?AOP稱為面向切面編程,就是系統中有很多各不相干的類的方法,在這些眾多方法中要加入某種系統功能的代碼;例如,加入日志,加入權限判斷,加入異常處理,這種應用稱為AOP。實現AOP功能采用的是代理技術,客戶端程序不再調用目標,而調用代理類,代理類與目標類對外具有相同的方法聲明,有兩種方式可以實現相同的方法聲明,一是實現相同的接口,二是作為目標的子類在,JDK中采用Proxy類產生動態代理的方式為某個接口生成實現類,spring提供了這種支持,只需要在spring配置文件中配置這兩個元素即可實現代理和aop功能;
(2)Ioc:Spring提供了對IOC良好支持,IOC是一種編程思想,是一種架構藝術,利用這種思想可以很好地實現模塊之間的解耦。IOC也稱為DI(Depency?Injection);IOC可以理解為‘面向接口編程思想’的一種實現方法,通過IOC實現了強制的‘面向接口編程’。
(3)隔離范圍:?Spring支持JDBC規范定義的四種隔離級別
Default默認的事務隔離級別
READ_UNCOMMITTED讀未提交,一個事務可以操作另外一個未提交的事務,不能避免臟讀,不可重復讀,幻讀,隔離級別最低,并發性?能最高
READ_COMMITTED讀已提交,一個事務不可以操作另外一個未提交的事務,?能防止臟讀,不能避免不可重復讀,幻讀。
repeatable_read能夠避免臟讀,不可重復讀,不能避免幻讀
SERIALIZABLE隔離級別最高,消耗資源最低,代價最高,能夠防止臟讀,?不可重復讀,幻讀。
(4)Spring的注入和IoC反轉控制是一回事;關于getter和setter方式的注入;
Autowire=”defualt”;autowire=”byName”;autowire=”byType”;
?
25. 使用Spring框架能帶來哪些好處?
?
DependencyInjection(DI)?方法使得構造器和JavaBean properties文件中的依賴關系一目了然。
與EJB容器相比較,IoC容器更加趨向于輕量級。這樣一來IoC容器在有限的內存和CPU資源的情況下進行應用程序的開發和發布就變得十分有利。
Spring并沒有閉門造車,Spring利用了已有的技術比如ORM框架、logging框架、J2EE、Quartz和JDKTimer以及其他視圖技術。
Spring框架是按照模塊的形式來組織的。由包和類的編號就可以看出其所屬的模塊,開發者僅僅需要選用他們需要的模塊即可。
要測試一項用Spring開發的應用程序十分簡單,因為測試相關的環境代碼都已經囊括在框架中了。更加簡單的是,利用JavaBean形式的POJO類,可以很方便的利用依賴注入來寫入測試數據。
Spring的Web框架亦是一個精心設計的Web MVC框架,為開發者們在web框架的選擇上提供了一個除了主流框架比如Struts、過度設計的、不流行web框架的以外的有力選項。
Spring提供了一個便捷的事務管理接口,適用于小型的本地事物處理(比如在單DB的環境下)和復雜的共同事物處理(比如利用JTA的復雜DB環境)。
26. BeanFactory和ApplicationContext有什么區別?
?
BeanFactory?可以理解為含有bean集合的工廠類。BeanFactory?包含了種bean的定義,以便在接收到客戶端請求時將對應的bean實例化。
BeanFactory還能在實例化對象的時生成協作類之間的關系。此舉將bean自身與bean客戶端的配置中解放出來。BeanFactory還包含了bean生命周期的控制,調用客戶端的初始化方法(initialization methods)和銷毀方法(destruction methods)。
從表面上看,application context如同beanfactory一樣具有bean定義、bean關聯關系的設置,根據請求分發bean的功能。但applicationcontext在此基礎上還提供了其他的功能。
提供了支持國際化的文本消息
統一的資源文件讀取方式
已在監聽器中注冊的bean的事件
27. 請解釋SpringBean的生命周期?
?
Spring Bean的生命周期簡單易懂。在一個bean實例被初始化時,需要執行一系列的初始化操作以達到可用的狀態。同樣的,當一個bean不在被調用時需要進行相關的析構操作,并從bean容器中移除。
Spring bean factory 負責管理在spring容器中被創建的bean的生命周期。Bean的生命周期由兩組回調(call back)方法組成。
初始化之后調用的回調方法。
銷毀之前調用的回調方法。
Spring框架提供了以下四種方式來管理bean的生命周期事件:
InitializingBean和DisposableBean回調接口
針對特殊行為的其他Aware接口
Bean配置文件中的Custom init()方法和destroy()方法
@PostConstruct和@PreDestroy注解方式
?
28. Spring Bean的作用域之間有什么區別?
?
Spring容器中的bean可以分為5個范圍。所有范圍的名稱都是自說明的,但是為了避免混淆,還是讓我們來解釋一下:
singleton:這種bean范圍是默認的,這種范圍確保不管接受到多少個請求,每個容器中只有一個bean的實例,單例的模式由bean factory自身來維護。
prototype:原形范圍與單例范圍相反,為每一個bean請求提供一個實例。
request:在請求bean范圍內會每一個來自客戶端的網絡請求創建一個實例,在請求完成以后,bean會失效并被垃圾回收器回收。
Session:與請求范圍類似,確保每個session中有一個bean的實例,在session過期后,bean會隨之失效。
global-session:global-session和Portlet應用相關。當你的應用部署在Portlet容器中工作時,它包含很多portlet。如果你想要聲明讓所有的portlet共用全局的存儲變量的話,那么這全局變量需要存儲在global-session中。
29. Spring框架中的單例Beans是線程安全的么?
?
Spring框架并沒有對單例bean進行任何多線程的封裝處理。關于單例bean的線程安全和并發問題需要開發者自行去搞定。但實際上,大部分的Spring bean并沒有可變的狀態(比如Serview類和DAO類),所以在某種程度上說Spring的單例bean是線程安全的。如果你的bean有多種狀態的話(比如 View Model 對象),就需要自行保證線程安全。
最淺顯的解決辦法就是將多態bean的作用域由“singleton”變更為“prototype”。
30. 請舉例說明如何在Spring中注入一個Java Collection?
Spring提供了以下四種集合類的配置元素:
<list>?:??該標簽用來裝配可重復的list值。
<set>?:???該標簽用來裝配沒有重復的set值。
<map>:?? 該標簽可用來注入鍵和值可以為任何類型的鍵值對。
<props>?: 該標簽支持注入鍵和值都是字符串類型的鍵值對。
?
31. 構造方法注入和設值注入有什么區別?
?
請注意以下明顯的區別:
在設值注入方法支持大部分的依賴注入,如果我們僅需要注入int、string和long型的變量,我們不要用設值的方法注入。對于基本類型,如果我們沒有注入的話,可以為基本類型設置默認值。在構造方法注入不支持大部分的依賴注入,因為在調用構造方法中必須傳入正確的構造參數,否則的話為報錯。
設值注入不會重寫構造方法的值。如果我們對同一個變量同時使用了構造方法注入又使用了設置方法注入的話,那么構造方法將不能覆蓋由設值方法注入的值。很明顯,因為構造方法盡在對象被創建時調用。
在使用設值注入時有可能還不能保證某種依賴是否已經被注入,也就是說這時對象的依賴關系有可能是不完整的。而在另一種情況下,構造器注入則不允許生成依賴關系不完整的對象。
在設值注入時如果對象A和對象B互相依賴,在創建對象A時Spring會拋出sObjectCurrentlyInCreationException異常,因為在B對象被創建之前A對象是不能被創建的,反之亦然。所以Spring用設值注入的方法解決了循環依賴的問題,因對象的設值方法是在對象被創建之前被調用的。
?
32. Spring 框架中都用到了哪些設計模式?
?
Spring框架中使用到了大量的設計模式,下面列舉了比較有代表性的:
代理模式—在AOP和remoting中被用的比較多。
單例模式—在spring配置文件中定義的bean默認為單例模式。
模板方法—用來解決代碼重復的問題。比如.?RestTemplate,?JmsTemplate,?JpaTemplate。
前端控制器—Spring提供了DispatcherServlet來對請求進行分發。
視圖幫助(ViewHelper?)—Spring提供了一系列的JSP標簽,高效宏來輔助將分散的代碼整合在視圖里。
依賴注入—貫穿于BeanFactory?/?ApplicationContext接口的核心理念。
工廠模式—BeanFactory用來創建對象的實例。
33. 解釋一下MyBatis中命名空間(namespace)的作用
?
在大型項目中,可能存在大量的SQL語句,這時候為每個SQL語句起一個唯一的標識(ID)就變得并不容易了。為了解決這個問題,在MyBatis中,可以為每個映射文件起一個唯一的命名空間,這樣定義在這個映射文件中的每個SQL語句就成了定義在這個命名空間中的一個ID。只要我們能夠保證每個命名空間中這個ID是唯一的,即使在不同映射文件中的語句ID相同,也不會再產生沖突了。
34. MyBatis中的動態SQL是什么意思?
?
對于一些復雜的查詢,我們可能會指定多個查詢條件,但是這些條件可能存在也可能不存在,例如在58同城上面找房子,我們可能會指定面積、樓層和所在位置來查找房源,也可能會指定面積、價格、戶型和所在位置來查找房源,此時就需要根據用戶指定的條件動態生成SQL語句。如果不使用持久層框架我們可能需要自己拼裝SQL語句,還好MyBatis提供了動態SQL的功能來解決這個問題。MyBatis中用于實現動態SQL的元素主要有:
- if
- choose / when / otherwise
- trim
- where
- set
- foreach
35. Spring支持的事務管理類型有哪些?你在項目中使用哪種方式?
?
Spring支持編程式事務管理和聲明式事務管理。許多Spring框架的用戶選擇聲明式事務管理,因為這種方式和應用程序的關聯較少,因此更加符合輕量級容器的概念。聲明式事務管理要優于編程式事務管理,盡管在靈活性方面它弱于編程式事務管理,因為編程式事務允許你通過代碼控制業務。
事務分為全局事務和局部事務。全局事務由應用服務器管理,需要底層服務器JTA支持(如WebLogic、WildFly等)。局部事務和底層采用的持久化方案有關,例如使用JDBC進行持久化時,需要使用Connetion對象來操作事務;而采用Hibernate進行持久化時,需要使用Session對象來操作事務。
Spring提供了如下所示的事務管理器。
| 事務管理器實現類 | 目標對象 |
| DataSourceTransactionManager | 注入DataSource |
| HibernateTransactionManager | 注入SessionFactory |
| JdoTransactionManager | 管理JDO事務 |
| JtaTransactionManager | 使用JTA管理事務 |
| PersistenceBrokerTransactionManager | 管理Apache的OJB事務 |
這些事務的父接口都是PlatformTransactionManager。Spring的事務管理機制是一種典型的策略模式,PlatformTransactionManager代表事務管理接口,該接口定義了三個方法,該接口并不知道底層如何管理事務,但是它的實現類必須提供getTransaction()方法(開啟事務)、commit()方法(提交事務)、rollback()方法(回滾事務)的多態實現,這樣就可以用不同的實現類代表不同的事務管理策略。使用JTA全局事務策略時,需要底層應用服務器支持,而不同的應用服務器所提供的JTA全局事務可能存在細節上的差異,因此實際配置全局事務管理器是可能需要使用JtaTransactionManager的子類,如:WebLogicJtaTransactionManager(Oracle的WebLogic服務器提供)、UowJtaTransactionManager(IBM的WebSphere服務器提供)等。
36. 大型網站在架構上應當考慮哪些問題?
?
1.分層:分層是處理任何復雜系統最常見的手段之一,將系統橫向切分成若干個層面,每個層面只承擔單一的職責,然后通過下層為上層提供的基礎設施和服務以及上層對下層的調用來形成一個完整的復雜的系統。計算機網絡的開放系統互聯參考模型(OSI/RM)和Internet的TCP/IP模型都是分層結構,大型網站的軟件系統也可以使用分層的理念將其分為持久層(提供數據存儲和訪問服務)、業務層(處理業務邏輯,系統中最核心的部分)和表示層(系統交互、視圖展示)。需要指出的是:(1)分層是邏輯上的劃分,在物理上可以位于同一設備上也可以在不同的設備上部署不同的功能模塊,這樣可以使用更多的計算資源來應對用戶的并發訪問;(2)層與層之間應當有清晰的邊界,這樣分層才有意義,才更利于軟件的開發和維護。
2.分割:分割是對軟件的縱向切分。我們可以將大型網站的不同功能和服務分割開,形成高內聚低耦合的功能模塊(單元)。在設計初期可以做一個粗粒度的分割,將網站分割為若干個功能模塊,后期還可以進一步對每個模塊進行細粒度的分割,這樣一方面有助于軟件的開發和維護,另一方面有助于分布式的部署,提供網站的并發處理能力和功能的擴展。
3.分布式:除了上面提到的內容,網站的靜態資源(JavaScript、CSS、圖片等)也可以采用獨立分布式部署并采用獨立的域名,這樣可以減輕應用服務器的負載壓力,也使得瀏覽器對資源的加載更快。數據的存取也應該是分布式的,傳統的商業級關系型數據庫產品基本上都支持分布式部署,而新生的NoSQL產品幾乎都是分布式的。當然,網站后臺的業務處理也要使用分布式技術,例如查詢索引的構建、數據分析等,這些業務計算規模龐大,可以使用Hadoop以及MapReduce分布式計算框架來處理。
4.集群:集群使得有更多的服務器提供相同的服務,可以更好的提供對并發的支持。
5.緩存:所謂緩存就是用空間換取時間的技術,將數據盡可能放在距離計算最近的位置。使用緩存是網站優化的第一定律。我們通常說的CDN、反向代理、熱點數據都是對緩存技術的使用。
6.異步:異步是實現軟件實體之間解耦合的又一重要手段。異步架構是典型的生產者消費者模式,二者之間沒有直接的調用關系,只要保持數據結構不變,彼此功能實現可以隨意變化而不互相影響,這對網站的擴展非常有利。使用異步處理還可以提高系統可用性,加快網站的響應速度(用Ajax加載數據就是一種異步技術),同時還可以起到削峰作用(應對瞬時高并發)。";能推遲處理的都要推遲處理"是網站優化的第二定律,而異步是踐行網站優化第二定律的重要手段。
7.冗余:各種服務器都要提供相應的冗余服務器以便在某臺或某些服務器宕機時還能保證網站可以正常工作,同時也提供了災難恢復的可能性。冗余是網站高可用性的重要保證。
?
37. 你用過的網站前端優化的技術有哪些?
?
①瀏覽器訪問優化:
- 減少HTTP請求數量:合并CSS、合并javascript、合并圖片(CSS Sprite)
- 使用瀏覽器緩存:通過設置HTTP響應頭中的Cache-Control和Expires屬性,將CSS、JavaScript、圖片等在瀏覽器中緩存,當這些靜態資源需要更新時,可以更新HTML文件中的引用來讓瀏覽器重新請求新的資源
- 啟用壓縮
- CSS前置,JavaScript后置
- 減少Cookie傳輸
② CDN加速:CDN(ContentDistribute Network)的本質仍然是緩存,將數據緩存在離用戶最近的地方,CDN通常部署在網絡運營商的機房,不僅可以提升響應速度,還可以減少應用服務器的壓力。當然,CDN緩存的通常都是靜態資源。
③反向代理:反向代理相當于應用服務器的一個門面,可以保護網站的安全性,也可以實現負載均衡的功能,當然最重要的是它緩存了用戶訪問的熱點資源,可以直接從反向代理將某些內容返回給用戶瀏覽器。
?
38. 你使用過的應用服務器優化技術有哪些?
?
①分布式緩存:緩存的本質就是內存中的哈希表,如果設計一個優質的哈希函數,那么理論上哈希表讀寫的漸近時間復雜度為O(1)。緩存主要用來存放那些讀寫比很高、變化很少的數據,這樣應用程序讀取數據時先到緩存中讀取,如果沒有或者數據已經失效再去訪問數據庫或文件系統,并根據擬定的規則將數據寫入緩存。對網站數據的訪問也符合二八定律(Pareto分布,冪律分布),即80%的訪問都集中在20%的數據上,如果能夠將這20%的數據緩存起來,那么系統的性能將得到顯著的改善。當然,使用緩存需要解決以下幾個問題:
- 頻繁修改的數據;
- 數據不一致與臟讀;
- 緩存雪崩(可以采用分布式緩存服務器集群加以解決,memcached是廣泛采用的解決方案);
- 緩存預熱;
- 緩存穿透(惡意持續請求不存在的數據)。
②異步操作:可以使用消息隊列將調用異步化,通過異步處理將短時間高并發產生的事件消息存儲在消息隊列中,從而起到削峰作用。電商網站在進行促銷活動時,可以將用戶的訂單請求存入消息隊列,這樣可以抵御大量的并發訂單請求對系統和數據庫的沖擊。目前,絕大多數的電商網站即便不進行促銷活動,訂單系統都采用了消息隊列來處理。
③使用集群。
④代碼優化:
- 多線程:基于Java的Web開發基本上都通過多線程的方式響應用戶的并發請求,使用多線程技術在編程上要解決線程安全問題,主要可以考慮以下幾個方面:A. 將對象設計為無狀態對象(這和面向對象的編程觀點是矛盾的,在面向對象的世界中被視為不良設計),這樣就不會存在并發訪問時對象狀態不一致的問題。B. 在方法內部創建對象,這樣對象由進入方法的線程創建,不會出現多個線程訪問同一對象的問題。使用ThreadLocal將對象與線程綁定也是很好的做法,這一點在前面已經探討過了。C. 對資源進行并發訪問時應當使用合理的鎖機制。
- 非阻塞I/O:使用單線程和非阻塞I/O是目前公認的比多線程的方式更能充分發揮服務器性能的應用模式,基于Node.js構建的服務器就采用了這樣的方式。Java在JDK 1.4中就引入了NIO(Non-blockingI/O),在Servlet3規范中又引入了異步Servlet的概念,這些都為在服務器端采用非阻塞I/O提供了必要的基礎。
- 資源復用:資源復用主要有兩種方式,一是單例,二是對象池,我們使用的數據庫連接池、線程池都是對象池化技術,這是典型的用空間換取時間的策略,另一方面也實現對資源的復用,從而避免了不必要的創建和釋放資源所帶來的開銷。
?
39. 持久層設計要考慮的問題有哪些?你用過的持久層框架有哪些?
所謂"持久"就是將數據保存到可掉電式存儲設備中以便今后使用,簡單的說,就是將內存中的數據保存到關系型數據庫、文件系統、消息隊列等提供持久化支持的設備中。持久層就是系統中專注于實現數據持久化的相對獨立的層面。
持久層設計的目標包括:
- 數據存儲邏輯的分離,提供抽象化的數據訪問接口。
- 數據訪問底層實現的分離,可以在不修改代碼的情況下切換底層實現。
- 資源管理和調度的分離,在數據訪問層實現統一的資源調度(如緩存機制)。
- 數據抽象,提供更面向對象的數據操作。
持久層框架有:
- Hibernate
- MyBatis
- TopLink
- Guzz
- jOOQ
- Spring Data
- ActiveJDBC
40. Xml映射文件中,除了常見的select|insert|updae|delete標簽之外,還有哪些標簽?
(京東)還有很多其他的標簽,<resultMap>、<parameterMap>、<sql>、<include>、<selectKey>,加上動態sql的9個標簽,trim|where|set|foreach|if|choose|when|otherwise|bind等,其中<sql>為sql片段標簽,通過<include>標簽引入sql片段,<selectKey>為不支持自增的主鍵生成策略標簽。
41.通常一個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執行結果返回。
42.Mybatis是如何進行分頁的?分頁插件的原理是什么?
Mybatis使用RowBounds對象進行分頁,它是針對ResultSet結果集執行的內存分頁,而非物理分頁,可以在sql內直接書寫帶有物理分頁的參數來完成物理分頁功能,也可以使用分頁插件來完成物理分頁。
分頁插件的基本原理是使用Mybatis提供的插件接口,實現自定義插件,在插件的攔截方法內攔截待執行的sql,然后重寫sql,根據dialect方言,添加對應的物理分頁語句和物理分頁參數。
舉例:select * from student,攔截sql后重寫為:selectt.* from (select * from student)t?limit0,10
43.Mybatis動態sql是做什么的?都有哪些動態sql?能簡述一下動態sql的執行原理不?
Mybatis動態sql可以讓我們在Xml映射文件內,以標簽的形式編寫動態sql,完成邏輯判斷和動態拼接sql的功能,Mybatis提供了9種動態sql標簽trim|where|set|foreach|if|choose|when|otherwise|bind。
其執行原理為,使用OGNL從sql參數對象中計算表達式的值,根據表達式的值動態拼接sql,以此來完成動態sql的功能。
44.Mybatis是如何將sql執行結果封裝為目標對象并返回的?都有哪些映射形式?
第一種是使用<resultMap>標簽,逐一定義列名和對象屬性名之間的映射關系。第二種是使用sql列的別名功能,將列別名書寫為對象屬性名,比如T_NAME?AS NAME,對象屬性名一般是name,小寫,但是列名不區分大小寫,Mybatis會忽略列名大小寫,智能找到與之對應對象屬性名,你甚至可以寫成T_NAME?AS NaMe,Mybatis一樣可以正常工作。
有了列名與屬性名的映射關系后,Mybatis通過反射創建對象,同時使用反射給對象的屬性逐一賦值并返回,那些找不到映射關系的屬性,是無法完成賦值的。
45.Mybatis能執行一對一、一對多的關聯查詢嗎?都有哪些實現方式,以及它們之間的區別。
能,Mybatis不僅可以執行一對一、一對多的關聯查詢,還可以執行多對一,多對多的關聯查詢,多對一查詢,其實就是一對一查詢,只需要把selectOne()修改為selectList()即可;多對多查詢,其實就是一對多查詢,只需要把selectOne()修改為selectList()即可。
關聯對象查詢,有兩種實現方式,一種是單獨發送一個sql去查詢關聯對象,賦給主對象,然后返回主對象。另一種是使用嵌套查詢,嵌套查詢的含義為使用join查詢,一部分列是A對象的屬性值,另外一部分列是關聯對象B的屬性值,好處是只發一個sql查詢,就可以把主對象和其關聯對象查出來。
那么問題來了,join查詢出來100條記錄,如何確定主對象是5個,而不是100個?其去重復的原理是<resultMap>標簽內的<id>子標簽,指定了唯一確定一條記錄的id列,Mybatis根據<id>列值來完成100條記錄的去重復功能,<id>可以有多個,代表了聯合主鍵的語意。
同樣主對象的關聯對象,也是根據這個原理去重復的,盡管一般情況下,只有主對象會有重復記錄,關聯對象一般不會重復。
舉例:下面join查詢出來6條記錄,一、二列是Teacher對象列,第三列為Student對象列,Mybatis去重復處理后,結果為1個老師6個學生,而不是6個老師6個學生。
?? ? ?t_id ? ? t_name? ? ? ? ?s_id
| ? ? ? ??1 | teacher ? ? ?| ? ? ?38 |
| ? ? ? ? ?1 | teacher ? ? ?| ?? ?39 |
| ? ? ? ? ?1 | teacher ? ? ?| ?? ?40 |
| ? ? ? ? ?1 | teacher ? ? ?| ?? ?41 |
| ? ? ? ? ?1 | teacher ? ? ?| ?? ?42 |
| ? ? ? ? ?1 | teacher ? ? ?| ?? ?43 |
46.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()方法的調用。這就是延遲加載的基本原理。
當然了,不光是Mybatis,幾乎所有的包括Hibernate,支持延遲加載的原理都是一樣的。
47. 簡單的說一下MyBatis的一級緩存和二級緩存?
Mybatis首先去緩存中查詢結果集,如果沒有則查詢數據庫,如果有則從緩存取出返回結果集就不走數據庫。Mybatis內部存儲緩存使用一個HashMap,key為hashCode+sqlId+Sql語句。value為從查詢出來映射生成的java對象
Mybatis的二級緩存即查詢緩存,它的作用域是一個mapper的namespace,即在同一個namespace中查詢sql可以從緩存中獲取數據。二級緩存是可以跨SqlSession的。
48.SpringMVC與Struts2的主要區別?
①springmvc的入口是一個servlet即前端控制器,而struts2入口是一個filter過慮器。
②springmvc是基于方法開發,傳遞參數是通過方法形參,可以設計為單例或多例(建議單例),struts2是基于類開發,傳遞參數是通過類的屬性,只能設計為多例。
③Struts采用值棧存儲請求和響應的數據,通過OGNL存取數據, springmvc通過參數解析器是將request對象內容進行解析成方法形參,將響應數據和頁面封裝成ModelAndView對象,最后又將模型數據通過request對象傳輸到頁面。 Jsp視圖解析器默認使用jstl。
49. SpringMvc怎么和AJAX相互調用的
通過Jackson框架就可以把Java里面的對象直接轉化成Js可以識別的Json對象
? 具體步驟如下
? 1.加入Jackson.jar
? 2.在配置文件中配置json的映射
? 3.在接受Ajax方法里面可以直接返回Object,List等,但方法前面要加上@ResponseBody注解
50.SpringMvc里面攔截器是怎么寫的
有兩種寫法,一種是實現接口,另外一種是繼承適配器類,然后在SpringMvc的配置文件中配置攔截器即可:
? <!-- 配置SpringMvc的攔截器-->
<mvc:interceptors>
??? <!-- 配置一個攔截器的Bean就可以了默認是對所有請求都攔截 -->
??? <bean id="myInterceptor"class="com.et.action.MyHandlerInterceptor"></bean>
?
??? <!-- 只針對部分請求攔截 -->
??? <mvc:interceptor>
?????? <mvc:mappingpath="/modelMap.do" />
?????? <bean class="com.et.action.MyHandlerInterceptorAdapter"/>
??? </mvc:interceptor>
</mvc:interceptors>
51. 講下SpringMvc的執行流程
系統啟動的時候根據配置文件創建spring的容器,首先是發送http請求到核心控制器disPatherServlet,spring容器通過映射器去尋找業務控制器,
使用適配器找到相應的業務類,在進業務類時進行數據封裝,在封裝前可能會涉及到類型轉換,執行完業務類后使用ModelAndView進行視圖轉發,數據放在model中,用map傳遞數據進行頁面顯示。
52. Mybatis都有哪些Executor執行器?它們之間的區別是什么?
Mybatis有三種基本的Executor執行器,SimpleExecutor、ReuseExecutor、BatchExecutor。
SimpleExecutor:每執行一次update或select,就開啟一個Statement對象,用完立刻關閉Statement對象。
ReuseExecutor:執行update或select,以sql作為key查找Statement對象,存在就使用,不存在就創建,用完后,不關閉Statement對象,而是放置于Map。
53.Spring Boot總結
1、什么是SpringBoot
描述:Spring Boot是Spring社區發布的一個開源項目,旨在幫助開發者快速并且更簡單的構建項目。大多數SpringBoot項目只需要很少的配置文件。
2、SpringBoot核心功能
2.1、獨立運行Spring項目
Spring boot 可以以jar包形式獨立運行,運行一個Spring Boot項目只需要通過java -jar xx.jar來運行。
2.2、內嵌servlet容器
Spring Boot可以選擇內嵌Tomcat、jetty或者Undertow,這樣我們無須以war包形式部署項目。
2.3、提供starter簡化Maven配置
spring提供了一系列的start pom來簡化Maven的依賴加載,例如,當你使用了spring-boot-starter-web,會自動加入如圖5-1所示的依賴包。
2.4、自動裝配Spring
SpringBoot會根據在類路徑中的jar包,類、為jar包里面的類自動配置Bean,這樣會極大地減少我們要使用的配置。當然,SpringBoot只考慮大多數的開發場景,并不是所有的場景,若在實際開發中我們需要配置Bean,而SpringBoot滅有提供支持,則可以自定義自動配置。
2.5、準生產的應用監控
SpringBoot提供基于http ssh telnet對運行時的項目進行監控。
2.6、無代碼生產和xml配置
SpringBoot不是借助與代碼生成來實現的,而是通過條件注解來實現的,這是Spring4.x提供的新特性。
3、SpringBoot優缺點
優點:
3.1、快速構建項目。
3.2、對主流開發框架的無配置集成。
3.3、項目可獨立運行,無須外部依賴Servlet容器。
3.4、提供運行時的應用監控。
3.5、極大的提高了開發、部署效率。
3.6、與云計算的天然集成。
缺點:
3.1、如果你不認同spring框架,也許這就是缺點。
4、SpringBoot特性
4.1、創建獨立的Spring項目
4.2、內置Tomcat和Jetty容器
4.3、提供一個starter POMs來簡化Maven配置
4.4、提供了一系列大型項目中常見的非功能性特性,如安全、指標,健康檢測、外部配置等
4.5、完全沒有代碼生成和xml配置文件
6、SpringBoot CLI
SpringBoot CLI 是SpringBoot提供的控制臺命令工具。
7、SpringBoot maven 構建項目
spring-boot-starter-parent:是一個特殊Start,它用來提供相關的Maven依賴項,使用它之后,常用的包依賴可以省去version標簽。
8、SpringBoot幾個常用的注解
(1)@RestController和@Controller指定一個類,作為控制器的注解
(2)@RequestMapping方法級別的映射注解,這一個用過Spring MVC的小伙伴相信都很熟悉
(3)@EnableAutoConfiguration和@SpringBootApplication是類級別的注解,根據maven依賴的jar來自動猜測完成正確的spring的對應配置,只要引入了spring-boot-starter-web的依賴,默認會自動配置Spring MVC和tomcat容器
(4)@Configuration類級別的注解,一般這個注解,我們用來標識main方法所在的類,完成元數據bean的初始化。
(5)@ComponentScan類級別的注解,自動掃描加載所有的Spring組件包括Bean注入,一般用在main方法所在的類上
(6)@ImportResource類級別注解,當我們必須使用一個xml的配置時,使用@ImportResource和@Configuration來標識這個文件資源的類。
(7)@Autowired注解,一般結合@ComponentScan注解,來自動注入一個Service或Dao級別的Bean
(8)@Component類級別注解,用來標識一個組件,比如我自定了一個filter,則需要此注解標識之后,Spring Boot才會正確識別。
54. 簡單說下你對Spring Cloud的理解
SpringCloud 是Pivotal提供的用于簡化分布式系統構建的工具集。Spring Cloud引入了云平臺連接器(CloudConnector)和服務連接器(Service Connector)的概念。云平臺連接器是一個接口,需要由云平臺提供者進行實現,以便庫中的其他模塊可以與該云平臺協同工作。
Spring Boot
Spring Cloud最重要的一點是它可以和Spring Boot一起工作,Spring Boot可以幫助開發者更容易地創建基于Spring的應用程序和服務。
從Spring Boot項目名稱中的Boot就可以看出來,Spring Boot的作用在于創建和啟動新的基于Spring框架的項目。Spring Boot會選擇最適合的Spring子項目和第三方開源庫進行整合。大部分Spring Boot應用只需要非常少的配置就可以快速運行起來。Spring Boot包含的特性如下:
創建可以獨立運行的Spring應用。
直接嵌入Tomcat或Jetty服務器,不需要部署WAR文件。
提供推薦的基礎POM文件來簡化ApacheMaven配置。
盡可能的根據項目依賴來自動配置Spring框架。
提供可以直接在生產環境中使用的功能,如性能指標、應用信息和應用健康檢查。
沒有代碼生成,也沒有XML配置文件。
服務發現和智能路由
每一個服務都含有一個特定意義的微服務架構。
也可以根據自己擴展學習的再多多發揮,不說則已,說則正確。
?
歡迎打賞
總結
以上是生活随笔為你收集整理的struts、hibernate、spring、 mybatis、 spring boot 等面试题汇总的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机常用的数制及编码
- 下一篇: HIBERNATE 持久化基础