1.什麼是hibernate及hibernate工作原理、流程和為什麼要用Hibernate? 答: 定義:Hibernate是一個開放源代碼的對象關係映射(ORM)框架,它對JDBC進行了非常輕量級的對象封裝, 使得Java程式員可以隨心所欲的使用面向對象的編程思維來操縱資料庫。Hibernate ...
1.什麼是hibernate及hibernate工作原理、流程和為什麼要用Hibernate?
答:
定義:Hibernate是一個開放源代碼的對象關係映射(ORM)框架,它對JDBC進行了非常輕量級的對象封裝,
使得Java程式員可以隨心所欲的使用面向對象的編程思維來操縱資料庫。Hibernate可以應用在任何使用JDBC的場合
原理:通過對jdbc的封裝,對 java類和關係資料庫進行mapping(映射)。改變了傳統的jdbc + sql操作數據的方式。
流程:1.讀取並解析配置文件和映射信息,創建SessionFactory
2.打開Sesssion
3.創建事務Transation
4.持久化操作
5.提交事務
6.關閉Session和SesstionFactory
為什麼要用:1.對JDBC訪問資料庫的代碼做了封裝,簡化了對數據訪問層繁瑣的重覆性代碼。
2.Hibernate是一個基於JDBC的主流持久化框架,是一個優秀的ORM實現。很大程度的簡化DAO層的編碼工作.
3.輕量級框架,性能好。映射靈活,支持各種關係資料庫,從一對一到多對多的各種複雜關係.
2.什麼是Hibernate 的抓取策略?
答:抓取策略是指當應用程式需要利用關聯關係進行對象獲取的時候採取的策略。
3.hibernate中session.load()和session.get()的區別
答:1.get()方法直接返回實體類,load()方法可以返回實體的代理類實例。
2.load是採用延遲機制(當lazy屬性為true時) 而get不採用延遲機制
3.找不到符合條件的數據 get方法將返回null,load會報出ObjectNotFoundExcepion異常
4.get支持多態查詢,load只有在lazy=false的情況下才支持多態查詢
多態查詢:就是可以明確區分載入的是什麼類型的對象。
延遲載入:Hibernate儘量延遲向資料庫發送sql,它自己有一個緩衝區,先把sql放在裡面,最後一起發送,減少網路和資料庫開銷。
4.Hibernate中save、persist和saveOrUpdate這三個方法有何異同?
答:這三個方法都是用於將對象保存到資料庫的方法。
細微區別:1.save()只能添加數據,saveOrUpdate()可以進行數據的添加和更新。
2.save()的返回值是一個Serializable對象,而persist()方法返回值為void。
5.Hibernate中的命名SQL查詢指的是什麼?
答:命名SQL查詢指的是用<sql-query>標簽在映射文件中定義的SQL查詢。
使用Session.getNamedQuery()方法對它進行調用,能用指定的名字拿到某個特定的查詢。
Hibernate中的命名查詢可以使用註解和xml映射來定義。@NameQuery用來定義單個命名查詢@NameQueries用來定義多個命名查詢。
6.hibernate中的SessionFactory有什麼作用? SessionFactory是線程安全的嗎?
答:是線程安全的。SessionFactory就是用來創建Session對象的工廠。
SessionFactory通常是在應用程式啟動時創建好的,代碼用它來獲得Session對象。
7.Hibernate中的Session指的是什麼? 可將單個Session在多個線程間進行共用嗎?
答:session負責維護同資料庫的連接,線程不安全。Hibernage中的Session不能在多個線程間進行共用。
8.hibernate中sorted collection和ordered collection有什麼不同?
答:sorted collection是通過使用Comparator在記憶體中進行排序的,
ordered collection中的排序用的是資料庫order by子句。
對於比較大的數據集,為了避免在記憶體中進行排序而出現 OutOfMemoryError異常,最好使用ordered collection。
9.Hibernate中Session的lock()方法有什麼作用?
答:Session的lock()方法重建了關聯關係卻並沒有跟資料庫進行同步和更新。
10.Hibernate中二級緩存指的是什麼?
答:二級緩存是在SessionFactory這個級別維護的緩存,通過減少跟資料庫交互而提高性能。
二級緩存是針對整個應用程式而不是某個特定session的。
11.Hibernate中的查詢緩存是什麼?
答:查詢緩存實際上保存的是sql查詢的結果,這樣再進行相同sql查詢時就可以直接從緩存中拿到結果。
為了提高性能,查詢緩存可以和二級緩存一起使用。
12.為什麼說在Hibernate的實體類中要提供一個無參數的構造器(構造方法)?
答:因為Hibernate框架要使用Reflection API,通過調用Class.newInstance()來創建這些實體類的實例。如果在實體類中找不到無參數的構造器,這個方法就會拋出一個InstantiationException異常[ɪnstænʃɪ'eɪʃən]。
13.可不可以將Hibernate的實體類定義為final類?
答:可以將Hibernate的實體類定義為final類,但這種做法不好。
因為Hibernate會使用代理模式在延遲關聯的情況下提高性能,如果把實體類定義成final類,Java不允許對final類進行擴展,
所以Hibernate就無法再使用代理,如此一來就限制了提升性能的手段。
14.什麼是Hibernate延遲載入?
答:延遲載入機制是為了避免一些無謂的性能開銷而提出來的,延遲載入就是當在真正需要數據的時候,才執行數據載入操作。
Hibernate儘量延遲向資料庫發送sql,它自己有一個緩衝區,先把sql放在裡面,最後一起發送,減少網路和資料庫開銷。
在Hibernate中提供了對實體對象及集合的延遲載入,在Hibernate3中還提供了對屬性的延遲載入。
15.什麼是Hibernate的緩存機制(策略)
答:Hibernate 中提供了兩級Cache [kæʃ](高速緩衝存儲器)。
一級緩存是Session級別屬於事務範圍的緩存。由hibernate管理一般情況下無需進行干預;
當應用程式調用Session的save()、update()、saveOrUpdate()、get()或load(),以及調用查詢介面的 list()、iterator()或filter()方法時,如果在Session緩存中還不存在相應的對象,Hibernate就會把該對象放到一級緩存中。當清理緩存時,Hibernate會根據緩存中對象的狀態變化來同步更新資料庫。
Session為應用程式提供了兩個管理緩存的方法:
evict(Object obj):清除緩存中指定參數的持久化對象。 clear():清空緩存中所有持久化對象。
二級緩存是SessionFactory級別屬於進程或群集範圍的緩存。可以進行配置和更改,也可以動態載入和卸載。
Hibernate的二級緩存策略是針對ID查詢的緩存策略,對於條件查詢沒有作用。因此,Hibernate提供了針對條件查詢的Query Cache。Hibernate還為查詢結果提供了一個查詢緩存,它依賴於二級緩存。
16.Hibernate的查詢(檢索)方式有幾種?
答:本地SQL查詢、Criteria[kraɪ'tɪərɪə]、Hql
17.什麼樣的數據適合存放到Hibernate的二級緩存中?什麼樣的數據不適合?
答:1 很少被修改的數據
2 不是很重要,允許出現偶爾併發的數據
3 不會被併發訪問的數據
4 參考數據,指的是供應用參考的常量數據,它的實例數目有限,會被許多其他類的實例引用,實例極少或者從來不會被修改。
不適合: 1.經常被修改的數據
2.財務數據,絕對不允許出現併發
3.與其他應用共用的數據。
18.配置hibernate二級緩存的主要步驟是什麼?
1.選擇需要使用二級緩存的持久化類,設置它的命名緩存的併發訪問策略。
2.選擇合適的緩存插件,編輯該插件的配置文件。
19.Hibernate的優化策略有哪些?
答:1.用最新版本的hibernate
2.採用合理的session管理機制
3.制定合理的緩存策略
4.儘量使用延遲載入
5.對於很多大文本、大文件設定合理的批處理參數(batch-size)
6.如果可以,選用uuid作為主鍵生成器
7.如果可以,選用基於version的樂觀鎖替代悲觀鎖
8.開發過程中,打開hibernate的SQl日誌輸出(hibernate.show_sql=true),
通過觀察hibernate生成的sql語句瞭解其實現原理,進一步優化。
20. Struts+Hibernate+Spring開發模式中Hibernate扮演的角色是什麼?
答:Hibernate扮演的是數據持久層,作用是實現持久化對象和資料庫表之間的映射,形成持久化對象和資料庫表中數據的轉換平臺
21. 簡述Hibernate的優點
答:1.開源和免費,我們可以在需要的時候研究、改寫源代碼,進行功能的定製。
2.輕量級封裝,簡化了過多複雜問題,調試容易,減輕開發人員的負擔。
3.具有擴展性,開放API,當本身功能不夠用時,我們可以自己編碼進行擴展。
22.什麼是struts,它的工作機制及為什麼要用?
答:Struts是最早的java開源框架之一,是MVC設計模式的一個優秀實現。定義了通用的Controller(控制器),通過配置文件(Struts -config.xml)隔離Model(模型)和View(視圖),以Action的概念對用戶請求進行封裝,使代碼更加清晰易讀。還提供了自動將請求的數據填充到對象中以及頁面標簽等簡化編碼的工具。可以開發大型Java Web項目。
(View:沿用JSP,HTTP,Form,Tag,Resourse ;Controller:ActionServlet ,struts-config.xml,Action)
流程:在web應用啟動時就會載入初始化ActionServlet,ActionServlet從 struts-config.xml文件中讀取配置信息,把它們存放到各種配置對象中, 當ActionServlet接收到一個客戶請求時,將執行以下流程.
(1)檢索與用戶請求匹配的ActionMapping實例,如果不存在,將返回請求路徑無效的信息;
(2)如果ActionForm實例不存在,就創建一個ActionForm對象,把客戶提交的表單數據保存到ActionForm對象中;
(3)根據配置信息看是否需要表單驗證.如果需要驗證,就調用ActionForm的validate()方法; |ˈvælɪdeɪt|
(4)如果ActionForm的validate()方法返回null或返回一個不包含ActionMessage的ActionErrors對象, 就表示表單驗證成功;
(5)ActionServlet根據ActionMapping所包含的映射信息決定將請求轉發給哪個Action,如果相應的 Action實例不存在,就先創建這個實例,然後調用Action的execute()方法; ˈeksɪkju:t
(6)Action的execute()方法返回一個ActionForward對象,ActionServlet再把客戶請求轉發給 ActionForward對象指向的JSP組件;
(7)ActionForward對象指向JSP組件生成動態網頁,返回給客戶;
為什麼要用:JSP+Servlet+JavaBean構建的系統非常的繁亂。基於Struts開發的應用不用再考慮公共問題,開發人員可以專註在業務實現上。結構清晰統一,易於維護。
23. struts1.2和struts2.0的區別?如何控制兩種框架中的單例模式?
答: a、Action類: Struts 1要求Action類繼承一個抽象基類;它的一個具體問題是使用抽象類編程而不是介面。
Struts 2的Action類可以實現一個Action介面,也可以實現其他介面,使可選和定製的服務成為可能。
Struts 2提供一個ActionSupport基類去實現常用的介面。Action介面不是必須要實現的,只要有一個包含execute方法的POJO類都可以用作Struts 2的Action。(POJO是一個簡單的、正規Java對象,它包含業務邏輯處理或持久化邏輯等,但不是JavaBean、EntityBean等,不具有任何特殊角色和不繼承或不實現任何其它Java框架的類或介面。)
b、線程模式 :struts1 的Action是單例模式並且必須是線程安全,因為僅有一個Action的實例來處理所有的請求。
限制了Struts1的 Action能做的事情,開發時要特別小心。Action資源必須是線程安全或同步的。
struts2的 Action為每一個請求產生一個實例,所以沒有線程安全問題。
c、Servlet依賴:
Struts 1的Action依賴於Servlet API,因為Struts 1 Action的execute方法中有HttpServletRequest和HttpServletResponse方法。
Struts 2的Action不依賴於Servlet API,允許Action脫離Web容器運行,降低了測試Action的難度。如果Action需要直接訪問HttpServletRequest和HttpServletResponse參數,Struts 2 的Action仍然可以訪問。但是,大部分時候,Action都無需直接訪問。給開發者提供了更多靈活的選擇。
d、可測性 :Struts1的 Action測試的一個主要問題是execute方法暴露了Servlet API(這使得測試要依賴於容器)。
Struts2 的Action可以通過初始化、設置屬性、調用方法來測試,使測試更容易。
24.談談你對MVC的理解
答:MVC是Model—View—Controller的簡稱。即模型—視圖—控制器。
MVC是一種設計模式,強制性的把應用程式的輸入、處理和輸出分開。MVC中的模型、視圖、控制器分別擔負著不同的任務。
視圖: 視圖是用戶看到並與之交互的界面。視圖向用戶展示相關的數據,並接受用戶的輸入,不進行任何業務邏輯處理。
模型: 模型表示業務數據和業務處理。相當於JavaBean。一個模型能為多個視圖提供數據。提高了應用程式的復用性
控制器: 當用戶單擊Web頁面中的提交按鈕時,控制器接受請求並調用相應的模型去處理請求,然後根據處理的結果調用相應的視圖來展示處理的結果。
MVC的處理過程:首先控制器接受用戶的請求,調用相應的模型來進行業務處理,並返回數據給控制器。控制器調用相應的視圖來顯示處理的結果。並通過視圖呈現給用戶。
25.項目中為什麼使用SSH
1. 使用Struts是因為struts是基於MVC模式,很好的將應用程式進行了分層,結構清晰。使開發人員更關註於業務邏輯的實現;
struts有著豐富的taglib,如果能靈活運用,則能大大提高開發效率。
2. 使用Hibernate:是因為Hibernate為Java應用提供了一個好用且高效率的對象關係映射框架。
它是一個輕量級的持久層框架,功能豐富。
3. 使用Spring:因為Spring基於IoC(Inversion of Control)和AOP構架多層J2EE系統的框架,
不強迫你必須在每一層中必須使用Spring,它模塊化比較好,允許你根據自己的需求來使用某一模塊;
採用IoC使得可以很容易的實現bean的裝配,提供了簡潔的AOP並據此實現事務管理(Transcation Managment)等等。
26.struts中的action是單實例還是多實例,為什麼?
答:action是單實例的。當多個用戶訪問一個請求的時候,伺服器記憶體中只有一個與之對應的action類對象。
因為當伺服器第一次載入struts的配置文件,創建了一個Action後,每發送一個請求,伺服器都會先去檢索相應的範圍內(request,session)是否存在這麼一個action實例,如果存在,則使用這個實例,如果不存在,則創建一個action實例。
27. dispatchAction是用什麼技術實現的? [dɪˈspætʃ]
答:DispatchAction 是Aciton的一個子類,主要解決了一個請求處理多個功能的問題,dispatchAction是用的Action這麼一個技術。
28.什麼是Hibernate的併發機制?怎麼處理?
答:Hibernate的Session對象是非線程安全的,對於單個請求、會話、工作單元(即單個事務,單個線程),通常只使用一次就丟棄。
如果一個Session 實例允許共用的話,那些支持併發運行的例如Http request,session beans將會導致爭搶資源。
如果在Http Session中有hibernate的Session的話,就可能會出現同步訪問Http Session。只要用戶足夠快的點擊“刷新”, 就會導致兩個併發運行的線程使用同一個Session。多個事務併發訪問同一塊資源,可能會引發丟失更新,臟讀,幻讀,不可重覆讀一系列的問題。
解決方案:設置事務隔離級別。
29. Hibernate與spring的聯繫
答:Hibernate中的一些對象可以給Spring來管理,讓Spring容器來創建hibernate中一些對象的實例。例如:SessionFactory,HibernateTemplate等。Hibernate本來是對資料庫的一些操作,放在DAO層,而Spring給業務層的方法定義了事務,業務層調用DAO層的方法,很好的將Hibernate的操作加入到事務中來。
30. Hibernate自帶的分頁機制是什麼?如果不使用Hibernate自帶的分頁,則採用什麼方式分頁?
答:a.hibernate自帶的分頁機制:獲得Session對象後,從Session中獲得Query對象。用Query.setFirstResult():設置要顯示的第一行 數據, Query.setMaxResults():設置要顯示的最後一行數據。 b.不使用hibernate自帶的分頁,可採用sql語句分頁.
如:5表示每頁顯示的記錄數,2表示當前頁: select * top 5 from table where tabId not in (select tabId top (2-1)*5 from table);
31.hibernate的三種狀態之間如何轉換
答:當對象由瞬時狀態(Transient)save()時,就變成了持久化狀態。
當我們在Session里存儲對象的時候,實際上是在Session的Map里存了一份,也就是它的緩存里放了一份,然後,又到資料庫里存了一份,在緩存里這一份叫持久對象(Persistent)。當Session Close()時,緩存也都關閉了,整個Session失效,此時對象變成游離狀態(Detached),但資料庫中還是存在的。 當游離狀態(Detached) update()時,又變為了持久狀態(Persistent)。
當持久狀態(Persistent) delete()時,又變為了瞬時狀態(Transient),此時,資料庫中沒有與之對應的記錄。
32. hibernate拒絕連接、伺服器崩潰的原因?最少寫5個
1. 資料庫沒有打開 ,配置有問題 。
2. 網路連接出現問題
3. 連接配置出錯
4. 驅動的driver,url不對。
5. LIB下沒有加入相應驅動
6. 當前連接太多,伺服器有訪問人數限制 7. 伺服器的相應埠沒打開,即它不提供相應的服務。
33.什麼是Spring?
Spring是一個輕量級的控制反轉(IoC)和麵向切麵(AOP)的容器框架. spring的設計思想是,單例模式和工廠模式
34.Spring的7大優點是什麼?
輕量級:Spring在大小和透明性方面屬於輕量級,基礎版本的Spring框架大約只有2MB。
控制反轉(IOC):Spring使用控制反轉技術實現了松耦合。依賴被註入到對象,而不是創建或尋找依賴對象。
面向切麵編程(AOP): Spring支持面向切麵編程,同時把應用的業務邏輯與系統的服務分離開來。
容器:Spring包含並管理對象的配置及生命周期。
MVC框架:Spring的web框架是一個設計優良的web MVC框架,很好的取代了一些web框架。
事務管理:Spring對本地業務和全局業務(JAT)提供了統一的事務管理介面。
異常處理:Spring提供了一個方便的API將特定技術的異常(由JDBC, Hibernate, 或JDO拋出的異常)轉化為統一的Unchecked異常。
35.Spring框架有哪些模塊?
(1)spring AOP --面象切麵編程
(2)spring DAO --數據訪問對象
(3)spring ORM --對象關係映射
(4)spring Context -- 上下文配置,向Spring框架提供上下文信息
(5)spring WEB - -WEB上下文模塊
(6)spring WEB-MVC --實現了MVC
(7)spring CORE –核心容器.提供Spring框架基本功能
36.解釋核心容器(應用上下文)模塊
答:核心容器模塊是Spring的基本模塊,提供了Spring框架的基本功能。BeanFactory 是所有Spring應用的核心。
Spring框架是建立在這個模塊之上的,使得Spring成為一個容器。
37.BeanFactory – BeanFactory 實例
BeanFactory是工廠模式的一種實現,它使用控制反轉將應用的 配置和依賴 與 實際的應用代碼 分離開來。
最常用的BeanFactory實現是XmlBeanFactory類。
38.XmlBeanFactory
最常用的就是org.springframework.beans.factory.xml.XmlBeanFactory,它根據XML文件中定義的內容載入beans。該容器從XML文件中讀取配置元數據來創建一個完備的系統或應用。
39.解釋AOP模塊
AOP模塊用來開發Spring應用程式中具有切麵性質的部分。該模塊的大部分服務由AOP Alliance提供,保證了Spring框架和其他AOP框架之間的互操作性。另外,該模塊將元數據編程引入到了Spring。əˈlaɪəns
40.解釋抽象JDBC和DAO模塊
通過使用抽象JDBC和DAO模塊保證了與資料庫連接代碼的整潔與簡單,避免了由於未能關閉資料庫資源引起的問題。它在多種資料庫伺服器的錯誤信息基礎上提供了一個很重要的異常層。還利用Spring的AOP模塊為Spring應用程式中的對象提供事務管理服務。
41.解釋對象/關係映射集成模塊
Spring通過提供ORM模塊在JDBC的基礎上支持對象關係映射工具。使Spring可以集成主流的ORM框架,包括Hibernate,、JDO、ibatis、ojb、jpa、toplink 。Spring的事務管理可以同時支持以上某種框架和JDBC。
42..解釋web模塊
Spring的web模塊建立在應用上下文(application context)模塊之上,提供了一個適合基於web應用程式的上下文環境。該模塊還支持了幾個面向web的任務,如透明的處理多文件上傳請求及將請求參數同業務對象綁定起來。
43.解釋Spring MVC模塊
Spring提供MVC框架構建web應用程式。Spring可以很輕鬆的同其他MVC框架結合,但Spring的MVC是個更好的選擇,因為它通過控制反轉將控制邏輯和業務對象完全分離開來。
44.Spring的配置文件
Spring的配置文件是一個XML文件,文件包含了類信息並描述了這些類是如何配置和互相調用的。
45.Spring IoC容器是什麼?
Spring IOC容器負責創建、管理(通過依賴註入)、整合、配置對象以及管理這些對象的生命周期。
46.IOC有什麼優點?
1.IOC或依賴註入減少了應用程式的代碼量。
2.使得應用程式的測試很簡單,因為在單元測試中不再需要單例或JNDI查找機制。
3.簡單的實現以及較少的干擾機制使得松耦合得以實現。
4.IOC容器支持勤性單例及延遲載入服務。
(在類定義的時候,不是在調用get_instance時,創建了@@instance實例對象,因此稱為勤性單例,
而在引入singleton的單例模式稱為惰性單例)
47.spring常用的三種應用上下文是什麼?
FileSystemXmlApplicationContext 從文件系統中獲取xml文件來載入一個上下文。
ClassPathXmlApplicationContext從classpath處獲取xml文件來載入一個上下文。
WebXmlApplicationContext:從web應用獲取xml文件來載入一個上下文。
48.Bean Factory和ApplicationContext有什麼區別?
ApplicationContext提供了一種解決文檔信息的方法,一種載入文件資源的方式,他們可以向監聽他們的beans發送消息。另外,容器或者容器中beans的操作,這些必須以bean工廠的編程方式處理的操作可以在應用上下文中以聲明的方式處理。應用上下文實現了MessageSource介面,該介面用於獲取本地消息,實際的實現是可選的。
BeanFactory是工廠模式的一種實現,它使用控制反轉將應用的 配置和依賴 與 實際的應用代碼 分離開來。
49.什麼是Spring Beans?
Spring Beans是構成Spring應用核心的Java對象。這些對象由Spring IOC容器實例化、組裝、管理。通過容器中配置的元數據創建。
50.Spring Bean中定義了什麼內容?
Spring Bean中定義了所有的配置元數據,這些配置信息告訴容器如何創建它,它的生命周期以及依賴關係。
51.怎麼向Spring 容器提供配置的元數據?
有三種方式向Spring 容器提供元數據: 基於XML配置文件 基於註解配置 基於Java的配置
52.如何定義bean的作用域?
答:通過“scope”屬性定義。例如,當Spring需要每次產生一個新的bean實例時,應該聲明bean的scope屬性為prototype。proʊtətaɪp
如果希望Spring每次返回一個實例,應該聲明bean的scope屬性為singleton。sɪŋɡəltən
53.說一下Spring中支持的bean作用域
Spring框架支持如下五種不同的作用域: bean預設的scope屬性是’singleton‘。
singleton:在Spring IOC容器中僅存在一個Bean實例,Bean以單實例的方式存在。
prototype:一個bean可以定義多個實例。
request:每次HTTP請求都會創建一個新的Bean。 該作用域僅適用於Web 的ApplicationContext環境。
session:一個HTTP Session定義一個Bean。 該作用域僅適用於Web的ApplicationContext環境.
globalSession:同一個全局HTTP Session定義一個Bean。該作用域同樣僅適用於Web的ApplicationContext環境.
54.Spring框架中單例beans是線程安全的嗎?
答:不是,Spring框架中的單例beans不是線程安全的。
55.解釋Spring框架中bean的生命周期
a.Spring容器 從XML 文件中讀取bean的定義,並實例化bean。 Spring根據bean的定義填充所有的屬性。
如果bean實現了BeanNameAware 介面,Spring 傳遞bean 的ID 到 setBeanName方法。
如果Bean 實現了 BeanFactoryAware 介面, Spring傳遞beanfactory 給setBeanFactory 方法。
如果有任何與bean相關聯的BeanPostProcessors,Spring會在postProcesserBeforeInitialization()方法內調用它們。
如果bean實現IntializingBean了,調用它的afterPropertySet方法,如果bean聲明瞭初始化方法,調用此初始化方法。
如果有BeanPostProcessors 和bean 關聯,這些bean的postProcessAfterInitialization() 方法將被調用。
如果bean實現了 DisposableBean,它將調用destroy()方法。
b. (1)實例化(必須的)構造函數構造對象
(2)裝配(可選的)為屬性賦值
(3)回調(可選的)(容器-控制類和組件-回調類)
(4)初始化(init-method=" ")
(5)就緒
(6)銷毀(destroy-method=" ")
56.哪些是最重要的bean生命周期方法?能重寫它們嗎?
答:第一個是setup方法,該方法在容器載入bean的時候被調用。
第二個是teardown方法,該方法在bean從容器中移除的時候調用。
bean標簽有兩個重要的屬性(init-method 和 destroy-method),通過這兩個屬性定義自己的初始化方法和析構方法。
Spring也有相應的註解:@PostConstruct 和 @PreDestroy。
57.什麼是Spring的內部bean?
當一個bean被用作另一個bean的屬性時,這個bean可以被聲明為內部bean。內部bean總是匿名的並且它們的scope總是prototype。
58.如何在Spring中註入Java集合類?
Spring提供如下幾種類型的集合配置元素:
list元素用來註入一系列的值,允許有相同的值。
set元素用來註入一些列的值,不允許有相同的值。
map用來註入一組”鍵-值”對,鍵、值可以是任何類型的。
props也可以用來註入一組”鍵-值”對,這裡的鍵、值都是字元串類型。
59.什麼是bean wiring?
Wiring,或者說bean Wiring是指beans在Spring容器中結合在一起的情況。當裝配bean的時候,Spring容器需要知道需要哪些beans以及怎樣使用依賴註入將它們結合起來。
60.什麼是bean自動裝配?
答:Spring 能自動裝配bean 與 bean之間的依賴關係,即無須使用 ref顯式指定依賴bean,由 BeanFactory 檢查 XML 配置文件內容,根據某種規則,為主調 bean 註入依賴關係。
61.解釋自動裝配的各種模式?
自動裝配提供五種不同的模式供Spring容器自動裝配beans之間的依賴註入:
no:預設方式不進行自動裝配,通過手工設置ref 屬性來進行裝配bean。
byName:通過參數名自動裝配,Spring容器查找beans的屬性,這些beans在XML配置文件中被設置為byName。之後容器試圖匹配、裝配和該bean的屬性具有相同名字的bean。
byType:通過參數的數據類型自動裝配,Spring容器查找beans的屬性,這些beans在XML配置文件中被設置為byType。之後容器試圖匹配和裝配和該bean的屬性類型一樣的bean。如果有多個bean符合條件,則拋出錯誤。
constructor:通過參數的數據類型自動裝配(應用於構造函數的參數)。如果在BeanFactory中不是恰好有一個bean與構造函數參數類型相同,則拋出一個嚴重的錯誤。
autodetect:如果有預設的構造方法,通過 constructor的方式自動裝配,否則使用 byType的方式自動裝配。
62.自動裝配有哪些局限性? 自動裝配有如下局限性:
重寫:你仍然需要使用 < property>設置指明依賴,這意味著總要重寫自動裝配。
原生數據類型:不能自動裝配簡單的屬性,比如原生類型、字元串和類。
模糊特性:自動裝配沒有自定義裝配精確。
63.可以在Spring中註入null或空字元串嗎?
完全可以。
Spring註解
64.什麼是Spring基於Java的配置?給出一些註解的例子
答:基於Java的配置是允許使用Java的註解進行Spring的大部分配置而非通過傳統的XML文件配置。
以註解@Configuration為例,它用來標記類,說明作為beans的定義,可以被Spring IOC容器使用。另一個例子是@Bean註解,它表示該方法定義的Bean要被註冊進Spring應用上下文中。
65.什麼是基於註解的容器配置?
答:另外一種替代XML配置的方式為基於註解的配置,這種方式通過位元組元數據裝配組件而非使用尖括弧聲明。開發人員將直接在類中進行配置,通過註解標記相關的類、方法或欄位聲明,而不再使用XML描述bean之間的關係。
66.如何開啟註解裝配?
答:預設在Spring容器中不開啟。如果想要開啟只需在Spring配置文件中配置元素即可。
67.@Required 註解
@Required註解 屬性檢查 但他只檢查屬性是否已經設置不檢查是否非空,屬性可以在bean的定義中明確指定也可通過自動裝配設置。如果bean的屬性未設置,則拋出BeanInitializationException異常。
68.@Autowired 註解
@Autowired註解 提供更加精細的控制,包括自動裝配在何處完成以及如何完成。它可以像@Required一樣自動裝配setter方法、構造器、屬性或者具有任意名稱或多個參數的方法。
69. @Qualifier 註解 ˈkwɒlɪfaɪə(r)
當有多個相同類型的bean而只有其中的一個需要自動裝配時,將@Qualifier 註解和@Autowire 註解結合使用消除這種混淆,指明需要裝配的bean。
Spring數據訪問
70.在Spring框架中如何更有效的使用JDBC?
使用Spring JDBC框架,資源管理以及錯誤處理的代價都會減輕。開發人員只需通過statements和queries語句從資料庫中存取數據。Spring框架中通過使用模板類(比如JdbcTemplate)能更有效的使用JDBC。
71.JdbcTemplate
JdbcTemplate類提供了許多方法,為我們與資料庫的交互提供了便利。例如,它可以將資料庫的數據轉化為原生類型或對象,執行寫好的或可調用的資料庫操作語句,提供自定義的 資料庫錯誤 處理功能。
72.Spring對DAO的支持
Spring對數據訪問對象(DAO)的支持旨在使它可以與數據訪問技術(如 JDBC, Hibernate 及JDO)方便的結合起來工作。這使得我們可以很容易在的不同的持久層技術間切換,編碼時也無需擔心會拋出特定技術的異常。
73.使用Spring可以通過什麼方式訪問Hibernate?
答:兩種 1.使用Hibernate Template的反轉控制以及回調方法 2.繼承HibernateDAOSupport,並申請一個AOP攔截器節點
74.Spring支持的ORM
答:Spring支持的ORM:Hibernate,iBatis,JPA (Java -Persistence API),TopLink,JDO (Java Data Objects),OJB
75.如何通過HibernateDaoSupport將Spring和Hibernate結合起來?
答:使用Spring的SessionFactory 調用LocalSessionFactory。結合的過程分為以下三步:
1.配置Hibernate SessionFactory 2.繼承HibernateDaoSupport實現一個DAO 3.使用AOP裝載事務支持
76.Spring支持的事務管理類型
答:a.編程式事務管理:意味著可以通過編程的方式管理事務,靈活性強,難維護。
b.聲明式事務管理:意味著可以將事務管理和業務代碼分離。通過註解或XML配置事務管理。
77.Spring框架的事務管理有哪些優點?
答:1.為不同的事務API(如JTA, JDBC, Hibernate, JPA, 和JDO)提供了統一的編程模型。
2.為編程式事務管理提供了一個簡單的API而非一系列複雜的事務API(如JTA).
3.支持聲明式事務管理。
4.可以和Spring 的多種數據訪問技術很好的融合。
78.你更推薦那種類型的事務管理?
答:選擇聲明式事務管理,因為這種方式與應用程式的關聯較少,更加符合輕量級容器的概念。
聲明式事務管理要優於編程式事務管理,儘管靈活性方面弱於編程式事務管理(這種方式允許你通過代碼控制業務)。
Spring面向切麵編程(AOP)
79.解釋AOP
面向切麵編程,允許開發人員模塊化橫向業務邏輯,或定義核心部分的功能,例如日誌和事務管理。
80.切麵(Aspect) ['æspekt]
AOP的核心就是切麵,它將多個類的通用行為封裝為可重用的模塊,該模塊含有一組API提供 cross-cutting功能。例如,日誌模塊稱為日誌的AOP切麵。根據需求的不同,一個應用程式可以有若幹切麵。在Spring AOP中,切麵通過帶有@Aspect註解的類實現。
81.在Spring AOP中concern和 cross-cutting concern的區別是什麼?
Concern(核心邏輯):表示在應用程式中一個模塊的行為。Concern可以定義為我們想要實現的功能。
Cross-cutting concern(橫向的通用邏輯):指的是整個應用程式都會用到的功能,它影響整個應用程式。例如,日誌管理(Logging)、安全管理(Security)sɪˈkjʊərəti以及數據交互是應用程式的每個模塊都要涉及到的,因此這些都屬於Cross-cutting concern。
82.連接點(Join point)
連接點代表應用程式中插入AOP切麵的地點。它實際上是Spring AOP框架在應用程式中執行動作的地點。
83.通知(Advice)
通知表示在方法執行前後需要執行的動作。實際上它是Spring AOP框架在程式執行過程中觸發的一些代碼。
Spring切麵可以執行以下五種類型的通知:
before(前置通知):在一個方法之前執行的通知。
after(最終通知):當某連接點退出時執行的通知(不論是正常返回還是異常退出)。
after-returning(後置通知):在某連接點正常完成後執行的通知。
after-throwing(異常通知):在方法拋出異常退出時執行的通知。
around(環繞通知):在方法調用前後觸發的通知。
84.切入點(Pointcut)
切入點是一個或一組連接點,通知將在這些位置執行。可以通過表達式或匹配的方式指明切入點。
85.什麼是引入?
引入允許我們在已有的類里添加新的方法或屬性。
86.什麼是目標對象?
被一個或者多個切麵所通知的對象。它通常是一個代理對象。也被稱做被通知(advised)對象。
87.什麼是代理?
代理是將通知 應用到目標對象後 創建的對象。從客戶端的角度看,代理對象和目標對象是一樣的。
88.有幾種不同類型的自動代理?
BeanNameAutoProxyCreator:bean名稱自動代理創建器
DefaultAdvisorAutoProxyCreator:預設通知者自動代理創建器
Metadata autoproxying:元數據自動代理
89.什麼是織入?什麼是織入應用的不同點?
答:織入是將切麵和其他應用類型或對象連接起來創建一個通知對象的過程。織入可以在編譯、載入或運行時完成。
90.解釋基於XML Schema方式的切麵實現
答:在這種情況下,切麵由使用XML文件配置的類實現。
91.解釋基於註解方式(基於@AspectJ)的切麵實現
答:在這種情況下(基於@AspectJ的實現),指的是切麵的對應的類使用Java 5註解的聲明方式。
92.DispatcherServlet
答:Spring的MVC框架圍繞DispatcherServlet來設計的,它用來處理所有的HTTP請求和響應。
93.WebApplicationContext
WebApplicationContext繼承了ApplicationContext,並添加了一些web應用程式需要的功能。和普通的ApplicationContext 不同,WebApplicationContext可以用來處理主題樣式,它也知道如何找到相應的servlet。
94.什麼是Spring MVC框架的控制器?
控制器提供對應用程式行為的訪問,通常通過服務介面實現。控制器解析用戶的輸入,並將其轉換為一個由視圖呈現給用戶的模型。Spring 通過一種極其抽象的方式實現控制器,它允許用戶創建多種類型的控制器。
95.@Controller annotation @Controller註解表示該類扮演控制器的角色。Spring不需要繼承任何控制器基類或應用Servlet API。
96.@RequestMapping annotation(註解)
@RequestMapping註解用於將URL映射到任何一個類或者一個特定的處理方法上。
96.你一般用spring做什麼? 控制反轉IOC AOP
97.項目中如何體現Spring中的切麵編程,舉例說明。
答:項目中用到的Spring中的切麵編程最多的地方:聲明式事務管理。
1.定義一個事務管理器
2.配置事務特性(相當於聲明 通知。一般在業務類的方法上定義事務)
3.配置哪些類的哪些方法需要配置事務(相當於切入點。一般也是在業務類的方法上)
98. spring中可以用註入獲得屬性值,還有其他的方式嗎? 答:讀取配置文件
99. spring在項目中如何充當粘合劑 ?
答:1、在項目中利用spring的IOC(控制反轉或依賴註入),明確地定義組件介面(比如UserDAO),開發者可以獨立開發各個組件, 然後根據組件間的依賴關係組裝(UserAction依賴於UserBiz:業務邏輯層,UserBiz依賴於UserDAO)運行,很好的把Struts(Action)和hibernate(DAO的實現)結合起來了。
2、spring的事務管理把hibernate對資料庫的操作進行了事務配置。
100.什麼是Ajax? eɪˈsɪŋkrənəs
AJAX“Asynchronous Javascript And XML”(非同步JavaScript和XML)是一種用於創建更好更快及交互性更強的Web應用程式技術。
通過在後臺與伺服器進行少量的數據交換,在不重新載入整個頁面的情況下,實現對局部頁面的非同步更新。
101. Ajax的工作原理? 簡單來說通過XmlHttpRequest對象向伺服器發送非同步請求、獲得數據然後用javascript操作DOM更新頁面.
102.什麼是struts2?工作原理是什麼?
答:Struts 2 是融合了Struts 和 WebWork用來建立企業級Java Web 應用程式的框架。不僅註重程式的開發過程,還註重部署和後期維護。使用了責任鏈(Chain of Responsibility)設計模式和命令(Command)設計模式。
工作原理分為4步:
1.客戶端向Action發送一個請求,容器通過web.xml 映射請求,得到控制器名字 然後調用控制器(StrutsPrepareAndExecuteFilter或FilterDispatcher)。在Struts2.1以前調用FilterDispatcher,Struts2.1以後調用StrutsPrepareAndExecuteFilter
2.控制器(Controller)通過ActionMapper獲得Action的信息並調用代理對象ActionProxy ['prɒksɪ]。
3.代理對象(ActionProxy)通過讀取struts.xml文件獲取action和攔截器棧的信息。把request請求傳遞給action的調用者(ActionInvocation)[ˌɪnvəˈkeɪʃn]
4.ActionInvocation依次調用action和interceptor(攔截器)。根據action的配置信息產生結果result。Result信息返回給ActionInvocation產生一個HttpServletResponse響應,把響應行為發送給客戶端。
103.什麼是struts,它的工作機制及為什麼要用?
答:Struts是最早的java開源框架之一,是MVC設計模式的一個優秀實現。定義了通用的Controller(控制器),通過配置文件(Struts -config.xml)隔離Model(模型層)和View(視圖層),以Action的概念對用戶請求進行封裝,使代碼更加清晰易讀。還提供了自動將請求的數據填充到對象中及頁面標簽等簡化編碼的工具。可以開發大型Java Web項目。
(View:沿用JSP,HTTP,Form,Tag,Resourse ;Controller:ActionServlet ,struts-config.xml,Action)
流程:在web應用啟動
1.什麼是hibernate及hibernate工作原理、流程和為什麼要用Hibernate?
答:
定義:Hibernate是一個開放源代碼的對象關係映射(ORM)框架,它對JDBC進行了非常輕量級的對象封裝,
使得Java程式員可以隨心所欲的使用面向對象的編程思維來操縱資料庫。Hibernate可以應用在任何使用JDBC的場合
原理:通過對jdbc的封裝,對 java類和關係資料庫進行mapping(映射)。改變了傳統的jdbc + sql操作數據的方式。
流程:1.讀取並解析配置文件和映射信息,創建SessionFactory
2.打開Sesssion
3.創建事務Transation
4.持久化操作
5.提交事務
6.關閉Session和SesstionFactory
為什麼要用:1.對JDBC訪問資料庫的代碼做了封裝,簡化了對數據訪問層繁瑣的重覆性代碼。
2.Hibernate是一個基於JDBC的主流持久化框架,是一個優秀的ORM實現。很大程度的簡化DAO層的編碼工作.
3.輕量級框架,性能好。映射靈活,支持各種關係資料庫,從一對一到多對多的各種複雜關係.
2.什麼是Hibernate 的抓取策略?
答:抓取策略是指當應用程式需要利用關聯關係進行對象獲取的時候採取的策略。
3.hibernate中session.load()和session.get()的區別
答:1.get()方法直接返回實體類,load()方法可以返回實體的代理類實例。
2.load是採用延遲機制(當lazy屬性為true時) 而get不採用延遲機制
3.找不到符合條件的數據 get方法將返回null,load會報出ObjectNotFoundExcepion異常
4.get支持多態查詢,load只有在lazy=false的情況下才支持多態查詢
多態查詢:就是可以明確區分載入的是什麼類型的對象。
延遲載入:Hibernate儘量延遲向資料庫發送sql,它自己有一個緩衝區,先把sql放在裡面,最後一起發送,減少網路和資料庫開銷。
4.Hibernate中save、persist和saveOrUpdate這三個方法有何異同?
答:這三個方法都是用於將對象保存到資料庫的方法。
細微區別:1.save()只能添加數據,saveOrUpdate()可以進行數據的添加和更新。
2.save()的返回值是一個Serializable對象,而persist()方法返回值為void。
5.Hibernate中的命名SQL查詢指的是什麼?
答:命名SQL查詢指的是用<sql-query>標簽在映射文件中定義的SQL查詢。
使用Session.getNamedQuery()方法對它進行調用,能用指定的名字拿到某個特定的查詢。
Hibernate中的命名查詢可以使用註解和xml映射來定義。@NameQuery用來定義單個命名查詢@NameQueries用來定義多個命名查詢。
6.hibernate中的SessionFactory有什麼作用? SessionFactory是線程安全的嗎?
答:是線程安全的。SessionFactory就是用來創建Session對象的工廠。
SessionFactory通常是在應用程式啟動時創建好的,代碼用它來獲得Session對象。
7.Hibernate中的Session指的是什麼? 可將單個Session在多個線程間進行共用嗎?
答:session負責維護同資料庫的連接,線程不安全。Hibernage中的Session不能在多個線程間進行共用。
8.hibernate中sorted collection和ordered collection有什麼不同?
答:sorted collection是通過使用Comparator在記憶體中進行排序的,
ordered collection中的排序用的是資料庫order by子句。
對於比較大的數據集,為了避免在記憶體中進行排序而出現 OutOfMemoryError異常,最好使用ordered collection。
9.Hibernate中Session的lock()方法有什麼作用?
答:Session的lock()方法重建了關聯關係卻並沒有跟資料庫進行同步和更新。
10.Hibernate中二級緩存指的是什麼?
答:二級緩存是在SessionFactory這個級別維護的緩存,通過減少跟資料庫交互而提高性能。
二級緩存是針對整個應用程式而不是某個特定session的。
11.Hibernate中的查詢緩存是什麼?
答:查詢緩存實際上保存的是sql查詢的結果,這樣再進行相同sql查詢時就可以直接從緩存中拿到結果。
為了提高性能,查詢緩存可以和二級緩存一起使用。
12.為什麼說在Hibernate的實體類中要提供一個無參數的構造器(構造方法)?
答:因為Hibernate框架要使用Reflection API,通過調用Class.newInstance()來創建這些實體類的實例。如果在實體類中找不到無參數的構造器,這個方法就會拋出一個InstantiationException異常[ɪnstænʃɪ'eɪʃən]。
13.可不可以將Hibernate的實體類定義為final類?
答:可以將Hibernate的實體類定義為final類,但這種做法不好。
因為Hibernate會使用代理模式在延遲關聯的情況下提高性能,如果把實體類定義成final類,Java不允許對final類進行擴展,
所以Hibernate就無法再使用代理,如此一來就限制了提升性能的手段。
14.什麼是Hibernate延遲載入?
答:延遲載入機制是為了避免一些無謂的性能開銷而提出來的,延遲載入就是當在真正需要數據的時候,才執行數據載入操作。
Hibernate儘量延遲向資料庫發送sql,它自己有一個緩衝區,先把sql放在裡面,最後一起發送,減少網路和資料庫開銷。
在Hibernate中提供了對實體對象及集合的延遲載入,在Hibernate3中還提供了對屬性的延遲載入。
15.什麼是Hibernate的緩存機制(策略)
答:Hibernate 中提供了兩級Cache [kæʃ](高速緩衝存儲器)。
一級緩存是Session級別屬於事務範圍的緩存。由hibernate管理一般情況下無需進行干預;
當應用程式調用Session的save()、update()、saveOrUpdate()、get()或load(),以及調用查詢介面的 list()、iterator()或filter()方法時,如果在Session緩存中還不存在相應的對象,Hibernate就會把該對象放到一級緩存中。當清理緩存時,Hibernate會根據緩存中對象的狀態變化來同步更新資料庫。
Session為應用程式提供了兩個管理緩存的方法:
evict(Object obj):清除緩存中指定參數的持久化對象。 clear():清空緩存中所有持久化對象。
二級緩存是SessionFactory級別屬於進程或群集範圍的緩存。可以進行配置和更改,也可以動態載入和卸載。
Hibernate的二級緩存策略是針對ID查詢的緩存策略,對於條件查詢沒有作用。因此,Hibernate提供了針對條件查詢的Query Cache。Hibernate還為查詢結果提供了一個查詢緩存,它依賴於二級緩存。
16.Hibernate的查詢(檢索)方式有幾種?
答:本地SQL查詢、Criteria[kraɪ'tɪərɪə]、Hql
17.什麼樣的數據適合存放到Hibernate的二級緩存中?什麼樣的數據不適合?
答:1 很少被修改的數據
2 不是很重要,允許出現偶爾併發的數據
3 不會被併發訪問的數據
4 參考數據,指的是供應用參考的常量數據,它的實例數目有限,會被許多其他類的實例引用,實例極少或者從來不會被修改。
不適合: 1.經常被修改的數據
2.財務數據,絕對不允許出現併發
3.與其他應用共用的數據。
18.配置hibernate二級緩存的主要步驟是什麼?
1.選擇需要使用二級緩存的持久化類,設置它的命名緩存的併發訪問策略。
&nb