1. 程式人生 > >struts、hibernate、spring、 mybatis、 spring boot 等面試題彙總

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的表示式語言來獲取資料。可是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載入資料就是一種非同步技術),同時還可以起到削峰作用(應對瞬時高併發)。&quot;能推遲處理的都要推遲處理"是網站優化的第二定律,而非同步是踐行網站優化第二定律的重要手段。
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配置檔案。

  服務發現和智慧路由

  每一個服務都含有一個特定意義的微服務架構。

也可以根據自己擴充套件學習的再多多發揮,不說則已,說則正確。

相關推薦

strutshibernatespring mybatis spring boot 試題彙總

1、談談你對Struts的理解。 答: 1. struts是一個按MVC模式設計的Web層框架,其實它就是一個大大的servlet,這個Servlet名為ActionServlet,或是ActionServlet的子類。我們可以在web.xml檔案中將符合某種特徵的所有請

SSM:Spring整合MybatisSpringMVC

SSM,是當今最流行的大框架。 對於一個工程師來說,這是吃飯的工具。當然,這是一個技能。   <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM

Java基礎Java集合多執行緒JDBCHTTPJSPServletStruts試題彙總(附答案)

[Java基礎] 1.”==”和equals方法有什麼區別? 答:==是運算子,equals是方法,方法可以通過重寫改變其行為,如String的equals就是比較字串內容。 2. switch語句能否作用在byte上,能否作用在long上,能否作用在String上?

有關java類對象初始化的話題,從一道試題切入

() 深入理解java 補充 [] base sna 字體 都是 spa 最近在整理東西時,剛好碰到以前看的一道有關java類、對象初始化相關題目,覺得答案並不是非常好(記憶點比較差,不是很連貫)。加上剛好復習完類加載全過程的五個階段(加載-驗證-準備-解析-初始化),所以

JavaScript同步非同步回撥執行順序之經典閉包setTimeout試題分析

初心-楊瑞超個人部落格誠邀您加入qq群(IT-程式猿-技術交流群):757345416 大家注意了,教大家一道口訣: 同步優先、非同步靠邊、回撥墊底(讀起來不順) 用公式表達就是: 同步 => 非同步 => 回撥 有一道經典的面試題: for

C/C++ 之 多執行緒 百度華為360 面試試題彙總(一)

以下提供答案參考: 第一題:執行緒的基本概念、執行緒的基本狀態及狀態之間的關係? 執行緒,有時稱為輕量級程序,是CPU使用的基本單元;它由執行緒ID、程式計數器、暫存器集合和堆疊組成。它與屬於同一程序的其他執行緒共享其程式碼段、資料段和其他作業系統資源(如開啟檔案和訊號)。

機器學習——神經網路深度學習 知識點總結 及 試題彙總

1、反向傳播思想: 計算出輸出與標籤間的損失函式值,然後計算其相對於每個神經元的梯度,根據梯度方向更新權值。 (1)將訓練集資料輸入到ANN的輸入層,經過隱藏層,最後達到輸出層並輸出結果,這是ANN的前向傳播過程; (2)由於ANN的輸出結果與實際結果有誤差,則計

