標籤:

SSH框架面試題集錦

Hibernate工作原理及為什麼要使用Hibernate?

工作原理:

1.讀取並解析配置文件

2.讀取並解析映射信息,創建SessionFactory

3.打開Session

4.創建事務Transation

5.持久化操作

6.提交事務

7.關閉Session

8.關閉SesstionFactory

為什麼要使用Hibernate(即它的優點):

1. 對JDBC訪問資料庫的代碼做了封裝,大大簡化了數據訪問層繁瑣的重複性代碼。

2. Hibernate是一個基於JDBC的主流持久化框架,是一個優秀的ORM實現。他很大程度的簡化DAO層的編碼工作

3. hibernate使用Java反射機制,而不是位元組碼增強程序來實現透明性。

4. hibernate映射的靈活性很出色。它支持各種關係資料庫,從一對一到多對多的各種複雜關係。

2, Hibernate中get和load方法的區別

hibernate對於load方法認為該數據在資料庫中一定存在,可以放心的使用代理來延遲載入,如果在使用過程中發現了問題,只能拋異常;

hibernate對於get方法,hibernate一定要獲取到真實的數據,否則返回null。

具體介紹:

1. 對於get方法,hibernate會確認一下該id對應的數據是否存在,首先在session緩存中查找,然後在二級緩存中查找,還沒有就查詢資料庫,資料庫中沒有就返回null。

2. load方法載入實體對象的時候,根據映射文件上類級別的lazy屬性的配置(默認為true)。

分情況討論:

(1)若為true,則首先在Session緩存中查找,看看該id對應的對象是否存在,不存在則使用延遲載入,返回實體的代理類對象(該代理類為實體類的子類,由CGLIB動態生成)。等到具體使用該對象(除獲取OID以外)的時候,再查詢二級緩存和資料庫,若仍沒發現符合條件的記錄,則會拋出一個ObjectNotFoundException。

(2)若為false,就跟get方法查找順序一樣,只是最終若沒發現符合條件的記錄,則會拋出一個ObjectNotFoundException。

3,Hibernate是如何延遲載入?

Hibernate3 提供了屬性的延遲載入功能。當Hibernate在查詢數據的時候,數據並沒有存在於內存之中,而是當程序真正對數據的操作時,對象才存在於內存中,就實現了延遲載入,他節省了伺服器的內存開銷,從而提高了伺服器的性能。

4,Hibernate中怎樣實現類之間的關係?

類與類之間的關係主要體現在表與表之間的關係進行操作,它們都是對對象進行操作,我們在程序中把所有的表與類都映射在一起,它們通過配置文件中的many-to-one、one-to-many、many-to-many進行操作。

5,Hibernate中的update()和saveOrUpdate()的區別?

saveOrUpdate():

1,如果對象已經在本session中持久化了,不做任何事

2,如果另一個與本session關聯的對象擁有相同的持久化標識(identifier),拋出一個異常

3,如果對象沒有持久化標識(identifier)屬性,對其調用save()

4,如果對象的持久標識(identifier)表明其是一個新實例化的對象,對其調用save()

5,如果對象是附帶版本信息的(通過<version>或 <timestamp>)並且版本屬性的值表明其是一個新實例化的對象,調用save()。否則update() 這個對象。

update() :

是將一個遊離狀態的實體對象直接更新。

6,說說Hibernate的緩存機制。

1. 一級緩存:內部緩存存在Hibernate中,屬於應用事物級緩存。

2. 二級緩存:應用級緩存、 分散式緩存。

使用場景:數據不會被第三方修改、數據大小在可接受範圍、數據更新頻率低、同一數據被系統頻繁使用、非關鍵數據

3.引入第三方緩存(如ehcache等)。

7,如何優化Hibernate?

1.使用雙向一對多關聯,不使用單向一對多

2.靈活使用單向一對多關聯

3.不用一對一,用多對一取代

4.配置對象緩存,不使用集合緩存

5.一對多集合使用Bag,多對多集合使用Set

6. 繼承類使用顯式多態

7. 表欄位要少,表關聯不要怕多,有二級緩存撐腰

8,談談hibernate的延遲載入和openSessionInView

延遲載入要在session範圍內,用到的時候再載入;

opensessioninview是在web層寫了一個filter來打開和關閉session,這樣就表示在一次request過程中session一直開著,保證了延遲載入在session中的這個前提。

