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++ 開源代碼框架?這些框架的設計思路是怎樣的?