Hibernate的工作流程以及三種狀態(試題

數據庫 delet 垃圾 打開 ron 工作流 沒有 flush 行數據 Hibernate的工作流程以及三種狀態 轉載自:http://www.cnblogs.com/fifiyong/p/6390699.html Hibernate的工作流程: 1. 讀取並解

Spring Boot學習總結(14)——Spring Boot常見面試題彙總

1、什麼是 Spring Boot? Spring Boot 是 Spring 開源組織下的子專案,是 Spring 元件一站式解決方案,主要是簡化了使用 Spring 的難度,簡省了繁重的配置,提供了各種啟動器,開發者能快速上手。 2、為什麼要用 Spring Boot

鬆哥整理了 15 道 Spring Boot 高頻試題,看完當面霸

什麼是麵霸?就是在面試中,神擋殺神佛擋殺佛,見招拆招,面到面試官自慚形穢自嘆不如!鬆哥希望本文能成為你麵霸路上的墊腳石! 做 Java 開發,沒有人敢小覷 Spring Boot 的重要性,現在出去面試,無論多小的公司 or 專案,都要跟你扯一扯 Spring Boot,扯一扯微服務,不會?沒用過? Sor

15 道 Spring Boot 高頻試題,看完直接當面霸【入門實用】

前言 本文轉自鬆哥(網名:江南一點雨)的一篇實用入門文章,寫的挺好的,希望對各位有所幫助。 什麼是麵霸?就是在面試中,神擋殺神佛擋殺佛,見招拆招,面到面試官自慚形穢自嘆不如!鬆哥希望本文能成為你麵霸路上的墊腳石! 做 Java 開發,沒有人敢小覷 Spring Boot 的重要性,現在出去面試,無論多小的公

hibernatemybatisspring data 的對比

lec 機制 程序 共享 編寫 .get lis 技術方案 found 轉: 1.概念: Hibernate :Hibernate是一個開放源代碼的對象關系映射框架,它對JDBC進行了非常輕量級的對象封裝,使得Java程序員可以隨心所欲的使用對象編程思維來操縱數據庫。著力點

javastruts2框架hibernate框架spring框架技術springMVC框架mybatis框架,javaweb專案開發的完整流程

使用javaEE技術是:spring+springMVC+mybatis框架整合技術 前端使用的技術包含:jquery、ajax、js、css、bootstrap等 教學系統 使用javaEE開發的線上教學系統,使用的是javaEE的主流框架技術,使用主流的前端技術,專案包含全部的專案原始碼以及資料檔案

3大框架StrutsHibernateSpring簡單瞭解

3大框架:Struts、Hibernate、Spring 基本概念:Spring/Struts/Hibernate是幹嘛用的? 三個框架產生的技術歷史背景 學習前首先應該掌握的基礎知識 學習一個開發框架的基本方法 如何學習Spring框架

使用MyEclipse整合ssh(StrutsSpringHibernate)三大框架(環境搭載+例項原始碼下載)

前言 SSH不是一個框架,而是多個框架(struts+spring+hibernate)的整合,是目前較流行的一種Web應用程式開源整合框架,用於構建靈活、易於擴充套件的多層Web應用程式。 整合SSH框架的系統從職責上分為四層:表示層、業務邏輯層、資料持久層和域模組層(實

java面試小結——框架(hibernateMyBatisspringSpring MVC)

Hibernate 什麼是ORM 物件關係對映(Object-Relational Mapping,簡稱ORM)是一種為了解決程式的面向物件模型與資料庫的關係模型互不匹配問題的技術;簡單的說,ORM是通過使用描述物件和資料庫之間對映的元資料(在Ja

strutshibernatespringjre version

Note that newer ORM releases are backwards compatible with older JPA versions (ex: ORM 4.3 with JPA 1.0). However, newer ORM releases may not be compatib

ORM框架 MybatisHibernateSpring Data JPA之到底該用誰,誰更牛*

在持久層框架中無可厚非的就是mybatis了,但是也會經常被人問到為啥要用mybatis,為啥不用hibernate,jpa。很多人各級都是地鐵爺爺看手機的表情,似乎從來沒想過這個問題。“公司叫用我就用了唄” 如果期望有好的發展我覺得我們應該學會知其然&知其所以然,這樣才會有自

大型分布式項目項目實戰Springmvc+Spring+Mybatis+Maven+CMS+Redis+Solr+Linux+Nginx+單點登錄分布式緩存負載均衡視頻課程

edi mina img solr 技術 性能提升 登錄 rom nginx * { font-family: "Microsoft YaHei" !important } h1 { color: #FF0 } 15套java架構師、集群、高可用、高可擴 展、高性能、高

Java Struts2SpringHibernate框架及jar包下載

-i tex eas nsa 項目 ack slf4 n-2 3.4 一、框架的下載 1、Struts2:http://struts.apache.org/download 2、Spring:http://www.springsource.org/download/co