java中三大框架和項目模擬面試題目_第1頁
java中三大框架和項目模擬面試題目_第2頁
java中三大框架和項目模擬面試題目_第3頁
java中三大框架和項目模擬面試題目_第4頁
java中三大框架和項目模擬面試題目_第5頁
已閱讀5頁,還剩11頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、框架和項目模擬面試題目- 于洋 整理1. Struts2 框架題目1.1. struts2 工作流程Struts 2框架本身大致可以分為3個部分:核心控制器FilterDispatcher、業務控制器Action和用戶實現的企業業務邏輯組件。核心控制器FilterDispatcher是Struts 2框架的基礎,包含了框架內部的控制流程和處理機制。業務控制器Action和業務邏輯組件是需要用戶來自己實現的。用戶在開發Action和業務邏輯組件的同時,還需要編寫相關的配置文件,供核心控制器FilterDispatcher來使用。Struts 2的工作流程相對于Struts 1要簡單,與WebWo

2、rk框架基本相同,所以說Struts 2是WebWork的升級版本。基本簡要流程如下:1 、客戶端初始化一個指向Servlet容器的請求;2、 這個請求經過一系列的過濾器(Filter)(這些過濾器中有一個叫做ActionContextCleanUp的可選過濾器, 這個過濾器對于Struts2和其他框架的集成很有幫助,例如:SiteMesh Plugin)3 、接著FilterDispatcher被調用,FilterDispatcher詢問ActionMapper來決定這個請是否需要調用某個Action4、如果ActionMapper決定需要調用某個Action,FilterDispatche

3、r把請求的處理交給ActionProxy5、ActionProxy通過Configuration Manager詢問框架的配置文件,找到需要調用的Action類6、ActionProxy創建一個ActionInvocation的實例。7、ActionInvocation實例使用命名模式來調用,在調用Action的過程前后,涉及到相關攔截器(Intercepter)的調用。8、一旦Action執行完畢,ActionInvocation負責根據struts.xml中的配置找到對應的返回結果。返回結果通常是(但不總是,也可 能是另外的一個Action鏈)一個需要被表示的JSP或者FreeMarker

4、的模版。在表示的過程中可以使用Struts2 框架中繼承的標簽。在這個過程中需要涉及到ActionMapper9、響應的返回是通過我們在web.xml中配置的過濾器 10、如果ActionContextCleanUp是當前使用的,則FilterDispatecher將不會清理sreadlocal ActionContext;如果ActionContextCleanUp不使用,則將會去清理sreadlocals。1.2. 過濾器Filter和struts2攔截器的區別1、攔截器是基于java反射機制的,而過濾器是基于函數回調的。2、過濾器依賴于servlet容器,而攔截器不依賴于servlet容

5、器。3、攔截器只能對Action請求起作用,而過濾器則可以對幾乎所有請求起作用。4、攔截器可以訪問Action上下文、值棧里的對象,而過濾器不能。1.3. 為什么要使用struts2框架Struts2 是一個相當強大的Java Web開源框架,是一個基于POJO的Action的MVC Web框架。它基于當年的Webwork和XWork框架,繼承其優點,同時做了相當的改進。1.Struts2基于MVC架構,框架結構清晰,開發流程一目了然,開發人員可以很好的掌控開發的過程。2使用OGNL進行參數傳遞。OGNL提供了在Struts2里訪問各種作用域中的數據的簡單方式,你可以方便的獲取Request,

6、Attribute,Application,Session,Parameters中的數據。大大簡化了開發人員在獲取這些數據時的代碼量。3強大的攔截器Struts2 的攔截器是一個Action級別的AOP,Struts2中的許多特性都是通過攔截器來實現的,例如異常處理,文件上傳,驗證等。攔截器是可配置與重用的,可以將一些通用的功能如:登錄驗證,權限驗證等置于攔截器中以完成一些Java Web項目中比較通用的功能。在我實現的的一Web項目中,就是使用Struts2的攔截器來完成了系統中的權限驗證功能。4易于測試Struts2的Action都是簡單的POJO,這樣可以方便的對Struts2的Acti