9,簡要闡述struts2的工作流程

1、客戶端瀏覽器發出HTTP請求。

2、根據web.xml配置,該請求被FilterDispatcher接收。

3、根據struts.xml配置,找到需要調用的Action類和方法,並通過IoC方式,將值注入給Aciton。

4、Action調用業務邏輯組件處理業務邏輯,這一步包含表單驗證。

5、Action執行完畢,根據struts.xml中的配置找到對應的返回結果result,並跳轉到相應頁面。

6、返回HTTP響應到客戶端瀏覽器。

10,說下Struts的設計模式

MVC模式

1,web應用程序啟動時就會載入並初始化ActionServlet;

2,用戶提交表單時,一個配置好的ActionForm對象被創建,並被填入表單相應的數 據;

3,ActionServlet根據Struts-config.xml文件配置好的設置決定是否需要表單驗證,如果需要就調用ActionForm的Validate()驗證後選擇將請求發送到哪個Action,如果Action不存在,ActionServlet會先創建這個對象,然後調用Action的execute()方法;

4,Execute()從ActionForm對象中獲取數據,完成業務邏輯,返回一個ActionForward對 象,ActionServlet再把客戶請求轉發給ActionForward對象指定的jsp組件;

5,ActionForward對象指定的jsp生成動 態的網頁,返回給客戶。

11,Struts的優缺點

優點:

1. 實現MVC模式,結構清晰,使開發者只關注業務邏輯的實現.

2. 有豐富的tag可以用 ,Struts的標記庫(Taglib),如能靈活動用,則能大大提高開發效率。另外,就目前國內的JSP開發者而言,除了使用JSP自帶的常用標記外,很少開發自己的標記,或許Struts是一個很好的起點。

3. 頁面導航.頁面導航將是今後的一個發展方向,事實上,這樣做,使系統的脈絡更加清晰。通過一個配置文件,即可把握整個系統各部分之間的聯繫,這對於後期的維護有著莫大的好處。尤其是當另一批開發者接手這個項目時,這種優勢體現得更加明顯。

4. 提供Exception處理機制 .

5. 資料庫鏈接池管理

6. 支持I18N

缺點:

1. 轉到展示層時,需要配置forward,每一次轉到展示層,相信大多數都是直接轉到jsp,而涉及到轉向, 需要配置forward,如果有十個展示層的jsp,需要配置十次struts,而且還不包括有時候目錄、文件變更,需要重新修改forward,注意,每次修改配置之後,要求重新部署整個項目,而tomcate這樣的伺服器,還必須重新啟動伺服器,如果業務變更複雜頻繁的系統,這樣的操作簡單不可想像。現在就是這樣,幾十上百個人同時在線使用我們的系統,大家可以想像一下,我的煩惱有多大。

2. Struts 的Action必需是thread-safe方式,它僅僅允許一個實例去處理所有的請求。所以action用到的所有的資源都必需統一同步,這個就引起了線程安全的問題。

3. 測試不方便. Struts的每個Action都同Web層耦合在一起,這樣它的測試依賴於Web容器,單元測試也很難實現。不過有一個Junit的擴展工具Struts TestCase可以實現它的單元測試。

4. 類型的轉換. Struts的FormBean把所有的數據都作為String類型,它可以使用工具Commons-Beanutils進行類型轉化。但它的轉化都是在Class級別,而且轉化的類型是不可配置的。類型轉化時的錯誤信息返回給用戶也是非常困難的。

5. 對Servlet的依賴性過強. Struts處理Action時必需要依賴ServletRequest 和ServletResponse,所有它擺脫不了Servlet容器。

6. 前端表達式語言方面.Struts集成了JSTL,所以它主要使用JSTL的表達式語言來獲取數據。可是JSTL的表達式語言在Collection和索引屬性方面處理顯得很弱。

7. 對Action執行的控制困難. Struts創建一個Action,如果想控制它的執行順序將會非常困難。甚至你要重新去寫Servlet來實現你的這個功能需求。

8. 對Action 執行前和後的處理. Struts處理Action的時候是基於class的hierarchies,很難在action處理前和後進行操作。

9. 對事件支持不夠. 在struts中,實際是一個表單Form對應一個Action類(或DispatchAction),換一句話說:在Struts中實際是一個表單只能 對應一個事件,struts這種事件方式稱為applicationevent,application event和component event相比是一種粗粒度的事件。