7、on編寫測試用例,大大方便了5Java Web項目的測試。易于擴展的插件機制在Struts2添加擴展是一件愉快而輕松的事情,只需要將所需要的Jar包放到WEB-INF/lib文件夾中,在struts.xml中作一些簡單的設置就可以實現擴展。6模塊化管理Struts2已經把模塊化作為了體系架構中的基本思想,可以通過三種方法來將應用程序模塊化:將配置信息拆分成多個文件把自包含的應用模塊創建為插件創建新的框架特性,即將與特定應用無關的新功能組織成插件,以添加到多個應用中去。7全局結果與聲明式異常為應用程序添加全局的Result,和在配置文件中對異常進行處理,這樣當處理過程中出現指定異常時,可以跳轉到

8、特定頁面。他的如此之多的優點,是很多人比較的青睞,與spring ,Hibernate進行結合,組成了現在比較流行的ssh框架,當然每個公司都要自己的框架,也是ssh變異的產品。1.4. struts2 有哪些優點1)在軟件設計上Struts2的應用可以不依賴于Servlet API和struts API。 Struts2的這種設計屬于無侵入式設計;  2)攔截器,實現如參數攔截注入等功能;  3)類型轉換器,可以把特殊的請求參數轉換成需要的類型;  4)多種表現層技術,如:JSP、freeMarker、

9、Velocity等;  5)Struts2的輸入校驗可以對指定某個方法進行校驗;  6)提供了全局范圍、包范圍和Action范圍的國際化資源文件管理實現 1.5. struts2 框架的核心控制器是什么?它有什么作用?1)Struts2框架的核心控制器是StrutsPrepareAndExecuteFilter。  2)作用:   負責攔截由<url-pattern>/*</url-pattern>指定的所有用戶請求,當用戶請求到達時,該Filter會過濾用戶的請求。默認

10、情況下,如果用戶請求的路徑  不帶后綴或者后綴以.action結尾,這時請求將被轉入struts2框架處理,否則struts2框架將略過該請求的處理。  可以通過常量"struts.action.extension"修改action的后綴,如:  <constant name=nsion" value="do"/>  如果用戶需要指定多個請求后綴,則多個后綴之間以英文逗號(,)隔開。<constant name=&qu

11、ot;struts.action.extension" value="do,go"/>   1.6. struts2的配置文件的加載順序struts2 core 核心包 org/apache/struts2/perties (定義Struts2 常量)struts2 core 核心包 struts-default.xml (定義struts2 默認 package 、 攔截器、 結果類型)struts2 plugin 插件包 struts-plugin.xml(定義struts2 插件的配置)struts.

12、xml (自定義struts2 配置文件)perties (自定義struts2 常量文件)web.xml 中定義的struts2 常量1.7. struts2 如何訪問HttpServletRequest、HttpSession、ServletContext 三個域對象?方案一:  HttpServletRequest request =ServletActionContext.getRequest();  HttpServletResponse response =ServletActionContext.ge

13、tResponse();  HttpSession  session=   request.getSession(); ServletContext servletContext=ServletActionContext.getServletContext();      方案二:  類 implements ServletRequestAware,ServletResponseAware,SessionAware,

14、ServletContextAware  注意:框架自動傳入對應的域對象 ps:ActionContext.getContext() 可以獲得三個Map對象,間接對三個域對象中數據進行操作 1.8. struts2如何對指定的方法進行驗證?1)validate()方法會校驗action中所有與execute方法簽名相同的方法; 2)要校驗指定的方法通過重寫validateXxx()方法實現, validateXxx()只會校驗action中方法名為Xxx的方法。其中Xxx的第一個字母要大寫; 3)當某個數據校驗失敗時,調用addFieldError()方法往系統的

15、fieldErrors添加校驗失敗信息(為了使用addFieldError()方法,action可以繼承ActionSupport), 如果系統 的fieldErrors包含失敗信息,struts2會將請求轉發到名為input的result; 4)在input視圖中可以通過<s:fielderror/>顯示失敗信息。 5)先執行validateXxxx()->validate()->如果出錯了,會轉發<result name="input"/>所指定的頁面,如果不出錯,會直接進行Action:execute()方法1.9. struts2

16、 默認能解決get和post亂碼問題嗎不能。struts.i18n.encoding=UTF-8屬性值只能解析POST提交下的亂碼問題。1.10. 請說出struts2中至少5個默認攔截器fileUpload 提供文件上傳功能 i18n 記錄用戶選擇的locale cookies 使用配置的name,value來是指cookies checkbox 添加了checkbox自動處理代碼,將沒有選中的checkbox的內容設定為false,而html默認情況下不提交沒有選中的checkbox。 chain 讓前一個Action的屬性可以被后一個Action訪問,現在和chain類型的result(

17、)結合使用。 params 將請求參數封裝到Struts2 Action中 validate 執行struts2 的請求參數校驗workflow 判斷流程中是否存在FieldError ,如果存在,跳轉到input對象視圖modelDriven 將struts2 Action 實現ModelDriven 接口提供model對象壓入root棧頂部token 防止頁面表單重復提交1.11. 值棧ValueStack的原理和生命周期1)ValueStack貫穿整個 Action 的生命周期,保存在request域中,所以ValueStack和request的生命周期一樣。當Str

18、uts2接受一個請求時,會迅速創建ActionContext,  ValueStack,action。然后把action存放進ValueStack,所以action的實例變量可以被OGNL訪問。 請求來的時候,action、ValueStack的生命開始,請求結束,action、    ValueStack的生命結束;  2)action是多例的,和Servlet不一樣,Servelt是單例的;  3)每個action的都有一個對應的值棧,值棧存放的數據類型是該action的實例,以及

19、該action中的實例變量,Action對象默認保存在棧頂;  4)ValueStack本質上就是一個ArrayList;  5)關于ContextMap,Struts 會把下面這些映射壓入 ContextMap 中:  parameters  :   該 Map 中包含當前請求的請求參數  request     :   該 

20、Map 中包含當前 request 對象中的所有屬性  session :該 Map 中包含當前 session 對象中的所有屬性  application :該 Map 中包含當前 application 對象中的所有屬性  attr:該 Map 按如下順序來檢索某個屬性: request, session, application  

21、         6)使用OGNL訪問值棧的內容時,不需要#號,而訪問request、session、application、attr時,需要加#號;  7)注意: Struts2中,OGNL表達式需要配合Struts標簽才可以使用。如:<s:property value="name"/>  8)在struts2配置文件中引用ognl表達式 ,引用值棧的值 ,此時使用的"$"

22、,而不是#或者%;  1.12. ActionContext、ServletContext、pageContext區別?1)ActionContext是當前的Action的上下文環境,通過ActionContext可以獲取到request、session、ServletContext等與Action有關的對象的引用; 2)ServletContext是域對象,一個web應用中只有一個ServletContext,生命周期伴隨整個web應用; 3)pageContext是JSP中的最重要的一個內置對象,可以通過pageContext獲取其他域對象的應用,同時它是一個域對象,作

23、用范圍只針對當前頁面,當前頁面結束時,pageContext銷毀, 生命周期是JSP四個域對象中最小的。 1.13. resul的type屬性中有哪些結果類型?dispatcherstruts默認的結果類型,把控制權轉發給應用程序里的某個資源不能把控制權轉發給一個外部資源,若需要把控制權重定向到一個外部資源, 應該使用 redirect 把響應重定向到另一個資源(包括一個外部資源) redirectAction把響應重定向到另一個 Action freemarker、velocity、chain、httpheader、xslt、plainText、stream struts2-json-plu

24、gin 自定義 json 結果類型,用于返回json格式數據1.14. 攔截器的生命周期與工作過程1)每個攔截器都是實現了Interceptor接口的 Java 類; 2)init(): 該方法將在攔截器被創建后立即被調用, 它在攔截器的生命周期內只被調用一次. 可以在該方法中對相關資源進行必要的初始化; 3)intercept(ActionInvocation invocation): 每攔截一個動作請求, 該方法就會被調用一次; 4)destroy: 該方法將在攔截器被銷毀之前被調用, 它在攔截器的生命周期內也只被調用一次; 2. Hibernate3 框架題目2.1. 為什么要使用Hib

25、ernate框架?它有什么優勢?² Hibernate對JDBC訪問數據庫的代碼做了封裝,大大簡化了數據訪問層繁瑣的重復性代碼。 ² Hibernate是一個基于JDBC的主流持久化框架,是一個優秀的ORM實現,它很大程度的簡化了DAO層編碼工作。 ² Hibernate使用Java的反射機制,而不是字節碼增強程序類實現透明性。² 因為它是一個輕量級框架。映射的靈活性很出色。它支持很多關系型數據庫,從一對一到多對多的各種復雜關系。2.2. Hibernate工作原理(編程步驟)2.讀取并解析Hibernate映射文件,創建SessionFactory3.

26、打開Sesssion yantingxin4.創建事務Transation 5.持久化操作 6.提交事務7.關閉Session8.關閉SesstionFactory2.3. Hibernate是如何實現延遲加載的?延遲加載機制是為了避免一些無謂的性能開銷而提出來的,所謂延遲加載就是當在真正需要數據的時候,才真正執行數據加載操作。在Hibernate中提供了對實體對象的延遲加載、對集合的延遲加載和對屬性的延遲加載。當Hibernate在查詢數據的時候,數據并沒有存儲在內存中,只是使用Javassist為目標類創建子類代理對象,當程序真正對數據的進行操作時,代理對象的handler才去訪問數據,加

27、載對象存在于內存中,這就實現了延遲加載,它節省了服務器的內存開銷,從而提高了服務器的性能。2.4. Hibernate 有那幾種查詢方式(1) 導航對象圖查詢(2) OID查詢(3) HQL查詢(4) QBC查詢(5) 本地SQL查詢2.5. Hibernate中load方法和get方法區別區別1:如果數據庫中沒有userId對應的記錄,通過get方法加載,則返回的是null值;如果通過load方法加載,則返回一個代理對象,當通過user對象調用某個方法(比如user.getPassword())時,會拋出異常:org.hibernate.ObjectNotFoundException; 區別

28、2:load支持延遲加載,get不支持延遲加載。2.6. Hibernate持久化對象有幾種狀態?臨時狀態、游離狀態、持久化狀態2.7. HQL和SQL語句的區別?HQL面向對象,而SQL操縱關系型數據庫2.8. 說下Hibernate的緩存機制緩存是介于應用程序和物理數據源之間,其作用是為了降低應用程序對物理數據源訪問的頻次,從而提高了應用的運行性能。Hibernate的緩存包括Session的緩存和SessionFactory的緩存,其中SessionFactory的緩存又可以分為兩類:內置緩存和外置緩存。Session的緩存是內置的,不能被卸載,也被稱為Hibernate的第一級緩存。S

29、essionFactory的內置緩存和Session的緩存在實現方式上比較相似,前者是SessionFactory對象的一些集合屬性包含的數據,后者是指Session的一些集合屬性包含的數據。SessionFactory的內置緩存中存放了映射元數據和預定義SQL語句,映射元數據是映射文件中數據的拷貝,而預定義SQL語句是在Hibernate初始化階段根據映射元數據推導出來,SessionFactory的內置緩存是只讀的,應用程序不能修改緩存中的映射元數據和預定義SQL語句,因此SessionFactory不需要進行內置緩存與映射文件的同步。SessionFactory的外置緩存是一個可配置的插

30、件。在默認情況下,SessionFactory不會啟用這個插件。外置緩存的數據是數據庫數據的拷貝,外置緩存的介質可以是內存或者硬盤。SessionFactory的外置緩存也被稱為Hibernate的第二級緩存。2.9. 如何優化Hibernate? 初用HIBERNATE的人也許都遇到過性能問題,實現同一功能,用HIBERNATE與用JDBC性能相差十幾倍很正常,如果不及早調整,很可能影響整個項目的進度。大體上,對于HIBERNATE性能調優的主要考慮點如下:Ø 數據庫設計調整Ø HQL優化Ø API的正確使用(如根據不同的業務類型選用不同的集合及查詢API)&#

31、216; 主配置參數(日志,查詢緩存,fetch_size, batch_size等)Ø 映射文件優化(ID生成策略,二級緩存,延遲加載,關聯優化)Ø 一級緩存的管理Ø 針對二級緩存,還有許多特有的策略Ø 事務控制策略。1、 數據庫設計a) 降低關聯的復雜性b) 盡量不使用聯合主鍵c) ID的生成機制,不同的數據庫所提供的機制并不完全一樣d) 適當的冗余數據,不過分追求高范式2、 HQL優化HQL如果拋開它同HIBERNATE本身一些緩存機制的關聯,HQL的優化技巧同普通的SQL優化技巧一樣,可以很容易在網上找到一些經驗之談。在性能瓶頸的地方使用硬編碼的

32、 JDBC。 3、 主配置a) 查詢緩存,同下面講的緩存不太一樣,它是針對HQL語句的緩存,即完全一樣的語句再次執行時可以利用緩存數據。但是,查詢緩存在一個交易系統(數據變更頻繁,查詢條件相同的機率并不大)中可能會起反作用:它會白白耗費大量的系統資源但卻難以派上用場。b) fetch_size,同JDBC的相關參數作用類似,參數并不是越大越好,而應根據業務特征去設置c) batch_size同上。d) 生產系統中,切記要關掉SQL語句打印。4、 緩存a) 數據庫級緩存:這級緩存是最高效和安全的,但不同的數據庫可管理的層次并不一樣,比如,在ORACLE中,可以在建表時指定將整個表置于緩存當中。b

33、) SESSION緩存:在一個HIBERNATE SESSION有效,這級緩存的可干預性不強,大多于HIBERNATE自動管理,但它提供清除緩存的方法,這在大批量增加/更新操作是有效的。比如,同時增加十萬條記錄,按常規方式進行,很可能會發現OutofMemeroy的異常,這時可能需要手動清除這一級緩存:Session.evict以及Session.clearc) 應用緩存:在一個SESSIONFACTORY中有效,因此也是優化的重中之重,因此,各類策略也考慮的較多,在將數據放入這一級緩存之前,需要考慮一些前提條件:i. 數據不會被第三方修改(比如,是否有另一個應用也在修改這些數據?)ii. 數

34、據不會太大iii. 數據不會頻繁更新(否則使用CACHE可能適得其反)iv. 數據會被頻繁查詢v. 數據不是關鍵數據(如涉及錢,安全等方面的問題)。緩存有幾種形式,可以在映射文件中配置:read-only(只讀,適用于很少變更的靜態數據/歷史數據),nonstrict-read-write,read-write(比較普遍的形式,效率一般),transactional(JTA中,且支持的緩存產品較少)d) 分布式緩存:同c)的配置一樣,只是緩存產品的選用不同,在目前的HIBERNATE中可供選擇的不多,oscache, jboss cache,目前的大多數項目,對它們的用于集群的使用(特別是關鍵

35、交易系統)都持保守態度。在集群環境中,只利用數據庫級的緩存是最安全的。5、 延遲加載a) 實體延遲加載:通過使用動態代理實現b) 集合延遲加載:通過實現自有的SET/LIST,HIBERNATE提供了這方面的支持c) 屬性延遲加載:6、 方法選用a) 完成同樣一件事,HIBERNATE提供了可供選擇的一些方式,但具體使用什么方式,可能用性能/代碼都會有影響。顯示,一次返回十萬條記錄(List/Set/Bag/Map等)進行處理,很可能導致內存不夠的問題,而如果用基于游標(ScrollableResults)或Iterator的結果集,則不存在這樣的問題。b) Session的load/get方

36、法,前者會使用二級緩存,而后者則不使用。c) Query和list/iterator,如果去仔細研究一下它們,你可能會發現很多有意思的情況,二者主要區別(如果使用了Spring,在HibernateTemplate中對應find,iterator方法):i. list只能利用查詢緩存(但在交易系統中查詢緩存作用不大),無法利用二級緩存中的單個實體,但list查出的對象會寫入二級緩存,但它一般只生成較少的執行SQL語句,很多情況就是一條(無關聯)。ii. iterator則可以利用二級緩存,對于一條查詢語句,它會先從數據庫中找出所有符合條件的記錄的ID,再通過ID去緩存找,對于緩存中沒有的記錄,

37、再構造語句從數據庫中查出,因此很容易知道,如果緩存中沒有任何符合條件的記錄,使用iterator會產生N+1條SQL語句(N為符合條件的記錄數)iii. 通過iterator,配合緩存管理API,在海量數據查詢中可以很好的解決內存問題,如:while(it.hasNext()YouObject object = (YouObject)it.next();session.evict(youObject);sessionFactory.evice(YouObject.class, youObject.getId();如果用list方法,很可能就出OutofMemory錯誤了。iv. 通過上面的說明

38、,我想你應該知道如何去使用這兩個方法了。7、 集合的選用在HIBERNATE 3.6文檔的“21.5理解集合性能”中有詳細的說明。² ists,maps 和 sets 用于更新效率最高² Bag 和 list 是反向集合類中效率最高的² 一次性刪除(One shot delete)8、 事務控制事務方面對性能有影響的主要包括:事務方式的選用,事務隔離級別以及鎖的選用a) 事務方式選用:如果不涉及多個事務管理器事務的話,不需要使用JTA,只有JDBC的事務控制就可以。b) 事務隔離級別:參見標準的SQL事務隔離級別c) 鎖的選用:悲觀鎖(一般由具體的事務管理器實現)

39、,對于長事務效率低,但安全。樂觀鎖(一般在應用級別實現),如在HIBERNATE中可以定義VERSION字段,顯然,如果有多個應用操作數據,且這些應用不是用同一種樂觀鎖機制,則樂觀鎖會失效。因此,針對不同的數據應有不同的策略,同前面許多情況一樣,很多時候我們是在效率與安全/準確性上找一個平衡點,無論如何,優化都不是一個純技術的問題,你應該對你的應用和業務特征有足夠的了解。9、 批量操作即使是使用JDBC,在進行大批數據更新時,BATCH與不使用BATCH有效率上也有很大的差別。我們可以通過設置batch_size來讓其支持批量操作。舉個例子,要批量刪除某表中的對象,如“delete Accou

40、nt”,打出來的語句,會發現HIBERNATE找出了所有ACCOUNT的ID,再進行刪除,這主要是為了維護二級緩存,這樣效率肯定高不了,在后續的版本中增加了bulk delete/update,但這也無法解決緩存的維護問題。也就是說,由于有了二級緩存的維護問題,HIBERNATE的批量操作效率并不盡如人意!從前面許多要點可以看出,很多時候我們是在效率與安全/準 確性上找一個平衡點,無論如何,優化都不是一個純技術的問題,你應該對你的應用和業務特征有足夠的了解,一般的,優化方案應在架構設計期就基本確定,否則 可能導致沒必要的返工,致使項目延期,而作為架構師和項目經理,還要面對開發人員可能的抱怨,必

41、竟,我們對用戶需求更改的控制力不大,但技術/架構風險是應該在初期意識到并制定好相關的對策。還有一點要注意,應用層的緩存只是錦上添花,永遠不要把它當救命稻草,應用的根基(數據庫設計,算法,高效的操作語句,恰當API的選擇等)才是最重要的。2.10. 如何解決關聯數據延遲加載NoSession問題 ² 在確定關聯數據是必須時,可以配置 lazy=false 使用立即加載策略² 使用OpenSessionInView 模式,在需要數據時,才去加載² 在程序中,根據業務需要,手動Hibernate.initialize() 手動初始化延遲加載數據 2.11. Hibern

42、ate 的 sessionfactory 和 session 的區別是什么?如何處理 session 線程不安全問題?sessionfactory 是一個數據源對應著一個 sessionfactory,也就說他是屬于二級緩存,如果是集群環境,他可以動態的配置使用這個數據源或者不使用這個數據源,session 是等于一次回話,也就是說是一級緩存,并且是由 sessionfactory創建的,再有 sessionfactory 是線程安全的,相反的session 不安全的;解決 session 不安全的問題,就是大家通常用的常規寫法,一次會話后關閉 session,避免session 重用;2.1

43、2. Hibernate 如何實現動態查詢?DetachedCriteria 與 Criteria 的區別是什么?條件查詢唄,編程的方式代替 HQL 語句,DetachedCriteria 單詞很簡明了,Detached 是分離,分離,分離什么,當然是業務層的應用,原本的Criteria 是與 session 綁定的,現在用DetachedCriteria這個來分離。3. Spring3 框架題目3.1. Spring框架的優點² 方便解耦,簡化開發n Spring就是一個大工廠,可以將所有對象創建和依賴關系維護,交給Spring管理² AOP編程的支持n Spring提供

44、面向切面編程,可以方便的實現對程序進行權限攔截、運行監控等功能² 聲明式事務的支持n 只需要通過配置就可以完成對事務的管理,而無需手動編程² 方便程序的測試n Spring對Junit4支持,可以通過注解方便的測試Spring程序² 方便集成各種優秀框架n Spring不排斥各種優秀的開源框架,其內部提供了對各種優秀框架(如:Struts、Hibernate、MyBatis、Quartz等)的直接支持² 降低JavaEE API的使用難度n Spring 對JavaEE開發中非常難用的一些API(JDBC、JavaMail、遠程調用等),都提供了封裝,使

45、這些API應用難度大大降低3.2. 談談你理解的IoC和DI IOC是Inversion of Control的縮寫,控制反轉,簡單來說就是把復雜系統分解成相互合作的對象,借助于“第三方”實現具有依賴關系的對象之間的解耦。 這里的第三方 就是指Ioc容器(Spring 框架),所有對象的創建權,都交由Spring管理。DI的出現,是對IoC的更近一步分析,既然IOC是控制反轉,那么到底是“哪些方面的控制被反轉了呢?經過詳細地分析和論證后,他得出了答案:“獲得依賴對象的過程被反轉了”。控制被反轉之后,獲得依賴對象的過程由自身管理變為了由IOC容器主動注入。依賴注入(DI)和控制反轉(IOC)是從

46、不同的角度的描述的同一件事情,就是指通過引入IOC容器,利用依賴關系注入的方式,實現對象之間的解耦。3.3. Spring中BeanFactory和ApplicationContext 的作用和區別?作用:1. BeanFactory負責讀取bean配置文檔,管理bean的加載,實例化,維護bean之間的依賴關系,負責bean的聲明周期。2. ApplicationContext除了提供上述BeanFactory所能提供的功能之外,還提供了更完整的框架功能:a. 國際化支持b. 資源訪問:Resource rs = ctx. getResource(”classpath:p

47、erties”), “file:c:/perties”c. 事件傳遞:通過實現ApplicationContextAware接口3.4. Spring 中有幾種事務管理?編程式事務管理,通過TransactionTemplate 實現 聲明式事務管理,基于AOP 切面編程實現 ,無需編碼,靈活性更高3.5. Spring 的 Bean作用域在spring2.0之前bean只有2種作用域即:singleton(單例)、non-singleton(也稱 prototype),Spring2.0以后,增加了session、request、global session三種專用于We

48、b應用程序上下文的Bean。因此,默認情況下Spring2.0現在有五種類型的Bean。1、singleton作用域當一個bean的作用域設置為singleton,那么Spring IOC容器中只會存在一個共享的bean實例,并且所有對bean的請求,只要id與該bean定義相匹配,則只會返回bean的同一實例。換言之,當把一個bean定義設置為singleton作用域時,Spring IOC容器只會創建該bean定義的唯一實例。這個單一實例會被存儲到單例緩存(singleton cache)中,并且所有針對該bean的后續請求和引用都將返回被緩存的對象實例,這里要注意的是singleton作

49、用域和GOF設計模式中的單例是完全不同的,單例設計模式表示一個ClassLoader中只有一個class存在,而這里的singleton則表示一個容器對應一個bean,也就是說當一個bean被標識為singleton時候,spring的IOC容器中只會存在一個該bean。2、prototypeprototype作用域部署的bean,每一次請求(將其注入到另一個bean中,或者以程序的方式調用容器的getBean()方法)都會產生一個新的bean實例,相當于一個new的操作,對于prototype作用域的bean,有一點非常重要,那就是Spring不能對一個 prototype bean的整個生命周期負責,容器在初始化、配置、裝飾或者是裝配完一個prototype實例后,將它交給客戶端,隨后就對該prototype實例不聞不問了。不管何種作用域,容器都會調用所有對象的初始化生命周期回調方法,而對prototype而言,任何配置好的析構生命周期回調方法都將不會被調用。3.6. Spring使用屬性注入方式兩種依賴注入的類型分別是setter注入和構造方法注入。setter注入:

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論