12,為什麼要使用spring(即優點)?

1. Spring能有效地組織你的中間層對象,不管你是否選擇使用了EJB。如果你僅僅使用了Struts或其他為J2EE的 API特製的framework,Spring致力於解決剩下的問題。

2. Spring能消除在許多工程中常見的對Singleton的過多使用。過多使用Singleton降低了系統的可測試性和面向對象的程度。

3. 通過一種在不同應用程序和項目間一致的方法來處理配置文件,Spring能消除各種各樣自定義格式的屬性文件的需要。曾經對某個類要尋找的是哪個魔法般的 屬性項或系統屬性感到不解,為此不得不去讀Javadoc甚至源編碼?有了Spring,你僅僅需要看看類的JavaBean屬性。Inversion ofControl的使用(在下面討論)幫助完成了這種簡化。

4.通過把對介面編程而不是對類編程的代價幾乎減少到沒有,Spring能夠促進養成好的編程習慣。

5. Spring被設計為讓使用它創建的應用儘可能少的依賴於他的APIs。在Spring應用中的大多數業務對象沒有依賴於Spring。

6. 使用Spring構建的應用程序易於單元測試。

7.Spring能使EJB的使用成為一個實現選擇,而不是應用架構的必然選擇。你能選擇用POJOs或local EJBs來實現業務介面,卻不會影響調用代碼。

8. Spring幫助你解決許多問題而無需使用EJB。Spring能提供一種EJB的替換物,它們適用於許多web應用。例如,Spring能使用AOP提供聲明性事務管理而不通過EJB容器,如果你僅僅需要與單個資料庫打交道,甚至不需要一個JTA實現。

9. Spring為數據存取提供了一個一致的框架,不論是使用的是JDBC還是O/R mapping產品(如Hibernate)。

13,列舉一下你知道的實現spring事務的幾種方式

(1),編程式事務管理:需要手動編寫代碼,在實際開發中很少使用,

(2),基於TransactionProxyFactoryBean的聲明式事務管理,需要為每個進行事務管理的類做相應配置

(3),基於AspectJ的XML的聲明式事務管理,不需要改動類,在XML文件中配置好即可

(4),基於註解的聲明式事務管理,配置簡單,需要在業務層類中添加註解

14,談談spring事務的隔離級別和傳播行為

隔離級別:

- DEFAULT使用資料庫默認的隔離級別

- READ_UNCOMMITTED會出現臟讀,不可重複讀和幻影讀問題

- READ_COMMITTED會出現重複讀和幻影讀

- REPEATABLE_READ會出現幻影讀

- SERIALIZABLE最安全,但是代價最大,性能影響極其嚴重

和傳播行:

- REQUIRED存在事務就融入該事務,不存在就創建事務

- SUPPORTS存在事務就融入事務,不存在則不創建事務

- MANDATORY存在事務則融入該事務,不存在,拋異常

- REQUIRES_NEW總是創建新事務

- NOT_SUPPORTED存在事務則掛起,一直執行非事務操作

- NEVER總是執行非事務,如果當前存在事務則拋異常

- NESTED嵌入式事務

15,什麼是DI機制?

依賴注入(Dependecy Injection)和控制反轉(Inversion of Control)是同一個概念,具體的講:當某個角色需要另外一個角色協助的時候,在傳統的程序設計過程中,通常由調用者來創建被調用者的實例。

但在spring中 創建被調用者的工作不再由調用者來完成,因此稱為控制反轉。創建被調用者的工作由spring來完成,然後注入調用者

因此也稱為依賴注入。

spring以動態靈活的方式來管理對象 , 注入的兩種方式,設置注入和構造注入。

設置注入的優點:直觀,自然

構造注入的優點:可以在構造器中決定依賴關係的順序。

16,什麼是AOP?

面向切面編程(AOP)完善spring的依賴注入(DI),

面向切面編程在spring中主要表現為兩個方面 :

1.面向切面編程提供聲明式事務管理

2.spring支持用戶自定義的切面


推薦閱讀:

如何從零開發一個框架(序)
一名Infrastructure Engineer需要掌握哪些技術?
框架到底是個什麼東西?
Spark與深度學習框架——H2O、deeplearning4j、SparkNet
有哪些優秀的 C/C++ 開源代碼框架?這些框架的設計思路是怎樣的?

TAG:SSH | 框架 |