1.StringBuffer與String的區(qū)別
StringBuffer是線程安全的,每次操作字符串答憔,String會生成一個新的對象牵咙,而StringBuffer不會;StringBuilder是非線程安全的
2.線程池的作用
在程序啟動的時候就創(chuàng)建若干線程來響應(yīng)處理攀唯,它們被稱為線程池洁桌,里面的線程叫工作線程
第一:降低資源消耗。通過重復(fù)利用已創(chuàng)建的線程降低線程創(chuàng)建和銷毀造成的消耗侯嘀。
第二:提高響應(yīng)速度另凌。當(dāng)任務(wù)到達(dá)時谱轨,任務(wù)可以不需要等到線程創(chuàng)建就能立即執(zhí)行。
第三:提高線程的可管理性吠谢。
常用線程池:ExecutorService 是主要的實現(xiàn)類土童,其中常用的有 Executors.newSingleThreadPool(),newFixedThreadPool(),newcachedTheadPool(),newScheduledThreadPool()。
Linux常用命令:
cd工坊,cp献汗,mv,rm王污,ps(進(jìn)程)罢吃,tar,cat(查看內(nèi)容)昭齐,chmod尿招,vim,find阱驾,ls
3.索引:B+就谜,B-,全文索引
Mysql的索引是一個數(shù)據(jù)結(jié)構(gòu),旨在使數(shù)據(jù)庫高效的查找數(shù)據(jù)里覆。
常用的數(shù)據(jù)結(jié)構(gòu)是B+Tree丧荐,每個葉子節(jié)點不但存放了索引鍵的相關(guān)信息還增加了指向相鄰葉子節(jié)點的指針,這樣就形成了帶有順序訪問指針的B+Tree喧枷,做這個優(yōu)化的目的是提高不同區(qū)間訪問的性能篮奄。
什么時候使用索引:
##經(jīng)常出現(xiàn)在group by,order by和distinc關(guān)鍵字后面的字段
##經(jīng)常與其他表進(jìn)行連接的表,在連接字段上應(yīng)該建立索引
##經(jīng)常出現(xiàn)在Where子句中的字段
##經(jīng)常出現(xiàn)用作查詢選擇的字段
4.SpringMVC運行原理
客戶端請求提交到DispatcherServlet
由DispatcherServlet控制器查詢HandlerMapping割去,找到并分發(fā)到指定的Controller中窟却。
Controller調(diào)用業(yè)務(wù)邏輯處理后,返回ModelAndView
DispatcherServlet查詢一個或多個ViewResoler視圖解析器呻逆,找到ModelAndView指定的視圖
5.Spring IOC (控制反轉(zhuǎn)夸赫,依賴注入)
Spring支持三種依賴注入方式,分別是屬性(Setter方法)注入咖城,構(gòu)造注入和接口注入茬腿。
在Spring中,那些組成應(yīng)用的主體及由Spring IOC容器所管理的對象被稱之為Bean宜雀。
Spring的IOC容器通過反射的機(jī)制實例化Bean并建立Bean之間的依賴關(guān)系切平。
簡單地講,Bean就是由Spring IOC容器初始化辐董、裝配及被管理的對象悴品。
獲取Bean對象的過程,首先通過Resource加載配置文件并啟動IOC容器,然后通過getBean方法獲取bean對象苔严,就可以調(diào)用他的方法定枷。
6.Spring Bean的作用域:
Singleton:Spring IOC容器中只有一個共享的Bean實例,一般都是Singleton作用域届氢。
Prototype:每一個請求欠窒,會產(chǎn)生一個新的Bean實例。
Request:每一次http請求會產(chǎn)生一個新的Bean實例退子。
7.一個Http請求過程
DNS域名解析 –> 發(fā)起TCP的三次握手 –> 建立TCP連接后發(fā)起http請求 –> 服務(wù)器響應(yīng)http請求岖妄,瀏覽器得到html代碼 –> 瀏覽器解析html代碼,并請求html代碼中的資源(如javascript寂祥、css荐虐、圖片等) –> 瀏覽器對頁面進(jìn)行渲染呈現(xiàn)給用戶
8.設(shè)計存儲海量數(shù)據(jù)的存儲系統(tǒng)
設(shè)計一個叫“中間層”的一個邏輯層,在這個層武翎,將數(shù)據(jù)庫的海量數(shù)據(jù)抓出來驯嘱,做成緩存,運行在服務(wù)器的內(nèi)存中,同理革屠,當(dāng)有新的數(shù)據(jù)到來,也先做成緩存誉尖,再想辦法烤咧,持久化到數(shù)據(jù)庫中,這是一個簡單的思路酪耳。主要的步驟是負(fù)載均衡浓恳,將不同用戶的請求分發(fā)到不同的處理節(jié)點上,然后先存入緩存碗暗,定時向主數(shù)據(jù)庫更新數(shù)據(jù)颈将。讀寫的過程采用類似樂觀鎖的機(jī)制,可以一直讀(在寫數(shù)據(jù)的時候也可以)言疗,但是每次讀的時候會有個版本的標(biāo)記晴圾,如果本次讀的版本低于緩存的版本,會重新讀數(shù)據(jù)噪奄,這樣的情況并不多死姚,可以忍受。
9.Session與Cookie
Cookie可以讓服務(wù)端跟蹤每個客戶端的訪問勤篮,但是每次客戶端的訪問都必須傳回這些Cookie都毒,如果Cookie很多,則無形的增加了客戶端與服務(wù)端的數(shù)據(jù)傳輸量碰缔,
而Session則很好地解決了這個問題账劲,同一個客戶端每次和服務(wù)端交互時,將數(shù)據(jù)存儲通過Session到服務(wù)端,不需要每次都傳回所有的Cookie值涤垫,而是傳回一個ID姑尺,每個客戶端第一次訪問服務(wù)器生成的唯一的ID,客戶端只要傳回這個ID就行了蝠猬,這個ID通常為NAME為JSESSIONID的一個Cookie切蟋。這樣服務(wù)端就可以通過這個ID,來將存儲到服務(wù)端的KV值取出了榆芦。
10.Session和Cookie的超時問題柄粹,Cookie的安全問題
分布式Session框架
配置服務(wù)器,Zookeeper集群管理服務(wù)器可以統(tǒng)一管理所有服務(wù)器的配置文件
共享這些Session存儲在一個分布式緩存中匆绣,可以隨時寫入和讀取驻右,而且性能要很好,如Memcache崎淳,Tair堪夭。
封裝一個類繼承自HttpSession,將Session存入到這個類中然后再存入分布式緩存中
由于Cookie不能跨域訪問拣凹,要實現(xiàn)Session同步森爽,要同步SessionID寫到不同域名下。
11.Spring事務(wù)配置方法:
1.切點信息嚣镜,用于定位實施事物切面的業(yè)務(wù)類方法
2.控制事務(wù)行為的事務(wù)屬性爬迟,這些屬性包括事物隔離級別,事務(wù)傳播行為菊匿,超時時間付呕,回滾規(guī)則。
Spring通過aop/tx Schema 命名空間和@Transaction注解技術(shù)來進(jìn)行聲明式事物配置跌捆。
12.Mybatis
每一個Mybatis的應(yīng)用程序都以一個SqlSessionFactory對象的實例為核心徽职。首先用字節(jié)流通過Resource將配置文件讀入,然后通過SqlSessionFactoryBuilder().build方法創(chuàng)建SqlSessionFactory佩厚,然后再通過SqlSessionFactory.openSession()方法創(chuàng)建一個SqlSession為每一個數(shù)據(jù)庫事務(wù)服務(wù)姆钉。
經(jīng)歷了Mybatis初始化 –>創(chuàng)建SqlSession –>運行SQL語句,返回結(jié)果三個過程
13.HashMap與HashTable的區(qū)別可款。
1育韩、HashMap是非線程安全的,HashTable是線程安全的闺鲸。
2筋讨、HashMap的鍵和值都允許有null值存在,而HashTable則不行摸恍。
3悉罕、因為線程安全的問題赤屋,HashMap效率比HashTable的要高。
14.HashMap的實現(xiàn)機(jī)制:
維護(hù)一個每個元素是一個鏈表的數(shù)組壁袄,而且鏈表中的每個節(jié)點是一個Entry[]鍵值對的數(shù)據(jù)結(jié)構(gòu)类早。
實現(xiàn)了數(shù)組+鏈表的特性,查找快嗜逻,插入刪除也快涩僻。
對于每個key,他對應(yīng)的數(shù)組索引下標(biāo)是 int i = hash(key.hashcode)&(len-1);
每個新加入的節(jié)點放在鏈表首,然后該新加入的節(jié)點指向原鏈表首
15.HashMap栈顷,ConcurrentHashMap與LinkedHashMap的區(qū)別
ConcurrentHashMap是使用了鎖分段技術(shù)技術(shù)來保證線程安全的逆日,鎖分段技術(shù):首先將數(shù)據(jù)分成一段一段的存儲,然后給每一段數(shù)據(jù)配一把鎖萄凤,當(dāng)一個線程占用鎖訪問其中一個段數(shù)據(jù)的時候室抽,其他段的數(shù)據(jù)也能被其他線程訪問
ConcurrentHashMap 是在每個段(segment)中線程安全的
LinkedHashMap維護(hù)一個雙鏈表,可以將里面的數(shù)據(jù)按寫入的順序讀出
ConcurrentHashMap應(yīng)用場景
1:ConcurrentHashMap的應(yīng)用場景是高并發(fā)靡努,但是并不能保證線程安全坪圾,而同步的HashMap和HashMap的是鎖住整個容器,而加鎖之后ConcurrentHashMap不需要鎖住整個容器惑朦,只需要鎖住對應(yīng)的Segment就好了兽泄,所以可以保證高并發(fā)同步訪問,提升了效率行嗤。
2:可以多線程寫已日。
ConcurrentHashMap把HashMap分成若干個Segmenet
1.get時垛耳,不加鎖栅屏,先定位到segment然后在找到頭結(jié)點進(jìn)行讀取操作。而value是volatile變量堂鲜,所以可以保證在競爭條件時保證讀取最新的值栈雳,如果讀到的value是null,則可能正在修改缔莲,那么就調(diào)用ReadValueUnderLock函數(shù)哥纫,加鎖保證讀到的數(shù)據(jù)是正確的。
2.Put時會加鎖痴奏,一律添加到hash鏈的頭部蛀骇。
3.Remove時也會加鎖,由于next是final類型不可改變读拆,所以必須把刪除的節(jié)點之前的節(jié)點都復(fù)制一遍擅憔。
4.ConcurrentHashMap允許多個修改操作并發(fā)進(jìn)行,其關(guān)鍵在于使用了鎖分離技術(shù)檐晕。它使用了多個鎖來控制對Hash表的不同Segment進(jìn)行的修改暑诸。
ConcurrentHashMap的應(yīng)用場景是高并發(fā)蚌讼,但是并不能保證線程安全,而同步的HashMap和HashTable的是鎖住整個容器个榕,而加鎖之后ConcurrentHashMap不需要鎖住整個容器篡石,只需要鎖住對應(yīng)的segment就好了,所以可以保證高并發(fā)同步訪問西采,提升了效率凰萨。
ConcurrentHashMap能夠保證每一次調(diào)用都是原子操作,但是并不保證多次調(diào)用之間也是原子操作械馆。
16.死鎖的必要條件
#互斥 至少有一個資源處于非共享狀態(tài)
#占有并等待
#非搶占
#循環(huán)等待
17.解決死鎖:
第一個是死鎖預(yù)防沟蔑,就是不讓上面的四個條件同時成立。
二是狱杰,合理分配資源瘦材。
三是使用銀行家算法,如果該進(jìn)程請求的資源操作系統(tǒng)剩余量可以滿足仿畸,那么就分配食棕。
18.進(jìn)程間的通信方式
1.管道( pipe ):管道是一種半雙工的通信方式,數(shù)據(jù)只能單向流動错沽,而且只能在具有親緣關(guān)系的進(jìn)程間使用簿晓。進(jìn)程的親緣關(guān)系通常是指父子進(jìn)程關(guān)系。
2.有名管道 (named pipe) : 有名管道也是半雙工的通信方式千埃,但是它允許無親緣關(guān)系進(jìn)程間的通信憔儿。
3.信號量( semophore ) : 信號量是一個計數(shù)器,可以用來控制多個進(jìn)程對共享資源的訪問放可。它常作為一種鎖機(jī)制谒臼,防止某進(jìn)程正在訪問共享資源時,其他進(jìn)程也訪問該資源耀里。因此蜈缤,主要作為進(jìn)程間以及同一進(jìn)程內(nèi)不同線程之間的同步手段。
4.消息隊列( message queue ) : 消息隊列是由消息的鏈表冯挎,存放在內(nèi)核中并由消息隊列標(biāo)識符標(biāo)識底哥。消息隊列克服了信號傳遞信息少、管道只能承載無格式字節(jié)流以及緩沖區(qū)大小受限等缺點房官。
5.信號 ( sinal ) : 信號是一種比較復(fù)雜的通信方式趾徽,用于通知接收進(jìn)程某個事件已經(jīng)發(fā)生。
6.共享內(nèi)存( shared memory ) :共享內(nèi)存就是映射一段能被其他進(jìn)程所訪問的內(nèi)存翰守,這段共享內(nèi)存由一個進(jìn)程創(chuàng)建孵奶,但多個進(jìn)程都可以訪問。共享內(nèi)存是最快的 IPC 方式潦俺,它是針對其他進(jìn)程間通信方式運行效率低而專門設(shè)計的拒课。它往往與其他通信機(jī)制徐勃,如信號量,配合使用早像,來實現(xiàn)進(jìn)程間的同步和通信僻肖。
7.套接字( socket ) : 套解口也是一種進(jìn)程間通信機(jī)制,與其他通信機(jī)制不同的是卢鹦,它可用于不同機(jī)器間的進(jìn)程通信臀脏。
19.Hibernate
Hibernate的一級緩存是由Session提供的,因此它只存在于Session的生命周期中冀自,當(dāng)程序調(diào)用save(),update(),saveOrUpdate()等方法 及調(diào)用查詢接口list,filter,iterate時揉稚,如Session緩存中還不存在相應(yīng)的對象,Hibernate會把該對象加入到一級緩存中熬粗,當(dāng)Session關(guān)閉的時候緩存也會消失搀玖。
Hibernate的一級緩存是Session所內(nèi)置的,不能被卸載驻呐,也不能進(jìn)行任何配置一級緩存采用的是key-value的Map方式來實現(xiàn)的灌诅,在緩存實體對象時,對象的主關(guān)鍵字ID是Map的key含末,實體對象就是對應(yīng)的值猜拾。
Hibernate二級緩存:把獲得的所有數(shù)據(jù)對象根據(jù)ID放入到第二級緩存中。Hibernate二級緩存策略佣盒,是針對于ID查詢的緩存策略挎袜,刪除、更新肥惭、增加數(shù)據(jù)的時候盯仪,同時更新緩存。
20.進(jìn)程和線程的區(qū)別:
進(jìn)程:每個進(jìn)程都有獨立的代碼和數(shù)據(jù)空間(進(jìn)程上下文)务豺,進(jìn)程間的切換會有較大的開銷磨总,一個進(jìn)程包含1–n個線程嗦明。
靜態(tài)的程序文件如exe笼沥、class文件等
線程:同一類線程共享代碼和數(shù)據(jù)空間,每個線程有獨立的運行棧和程序計數(shù)器(PC)娶牌,線程切換開銷小奔浅。
一個程序里(進(jìn)程里)面不同的執(zhí)行路徑(從main方法開始)
線程和進(jìn)程一樣分為五個階段:創(chuàng)建、就緒诗良、運行汹桦、阻塞、終止鉴裹。
多進(jìn)程是指操作系統(tǒng)能同時運行多個任務(wù)(程序)舞骆。
多線程是指在同一程序中有多個順序流在執(zhí)行钥弯。
在java中要想實現(xiàn)多線程,有三種手段督禽,一種是繼續(xù)Thread類脆霎,另外一種是實現(xiàn)Runable接口,還有就是實現(xiàn)Callable接口狈惫。
wait()和sleep()的區(qū)別
sleep來自Thread類睛蛛,和wait來自O(shè)bject類
調(diào)用sleep()方法的過程中,線程不會釋放對象鎖胧谈。而 調(diào)用 wait 方法線程會釋放對象鎖
sleep睡眠后不出讓系統(tǒng)資源忆肾,wait讓出系統(tǒng)資源其他線程可以占用CPU
sleep(milliseconds)需要指定一個睡眠時間,時間一到會自動喚醒
21.Override和Overload的含義以及區(qū)別
a.Overload顧名思義是重新加載菱肖,它可以表現(xiàn)類的多態(tài)性客冈,可以是函數(shù)里面可以有相同的函數(shù)名但是參數(shù)名、返回值稳强、類型不能相同郊酒;或者說可以改變參數(shù)、類型键袱、返回值但是函數(shù)名字依然不變燎窘。
b.就是ride(重寫)的意思,在子類繼承父類的時候子類中可以定義某方法與其父類有相同的名稱和參數(shù)蹄咖,當(dāng)子類在調(diào)用這一函數(shù)時自動調(diào)用子類的方法褐健,而父類相當(dāng)于被覆蓋(重寫)了。
22.抽象類和接口的區(qū)別
a.一個類只能繼承單個類澜汤,但是可以實現(xiàn)多個接口
b.抽象類中可以有構(gòu)造方法蚜迅,接口中不能有構(gòu)造方法
c.抽象類中的所有方法并不一定要是抽象的,你可以選擇在抽象類中實現(xiàn)一些基本的方法俊抵。而接口要求所有的方法都必須是抽象的
d.抽象類中可以包含靜態(tài)方法谁不,接口中不可以
e.抽象類中可以有普通成員變量,接口中不可以
23.解析XML的幾種方式的原理與特點:DOM徽诲、SAX刹帕、PULL
a.DOM:消耗內(nèi)存:先把xml文檔都讀到內(nèi)存中,然后再用DOM API來訪問樹形結(jié)構(gòu)谎替,并獲取數(shù)據(jù)偷溺。這個寫起來很簡單,但是很消耗內(nèi)存钱贯。要是數(shù)據(jù)過大挫掏,手機(jī)不夠牛逼,可能手機(jī)直接死機(jī)
b.SAX:解析效率高秩命,占用內(nèi)存少尉共,基于事件驅(qū)動的:更加簡單地說就是對文檔進(jìn)行順序掃描褒傅,當(dāng)掃描到文檔(document)開始與結(jié)束、元素(element)開始與結(jié)束袄友、文檔(document)結(jié)束等地方時通知事件處理函數(shù)樊卓,由事件處理函數(shù)做相應(yīng)動作,然后繼續(xù)同樣的掃描杠河,直至文檔結(jié)束碌尔。
c.PULL:與 SAX 類似,也是基于事件驅(qū)動券敌,我們可以調(diào)用它的next()方法唾戚,來獲取下一個解析事件(就是開始文檔,結(jié)束文檔待诅,開始標(biāo)簽叹坦,結(jié)束標(biāo)簽),當(dāng)處于某個元素時可以調(diào)用XmlPullParser的getAttributte()方法來獲取屬性的值卑雁,也可調(diào)用它的nextText()獲取本節(jié)點的值募书。
24.JAVA 中堆和棧的區(qū)別,說下java 的內(nèi)存機(jī)制
a.基本數(shù)據(jù)類型比變量和對象的引用都是在棧分配的
b.堆內(nèi)存用來存放由new創(chuàng)建的對象和數(shù)組
c.類變量(static修飾的變量)测蹲,程序在一加載的時候就在堆中為類變量分配內(nèi)存莹捡,堆中的內(nèi)存地址存放在棧中
d.實例變量:當(dāng)你使用java關(guān)鍵字new的時候,系統(tǒng)在堆中開辟并不一定是連續(xù)的空間分配給變量扣甲,是根據(jù)零散的堆內(nèi)存地址篮赢,通過哈希算法換算為一長串?dāng)?shù)字以表征這個變量在堆中的”物理位置”,實例變量的生命周期–當(dāng)實例變量的引用丟失后,將被GC(垃圾回收器)列入可回收“名單”中琉挖,但并不是馬上就釋放堆中內(nèi)存
e.局部變量: 由聲明在某方法启泣,或某代碼段里(比如for循環(huán)),執(zhí)行到它的時候在棧中開辟內(nèi)存示辈,當(dāng)局部變量一但脫離作用域寥茫,內(nèi)存立即釋放
25.JAVA多態(tài)的實現(xiàn)原理
a.抽象的來講,多態(tài)的意思就是同一消息可以根據(jù)發(fā)送對象的不同而采用多種不同的行為方式矾麻。(發(fā)送消息就是函數(shù)調(diào)用)
b.實現(xiàn)的原理是動態(tài)綁定纱耻,程序調(diào)用的方法在運行期才動態(tài)綁定,追溯源碼可以發(fā)現(xiàn)射富,JVM 通過參數(shù)的自動轉(zhuǎn)型來找到合適的辦法膝迎。
26.多態(tài)
一、什么是多態(tài)
面向?qū)ο蟮娜筇匦?/b>:封裝胰耗、繼承、多態(tài)
多態(tài)的定義:指允許不同類的對象對同一消息做出響應(yīng)芒涡。即同一消息可以根據(jù)發(fā)送對象的不同而采用多種不同的行為方式柴灯。(發(fā)送消息就是函數(shù)調(diào)用)
實現(xiàn)多態(tài)的技術(shù)稱為:動態(tài)綁定(dynamic binding)卖漫,是指在執(zhí)行期間判斷所引用對象的實際類型,根據(jù)其實際的類型調(diào)用其相應(yīng)的方法赠群。
多態(tài)的作用:消除類型之間的耦合關(guān)系羊始。
二、多態(tài)發(fā)生的三個必要條件
1.要有繼承
2.要有重寫
3.父類引用指向子類對像
27.Spring?概述
1.?什么是spring?
Spring?是個java企業(yè)級應(yīng)用的開源開發(fā)框架查描。Spring主要用來開發(fā)Java應(yīng)用突委,但是有些擴(kuò)展是針對構(gòu)建J2EE平臺的web應(yīng)用。Spring?框架目標(biāo)是簡化Java企業(yè)級應(yīng)用開發(fā)冬三,并通過POJO為基礎(chǔ)的編程模型促進(jìn)良好的編程習(xí)慣匀油。
2.?使用Spring框架的好處是什么?
輕量:Spring?是輕量的勾笆,基本的版本大約2MB敌蚜。
控制反轉(zhuǎn):Spring通過控制反轉(zhuǎn)實現(xiàn)了松散耦合,對象們給出它們的依賴窝爪,而不是創(chuàng)建或查找依賴的對象們弛车。
面向切面的編程(AOP):Spring支持面向切面的編程,并且把應(yīng)用業(yè)務(wù)邏輯和系統(tǒng)服務(wù)分開蒲每。
容器:Spring?包含并管理應(yīng)用中對象的生命周期和配置纷跛。
MVC框架:Spring的WEB框架是個精心設(shè)計的框架,是Web框架的一個很好的替代品邀杏。
事務(wù)管理:Spring?提供一個持續(xù)的事務(wù)管理接口忽舟,可以擴(kuò)展到上至本地事務(wù)下至全局事務(wù)(JTA)。
異常處理:Spring?提供方便的API把具體技術(shù)相關(guān)的異常(比如由JDBC淮阐,Hibernate?or?JDO拋出的)轉(zhuǎn)化為一致的unchecked?異常叮阅。
3.??Spring由哪些模塊組成?
以下是Spring?框架的基本模塊:
Core?module
Bean?module
Context?module
Expression?Language?module
JDBC?module
ORM?module
OXM?module
Java?Messaging?Service(JMS)?module
Transaction?module
Web?module
Web-Servlet?module
Web-Struts?module
Web-Portlet?module
4. 核心容器(應(yīng)用上下文)?模塊。
這是基本的Spring模塊泣特,提供spring?框架的基礎(chǔ)功能浩姥,BeanFactory?是?任何以spring為基礎(chǔ)的應(yīng)用的核心。Spring?框架建立在此模塊之上状您,它使Spring成為一個容器勒叠。
5.?BeanFactory?–?BeanFactory?實現(xiàn)舉例。
Bean?工廠是工廠模式的一個實現(xiàn)膏孟,提供了控制反轉(zhuǎn)功能眯分,用來把應(yīng)用的配置和依賴從正真的應(yīng)用代碼中分離。
最常用的BeanFactory?實現(xiàn)是XmlBeanFactory?類柒桑。
6.?XMLBeanFactory?
最常用的就是org.springframework.beans.factory.xml.XmlBeanFactory?弊决,它根據(jù)XML文件中的定義加載beans。該容器從XML?文件讀取配置元數(shù)據(jù)并用它去創(chuàng)建一個完全配置的系統(tǒng)或應(yīng)用。
7.?解釋AOP模塊
AOP模塊用于發(fā)給我們的Spring應(yīng)用做面向切面的開發(fā)飘诗,?很多支持由AOP聯(lián)盟提供与倡,這樣就確保了Spring和其他AOP框架的共通性。這個模塊將元數(shù)據(jù)編程引入Spring昆稿。
8.?解釋JDBC抽象和DAO模塊纺座。
通過使用JDBC抽象和DAO模塊,保證數(shù)據(jù)庫代碼的簡潔溉潭,并能避免數(shù)據(jù)庫資源錯誤關(guān)閉導(dǎo)致的問題净响,它在各種不同的數(shù)據(jù)庫的錯誤信息之上,提供了一個統(tǒng)一的異常訪問層喳瓣。它還利用Spring的AOP?模塊給Spring應(yīng)用中的對象提供事務(wù)管理服務(wù)馋贤。
9.?解釋對象/關(guān)系映射集成模塊。
Spring?通過提供ORM模塊夫椭,支持我們在直接JDBC之上使用一個對象/關(guān)系映射映射(ORM)工具掸掸,Spring?支持集成主流的ORM框架,如Hiberate,JDO和?iBATIS?SQL?Maps蹭秋。Spring的事務(wù)管理同樣支持以上所有ORM框架及JDBC扰付。
10.??解釋W(xué)EB?模塊。
Spring的WEB模塊是構(gòu)建在application?context?模塊基礎(chǔ)之上仁讨,提供一個適合web應(yīng)用的上下文羽莺。這個模塊也包括支持多種面向web的任務(wù),如透明地處理多個文件上傳請求和程序級請求參數(shù)的綁定到你的業(yè)務(wù)對象洞豁。它也有對Jakarta?Struts的支持盐固。
12.??Spring配置文件
Spring配置文件是個XML?文件,這個文件包含了類信息丈挟,描述了如何配置它們刁卜,以及如何相互調(diào)用。
13.??什么是Spring?IOC?容器曙咽?
Spring?IOC?負(fù)責(zé)創(chuàng)建對象蛔趴,管理對象(通過依賴注入(DI),裝配對象例朱,配置對象孝情,并且管理這些對象的整個生命周期。
14.??IOC的優(yōu)點是什么洒嗤?
IOC?或?依賴注入把應(yīng)用的代碼量降到最低箫荡。它使應(yīng)用容易測試,單元測試不再需要單例和JNDI查找機(jī)制渔隶。最小的代價和最小的侵入性使松散耦合得以實現(xiàn)羔挡。IOC容器支持加載服務(wù)時的餓漢式初始化和懶加載吐辙。
15.?ApplicationContext通常的實現(xiàn)是什么?
FileSystemXmlApplicationContext?:此容器從一個XML文件中加載beans的定義酒奶,XML?Bean?配置文件的全路徑名必須提供給它的構(gòu)造函數(shù)灶似。
ClassPathXmlApplicationContext:此容器也從一個XML文件中加載beans的定義幻林,這里终吼,你需要正確設(shè)置classpath因為這個容器將在classpath里找bean配置镀赌。
WebXmlApplicationContext:此容器加載一個XML文件,此文件定義了一個WEB應(yīng)用的所有bean际跪。
16.?Bean?工廠和?Application?contexts??有什么區(qū)別商佛?
Application?contexts提供一種方法處理文本消息,一個通常的做法是加載文件資源(比如鏡像)姆打,它們可以向注冊為監(jiān)聽器的bean發(fā)布事件良姆。另外,在容器或容器內(nèi)的對象上執(zhí)行的那些不得不由bean工廠以程序化方式處理的操作幔戏,可以在Application?contexts中以聲明的方式處理玛追。Application?contexts實現(xiàn)了MessageSource接口,該接口的實現(xiàn)以可插拔的方式提供獲取本地化消息的方法闲延。
17.?一個Spring的應(yīng)用看起來象什么痊剖?
一個定義了一些功能的接口。
這實現(xiàn)包括屬性垒玲,它的Setter 陆馁, getter?方法和函數(shù)等。
Spring?AOP合愈。
Spring?的XML?配置文件叮贩。
使用以上功能的客戶端程序。
依賴注入
18.?什么是Spring的依賴注入佛析?
依賴注入益老,是IOC的一個方面,是個通常的概念寸莫,它有多種解釋捺萌。這概念是說你不用創(chuàng)建對象,而只需要描述它如何被創(chuàng)建储狭。你不在代碼里直接組裝你的組件和服務(wù)互婿,但是要在配置文件里描述哪些組件需要哪些服務(wù),之后一個容器(IOC容器)負(fù)責(zé)把他們組裝起來辽狈。
19.??有哪些不同類型的IOC(依賴注入)方式慈参?
構(gòu)造器依賴注入:構(gòu)造器依賴注入通過容器觸發(fā)一個類的構(gòu)造器來實現(xiàn)的,該類有一系列參數(shù)刮萌,每個參數(shù)代表一個對其他類的依賴驮配。
Setter方法注入:Setter方法注入是容器通過調(diào)用無參構(gòu)造器或無參static工廠?方法實例化bean之后,調(diào)用該bean的setter方法,即實現(xiàn)了基于setter的依賴注入壮锻。
20.?哪種依賴注入方式你建議使用琐旁,構(gòu)造器注入,還是?Setter方法注入猜绣?
你兩種依賴方式都可以使用灰殴,構(gòu)造器注入和Setter方法注入。最好的解決方案是用構(gòu)造器參數(shù)實現(xiàn)強(qiáng)制依賴掰邢,setter方法實現(xiàn)可選依賴牺陶。
Spring?Beans
21.什么是Spring?beans?
Spring?beans?是那些形成Spring應(yīng)用的主干的java對象。它們被Spring?IOC容器初始化辣之,裝配掰伸,和管理。這些beans通過容器中配置的元數(shù)據(jù)創(chuàng)建怀估。比如狮鸭,以XML文件中?的形式定義。
Spring?框架定義的beans都是單件beans多搀。在bean?tag中有個屬性”singleton”歧蕉,如果它被賦為TRUE,bean?就是單件酗昼,否則就是一個?prototype?bean廊谓。默認(rèn)是TRUE,所以所有在Spring框架中的beans?缺省都是單件麻削。
22.?一個?Spring?Bean?定義?包含什么蒸痹?
一個Spring?Bean?的定義包含容器必知的所有配置元數(shù)據(jù),包括如何創(chuàng)建一個bean呛哟,它的生命周期詳情及它的依賴叠荠。
23.?如何給Spring?容器提供配置元數(shù)據(jù)?
這里有三種重要的方法給Spring?容器提供配置元數(shù)據(jù)。
XML配置文件扫责。
基于注解的配置榛鼎。
基于java的配置。
24.?你怎樣定義類的作用域??
當(dāng)定義一個?在Spring里鳖孤,我們還能給這個bean聲明一個作用域者娱。它可以通過bean?定義中的scope屬性來定義。如苏揣,當(dāng)Spring要在需要的時候每次生產(chǎn)一個新的bean實例黄鳍,bean的scope屬性被指定為prototype。另一方面平匈,一個bean每次使用的時候必須返回同一個實例框沟,這個bean的scope?屬性?必須設(shè)為?singleton藏古。
25.?解釋Spring支持的幾種bean的作用域。
Spring框架支持以下五種bean的作用域:
singleton?:?bean在每個Spring?ioc?容器中只有一個實例忍燥。
prototype:一個bean的定義可以有多個實例拧晕。
request:每次http請求都會創(chuàng)建一個bean,該作用域僅在基于web的Spring?ApplicationContext情形下有效梅垄。
session:在一個HTTP?Session中厂捞,一個bean定義對應(yīng)一個實例。該作用域僅在基于web的Spring?ApplicationContext情形下有效哎甲。
global-session:在一個全局的HTTP?Session中蔫敲,一個bean定義對應(yīng)一個實例饲嗽。該作用域僅在基于web的Spring?ApplicationContext情形下有效炭玫。
缺省的Spring?bean?的作用域是Singleton.
26.?Spring框架中的單例bean是線程安全的嗎?
不,Spring框架中的單例bean不是線程安全的貌虾。
27.?解釋Spring框架中bean的生命周期吞加。
Spring容器?從XML?文件中讀取bean的定義,并實例化bean尽狠。
Spring根據(jù)bean的定義填充所有的屬性衔憨。
如果bean實現(xiàn)了BeanNameAware?接口,Spring?傳遞bean?的ID?到?setBeanName方法袄膏。
如果Bean?實現(xiàn)了?BeanFactoryAware?接口践图,?Spring傳遞beanfactory?給setBeanFactory?方法。
如果有任何與bean相關(guān)聯(lián)的BeanPostProcessors沉馆,Spring會在postProcesserBeforeInitialization()方法內(nèi)調(diào)用它們码党。
如果bean實現(xiàn)IntializingBean了,調(diào)用它的afterPropertySet方法斥黑,如果bean聲明了初始化方法揖盘,調(diào)用此初始化方法。
如果有BeanPostProcessors?和bean?關(guān)聯(lián)锌奴,這些bean的postProcessAfterInitialization()?方法將被調(diào)用兽狭。
如果bean實現(xiàn)了?DisposableBean,它將調(diào)用destroy()方法鹿蜀。
28.??哪些是重要的bean生命周期方法箕慧??你能重載它們嗎?
有兩個重要的bean?生命周期方法茴恰,第一個是setup?颠焦,?它是在容器加載bean的時候被調(diào)用。第二個方法是?teardown??它是在容器卸載類的時候被調(diào)用琐簇。
The?bean?標(biāo)簽有兩個重要的屬性(init-method和destroy-method)蒸健。用它們你可以自己定制初始化和注銷方法座享。它們也有相應(yīng)的注解(@PostConstruct和@PreDestroy)。
29.?什么是Spring的內(nèi)部bean似忧?
當(dāng)一個bean僅被用作另一個bean的屬性時渣叛,它能被聲明為一個內(nèi)部bean,為了定義inner?bean盯捌,在Spring?的?基于XML的?配置元數(shù)據(jù)中淳衙,可以在?或??元素內(nèi)使用?元素,內(nèi)部bean通常是匿名的饺著,它們的Scope一般是prototype箫攀。
30.?在?Spring中如何注入一個java集合?
Spring提供以下幾種集合的配置元素:
類型用于注入一列值幼衰,允許有相同的值靴跛。
?類型用于注入一組值,不允許有相同的值渡嚣。
?類型用于注入一組鍵值對梢睛,鍵和值都可以為任意類型。
類型用于注入一組鍵值對识椰,鍵和值都只能為String類型绝葡。
31.?什么是bean裝配??
裝配,或bean?裝配是指在Spring?容器中把bean組裝到一起腹鹉,前提是容器需要知道bean的依賴關(guān)系藏畅,如何通過依賴注入來把它們裝配到一起。
32.?什么是bean的自動裝配功咒?
Spring?容器能夠自動裝配相互合作的bean愉阎,這意味著容器不需要和配置,能通過Bean工廠自動處理bean之間的協(xié)作航瞭。
33.?解釋不同方式的自動裝配?诫硕。
有五種自動裝配的方式,可以用來指導(dǎo)Spring容器用自動裝配方式來進(jìn)行依賴注入刊侯。
no:默認(rèn)的方式是不進(jìn)行自動裝配章办,通過顯式設(shè)置ref?屬性來進(jìn)行裝配。
byName:通過參數(shù)名?自動裝配滨彻,Spring容器在配置文件中發(fā)現(xiàn)bean的autowire屬性被設(shè)置成byname藕届,之后容器試圖匹配、裝配和該bean的屬性具有相同名字的bean亭饵。
byType::通過參數(shù)類型自動裝配休偶,Spring容器在配置文件中發(fā)現(xiàn)bean的autowire屬性被設(shè)置成byType,之后容器試圖匹配辜羊、裝配和該bean的屬性具有相同類型的bean踏兜。如果有多個bean符合條件词顾,則拋出錯誤。
constructor:這個方式類似于byType碱妆,?但是要提供給構(gòu)造器參數(shù)肉盹,如果沒有確定的帶參數(shù)的構(gòu)造器參數(shù)類型,將會拋出異常疹尾。
autodetect:首先嘗試使用constructor來自動裝配上忍,如果無法工作,則使用byType方式纳本。
34.自動裝配有哪些局限性??
自動裝配的局限性是:
重寫:?你仍需用?和??配置來定義依賴窍蓝,意味著總要重寫自動裝配。
基本數(shù)據(jù)類型:你不能自動裝配簡單的屬性繁成,如基本數(shù)據(jù)類型吓笙,String字符串,和類朴艰。
模糊特性:自動裝配不如顯式裝配精確观蓄,如果有可能,建議使用顯式裝配祠墅。
35.?你可以在Spring中注入一個null?和一個空字符串嗎?
可以歌径。
Spring注解
36.?什么是基于Java的Spring注解配置??給一些注解的例子.
基于Java的配置毁嗦,允許你在少量的Java注解的幫助下,進(jìn)行你的大部分Spring配置而非通過XML文件回铛。
以@Configuration?注解為例狗准,它用來標(biāo)記類可以當(dāng)做一個bean的定義,被Spring IOC容器使用茵肃。另一個例子是@Bean注解腔长,它表示此方法將要返回一個對象,作為一個bean注冊進(jìn)Spring應(yīng)用上下文验残。
37.?什么是基于注解的容器配置?
相對于XML文件捞附,注解型的配置依賴于通過字節(jié)碼元數(shù)據(jù)裝配組件,而非尖括號的聲明您没。
開發(fā)者通過在相應(yīng)的類鸟召,方法或?qū)傩陨鲜褂米⒔獾姆绞剑苯咏M件類中進(jìn)行配置氨鹏,而不是使用xml表述bean的裝配關(guān)系欧募。
38.?怎樣開啟注解裝配?
注解裝配在默認(rèn)情況下是不開啟的仆抵,為了使用注解裝配跟继,我們必須在Spring配置文件中配置?元素种冬。
39.?@Required??注解
這個注解表明bean的屬性必須在配置的時候設(shè)置,通過一個bean定義的顯式的屬性值或通過自動裝配舔糖,若@Required注解的bean屬性未被設(shè)置碌廓,容器將拋出BeanInitializationException。
40.?@Autowired?注解
@Autowired?注解提供了更細(xì)粒度的控制剩盒,包括在何處以及如何完成自動裝配谷婆。它的用法和@Required一樣,修飾setter方法辽聊、構(gòu)造器纪挎、屬性或者具有任意名稱和/或多個參數(shù)的PN方法。
41.?@Qualifier?注解
當(dāng)有多個相同類型的bean卻只有一個需要自動裝配時跟匆,將@Qualifier?注解和@Autowire?注解結(jié)合使用以消除這種混淆异袄,指定需要裝配的確切的bean。
Spring數(shù)據(jù)訪問
42.在Spring框架中如何更有效地使用JDBC??
使用SpringJDBC?框架玛臂,資源管理和錯誤處理的代價都會被減輕烤蜕。所以開發(fā)者只需寫statements?和?queries從數(shù)據(jù)存取數(shù)據(jù),JDBC也可以在Spring框架提供的模板類的幫助下更有效地被使用迹冤,這個模板叫JdbcTemplate?(例子見這里here)
43.?JdbcTemplate
JdbcTemplate?類提供了很多便利的方法解決諸如把數(shù)據(jù)庫數(shù)據(jù)轉(zhuǎn)變成基本數(shù)據(jù)類型或?qū)ο蠓碛瑘?zhí)行寫好的或可調(diào)用的數(shù)據(jù)庫操作語句,提供自定義的數(shù)據(jù)錯誤處理泡徙。
44.?Spring對DAO的支持
Spring對數(shù)據(jù)訪問對象(DAO)的支持旨在簡化它和數(shù)據(jù)訪問技術(shù)如JDBC橱鹏,Hibernate?or?JDO?結(jié)合使用。這使我們可以方便切換持久層堪藐。編碼時也不用擔(dān)心會捕獲每種技術(shù)特有的異常莉兰。
45. 使用Spring通過什么方式訪問Hibernate??
在Spring中有兩種方式訪問Hibernate:
控制反轉(zhuǎn)??Hibernate?Template和?Callback。
繼承?HibernateDAOSupport提供一個AOP?攔截器礁竞。
46.?Spring支持的ORM
Spring支持以下ORM:
Hibernate
iBatis
JPA?(Java?Persistence?API)
TopLink
JDO?(Java?Data?Objects)
OJB
47.如何通過HibernateDaoSupport將Spring和Hibernate結(jié)合起來糖荒?
用Spring的?SessionFactory?調(diào)用?LocalSessionFactory。集成過程分三步:
配置the?Hibernate?SessionFactory模捂。
繼承HibernateDaoSupport實現(xiàn)一個DAO捶朵。
在AOP支持的事務(wù)中裝配。
48.?Spring支持的事務(wù)管理類型
Spring支持兩種類型的事務(wù)管理:
編程式事務(wù)管理:這意味你通過編程的方式管理事務(wù)枫绅,給你帶來極大的靈活性泉孩,但是難維護(hù)。
聲明式事務(wù)管理:這意味著你可以將業(yè)務(wù)代碼和事務(wù)管理分離并淋,你只需用注解和XML配置來管理事務(wù)寓搬。
49.?Spring框架的事務(wù)管理有哪些優(yōu)點?
它為不同的事務(wù)API??如?JTA县耽,JDBC句喷,Hibernate镣典,JPA?和JDO,提供一個不變的編程模式唾琼。
它為編程式事務(wù)管理提供了一套簡單的API而不是一些復(fù)雜的事務(wù)API如
它支持聲明式事務(wù)管理兄春。
它和Spring各種數(shù)據(jù)訪問抽象層很好得集成。
50.?你更傾向用那種事務(wù)管理類型锡溯?
大多數(shù)Spring框架的用戶選擇聲明式事務(wù)管理赶舆,因為它對應(yīng)用代碼的影響最小,因此更符合一個無侵入的輕量級容器的思想祭饭。聲明式事務(wù)管理要優(yōu)于編程式事務(wù)管理芜茵,雖然比編程式事務(wù)管理(這種方式允許你通過代碼控制事務(wù))少了一點靈活性。
Spring面向切面編程(AOP)
51.??解釋AOP
面向切面的編程倡蝙,或AOP九串,?是一種編程技術(shù),允許程序模塊化橫向切割關(guān)注點寺鸥,或橫切典型的責(zé)任劃分猪钮,如日志和事務(wù)管理。
52.?Aspect?切面
AOP核心就是切面胆建,它將多個類的通用行為封裝成可重用的模塊烤低,該模塊含有一組API提供橫切功能。比如眼坏,一個日志模塊可以被稱作日志的AOP切面拂玻。根據(jù)需求的不同,一個應(yīng)用程序可以有若干切面宰译。在Spring?AOP中,切面通過帶有@Aspect注解的類實現(xiàn)魄懂。
52.?在Spring?AOP?中沿侈,關(guān)注點和橫切關(guān)注的區(qū)別是什么?
關(guān)注點是應(yīng)用中一個模塊的行為市栗,一個關(guān)注點可能會被定義成一個我們想實現(xiàn)的一個功能缀拭。
橫切關(guān)注點是一個關(guān)注點,此關(guān)注點是整個應(yīng)用都會使用的功能填帽,并影響整個應(yīng)用蛛淋,比如日志,安全和數(shù)據(jù)傳輸篡腌,幾乎應(yīng)用的每個模塊都需要的功能褐荷。因此這些都屬于橫切關(guān)注點。
54.?連接點
連接點代表一個應(yīng)用程序的某個位置嘹悼,在這個位置我們可以插入一個AOP切面叛甫,它實際上是個應(yīng)用程序執(zhí)行Spring?AOP的位置层宫。
55.?通知
通知是個在方法執(zhí)行前或執(zhí)行后要做的動作,實際上是程序執(zhí)行時要通過SpringAOP框架觸發(fā)的代碼段其监。
Spring切面可以應(yīng)用五種類型的通知:
before:前置通知萌腿,在一個方法執(zhí)行前被調(diào)用。
after:?在方法執(zhí)行之后調(diào)用的通知抖苦,無論方法執(zhí)行是否成功毁菱。
after-returning:?僅當(dāng)方法成功完成后執(zhí)行的通知。
after-throwing:?在方法拋出異常退出時執(zhí)行的通知锌历。
around:?在方法執(zhí)行之前和之后調(diào)用的通知贮庞。
56.?切點
切入點是一個或一組連接點,通知將在這些位置執(zhí)行辩涝∶撤ィ可以通過表達(dá)式或匹配的方式指明切入點。
57.?什么是引入??
引入允許我們在已存在的類中增加新的方法和屬性怔揩。
58.?什么是目標(biāo)對象??
被一個或者多個切面所通知的對象捉邢。它通常是一個代理對象。也指被通知(advised)對象商膊。
59.?什么是代理?
代理是通知目標(biāo)對象后創(chuàng)建的對象伏伐。從客戶端的角度看,代理對象和目標(biāo)對象是一樣的晕拆。
60.?有幾種不同類型的自動代理藐翎?
BeanNameAutoProxyCreator
DefaultAdvisorAutoProxyCreator
Metadata?autoproxying
61.?什么是織入。什么是織入應(yīng)用的不同點实幕?
織入是將切面和到其他應(yīng)用類型或?qū)ο筮B接或創(chuàng)建一個被通知對象的過程吝镣。
織入可以在編譯時,加載時昆庇,或運行時完成末贾。
62.?解釋基于XML?Schema方式的切面實現(xiàn)。
在這種情況下整吆,切面由常規(guī)類以及基于XML的配置實現(xiàn)拱撵。
63.?解釋基于注解的切面實現(xiàn)
在這種情況下(基于@AspectJ的實現(xiàn)),涉及到的切面聲明的風(fēng)格與帶有java5標(biāo)注的普通java類一致表蝙。
Spring?的MVC
64.?什么是Spring的MVC框架拴测?
Spring?配備構(gòu)建Web?應(yīng)用的全功能MVC框架。Spring可以很便捷地和其他MVC框架集成府蛇,如Struts集索,Spring?的MVC框架用控制反轉(zhuǎn)把業(yè)務(wù)對象和控制邏輯清晰地隔離。它也允許以聲明的方式把請求參數(shù)和業(yè)務(wù)對象綁定。
65.?DispatcherServlet
Spring的MVC框架是圍繞DispatcherServlet來設(shè)計的抄谐,它用來處理所有的HTTP請求和響應(yīng)渺鹦。
66.?WebApplicationContext
WebApplicationContext?繼承了ApplicationContext??并增加了一些WEB應(yīng)用必備的特有功能,它不同于一般的ApplicationContext?蛹含,因為它能處理主題毅厚,并找到被關(guān)聯(lián)的servlet。
67.?什么是Spring?MVC框架的控制器浦箱?
控制器提供一個訪問應(yīng)用程序的行為吸耿,此行為通常通過服務(wù)接口實現(xiàn)】峥控制器解析用戶輸入并將其轉(zhuǎn)換為一個由視圖呈現(xiàn)給用戶的模型咽安。Spring用一個非常抽象的方式實現(xiàn)了一個控制層,允許用戶創(chuàng)建多種用途的控制器蓬推。
68.?@Controller?注解
該注解表明該類扮演控制器的角色妆棒,Spring不需要你繼承任何其他控制器基類或引用Servlet?API。
69.?@RequestMapping?注解
該注解是用來映射一個URL到一個類或一個特定的方處理法上沸伏。
28.JAVA面試中問及HIBERNATE與 MYBATIS的對比
第一方面:開發(fā)速度的對比
就開發(fā)速度而言糕珊,Hibernate的真正掌握要比Mybatis來得難些。Mybatis框架相對簡單很容易上手毅糟,但也相對簡陋些红选。個人覺得要用好Mybatis還是首先要先理解好Hibernate。
比起兩者的開發(fā)速度姆另,不僅僅要考慮到兩者的特性及性能喇肋,更要根據(jù)項目需求去考慮究竟哪一個更適合項目開發(fā),比如:一個項目中用到的復(fù)雜查詢基本沒有迹辐,就是簡單的增刪改查蝶防,這樣選擇hibernate效率就很快了,因為基本的sql語句已經(jīng)被封裝好了明吩,根本不需要你去寫sql語句慧脱,這就節(jié)省了大量的時間,但是對于一個大型項目贺喝,復(fù)雜語句較多,這樣再去選擇hibernate就不是一個太好的選擇宗兼,選擇mybatis就會加快許多躏鱼,而且語句的管理也比較方便。
第二方面:開發(fā)工作量的對比
Hibernate和MyBatis都有相應(yīng)的代碼生成工具殷绍∪究粒可以生成簡單基本的DAO層方法。針對高級查詢,Mybatis需要手動編寫SQL語句茶行,以及ResultMap躯概。而Hibernate有良好的映射機(jī)制,開發(fā)者無需關(guān)心SQL的生成與結(jié)果映射畔师,可以更專注于業(yè)務(wù)流程娶靡。
第三方面:sql優(yōu)化方面
Hibernate的查詢會將表中的所有字段查詢出來,這一點會有性能消耗看锉。Hibernate也可以自己寫SQL來指定需要查詢的字段姿锭,但這樣就破壞了Hibernate開發(fā)的簡潔性。而Mybatis的SQL是手動編寫的伯铣,所以可以按需求指定查詢的字段呻此。
Hibernate HQL語句的調(diào)優(yōu)需要將SQL打印出來,而Hibernate的SQL被很多人嫌棄因為太丑了腔寡。MyBatis的SQL是自己手動寫的所以調(diào)整方便焚鲜。但Hibernate具有自己的日志統(tǒng)計。Mybatis本身不帶日志統(tǒng)計放前,使用Log4j進(jìn)行日志記錄忿磅。
第四方面:對象管理的對比
Hibernate?是完整的對象/關(guān)系映射解決方案,它提供了對象狀態(tài)管理(state management)的功能犀斋,使開發(fā)者不再需要理會底層數(shù)據(jù)庫系統(tǒng)的細(xì)節(jié)贝乎。也就是說,相對于常見的?JDBC/SQL?持久層方案中需要管理?SQL?語句叽粹,Hibernate采用了更自然的面向?qū)ο蟮囊暯莵沓志没?Java?應(yīng)用中的數(shù)據(jù)览效。
換句話說,使用?Hibernate?的開發(fā)者應(yīng)該總是關(guān)注對象的狀態(tài)(state)虫几,不必考慮?SQL?語句的執(zhí)行锤灿。這部分細(xì)節(jié)已經(jīng)由?Hibernate?掌管妥當(dāng),只有開發(fā)者在進(jìn)行系統(tǒng)性能調(diào)優(yōu)的時候才需要進(jìn)行了解辆脸。而MyBatis在這一塊沒有文檔說明但校,用戶需要對對象自己進(jìn)行詳細(xì)的管理。
第五方面:緩存機(jī)制
Hibernate一級緩存是Session緩存啡氢,利用好一級緩存就需要對Session的生命周期進(jìn)行管理好状囱。建議在一個Action操作中使用一個Session。一級緩存需要對Session進(jìn)行嚴(yán)格管理倘是。
Hibernate二級緩存是SessionFactory級的緩存亭枷。?SessionFactory的緩存分為內(nèi)置緩存和外置緩存。內(nèi)置緩存中存放的是SessionFactory對象的一些集合屬性包含的數(shù)據(jù)(映射元素?fù)?jù)及預(yù)定SQL語句等),對于應(yīng)用程序來說,它是只讀的搀崭。外置緩存中存放的是數(shù)據(jù)庫數(shù)據(jù)的副本,其作用和一級緩存類似.二級緩存除了以內(nèi)存作為存儲介質(zhì)外,還可以選用硬盤等外部存儲設(shè)備叨粘。二級緩存稱為進(jìn)程級緩存或SessionFactory級緩存,它可以被所有session共享,它的生命周期伴隨著SessionFactory的生命周期存在和消亡升敲。
MyBatis?包含一個非常強(qiáng)大的查詢緩存特性,它可以非常方便地配置和定制答倡。MyBatis 3?中的緩存實現(xiàn)的很多改進(jìn)都已經(jīng)實現(xiàn)了,使得它更加強(qiáng)大而且易于配置。
默認(rèn)情況下是沒有開啟緩存的,除了局部的?session?緩存,可以增強(qiáng)變現(xiàn)而且處理循環(huán) 依賴也是必須的驴党。要開啟二級緩存,你需要在你的?SQL?映射文件中添加一行:?
字面上看就是這樣瘪撇。這個簡單語句的效果如下:
映射語句文件中的所有?select?語句將會被緩存。
映射語句文件中的所有?insert,update?和?delete?語句會刷新緩存鼻弧。
緩存會使用?Least Recently Used(LRU,最近最少使用的)算法來收回设江。
根據(jù)時間表(比如?no Flush Interval,沒有刷新間隔),?緩存不會以任何時間順序 來刷新。
緩存會存儲列表集合或?qū)ο?無論查詢方法返回什么)的?1024?個引用攘轩。
緩存會被視為是?read/write(可讀/可寫)的緩存,意味著對象檢索不是共享的,而 且可以安全地被調(diào)用者修改,而不干擾其他調(diào)用者或線程所做的潛在修改叉存。
所有的這些屬性都可以通過緩存元素的屬性來修改。
比如:
這個更高級的配置創(chuàng)建了一個?FIFO?緩存,并每隔?60?秒刷新,存數(shù)結(jié)果對象或列表的?512?個引用,而且返回的對象被認(rèn)為是只讀的,因此在不同線程中的調(diào)用者之間修改它們會 導(dǎo)致沖突度帮〖吣螅可用的收回策略有,?默認(rèn)的是?LRU:
LRU?–?最近最少使用的:移除最長時間不被使用的對象颓影。
FIFO?–?先進(jìn)先出:按對象進(jìn)入緩存的順序來移除它們荠藤。
SOFT?–?軟引用:移除基于垃圾回收器狀態(tài)和軟引用規(guī)則的對象。
WEAK?–?弱引用:更積極地移除基于垃圾收集器狀態(tài)和弱引用規(guī)則的對象啼县。
flushInterval(刷新間隔)可以被設(shè)置為任意的正整數(shù),而且它們代表一個合理的毫秒 形式的時間段率翅。默認(rèn)情況是不設(shè)置,也就是沒有刷新間隔,緩存僅僅調(diào)用語句時刷新练俐。
size(引用數(shù)目)可以被設(shè)置為任意正整數(shù),要記住你緩存的對象數(shù)目和你運行環(huán)境的 可用內(nèi)存資源數(shù)目。默認(rèn)值是1024冕臭。
readOnly(只讀)屬性可以被設(shè)置為?true?或?false腺晾。只讀的緩存會給所有調(diào)用者返回緩 存對象的相同實例。因此這些對象不能被修改辜贵。這提供了很重要的性能優(yōu)勢悯蝉。可讀寫的緩存 會返回緩存對象的拷貝(通過序列化)?托慨。這會慢一些,但是安全,因此默認(rèn)是?false鼻由。
相同點:Hibernate和Mybatis的二級緩存除了采用系統(tǒng)默認(rèn)的緩存機(jī)制外,都可以通過實現(xiàn)你自己的緩存或為其他第三方緩存方案厚棵,創(chuàng)建適配器來完全覆蓋緩存行為蕉世。
不同點:Hibernate的二級緩存配置在SessionFactory生成的配置文件中進(jìn)行詳細(xì)配置,然后再在具體的表-對象映射中配置是那種緩存婆硬。
MyBatis的二級緩存配置都是在每個具體的表-對象映射中進(jìn)行詳細(xì)配置讨彼,這樣針對不同的表可以自定義不同的緩存機(jī)制。并且Mybatis可以在命名空間中共享相同的緩存配置和實例柿祈,通過Cache-ref來實現(xiàn)。
兩者比較:因為Hibernate對查詢對象有著良好的管理機(jī)制,用戶無需關(guān)心SQL躏嚎。所以在使用二級緩存時如果出現(xiàn)臟數(shù)據(jù)蜜自,系統(tǒng)會報出錯誤并提示。
而MyBatis在這一方面卢佣,使用二級緩存時需要特別小心重荠。如果不能完全確定數(shù)據(jù)更新操作的波及范圍,避免Cache的盲目使用虚茶。否則戈鲁,臟數(shù)據(jù)的出現(xiàn)會給系統(tǒng)的正常運行帶來很大的隱患。
第六方面:總結(jié)
對于總結(jié)嘹叫,大家可以到各大java論壇去看一看
相同點:Hibernate與MyBatis都可以是通過SessionFactoryBuider由XML配置文件生成SessionFactory婆殿,然后由SessionFactory?生成Session,最后由Session來開啟執(zhí)行事務(wù)和SQL語句罩扇。其中SessionFactoryBuider婆芦,SessionFactory,Session的生命周期都是差不多的喂饥。
Hibernate和MyBatis都支持JDBC和JTA事務(wù)處理消约。
MyBatis可以進(jìn)行更為細(xì)致的SQL優(yōu)化,可以減少查詢字段员帮。
MyBatis容易掌握或粮,而Hibernate門檻較高。
Hibernate的DAO層開發(fā)比MyBatis簡單捞高,Mybatis需要維護(hù)SQL和結(jié)果映射氯材。
Hibernate對對象的維護(hù)和緩存要比MyBatis好,對增刪改查的對象的維護(hù)要方便棠枉。
Hibernate數(shù)據(jù)庫移植性很好浓体,MyBatis的數(shù)據(jù)庫移植性不好,不同的數(shù)據(jù)庫需要寫不同SQL辈讶。
Hibernate有更好的二級緩存機(jī)制命浴,可以使用第三方緩存。MyBatis本身提供的緩存機(jī)制不佳贱除。
Hibernate功能強(qiáng)大生闲,數(shù)據(jù)庫無關(guān)性好,O/R映射能力強(qiáng)月幌,如果你對Hibernate相當(dāng)精通碍讯,而且對Hibernate進(jìn)行了適當(dāng)?shù)姆庋b,那么你的項目整個持久層代碼會相當(dāng)簡單扯躺,需要寫的代碼很少捉兴,開發(fā)速度很快蝎困,非常爽。
Hibernate的缺點就是學(xué)習(xí)門檻不低倍啥,要精通門檻更高禾乘,而且怎么設(shè)計O/R映射,在性能和對象模型之間如何權(quán)衡取得平衡虽缕,以及怎樣用好Hibernate方面需要你的經(jīng)驗和能力都很強(qiáng)才行始藕。
iBATIS入門簡單,即學(xué)即用氮趋,提供了數(shù)據(jù)庫查詢的自動對象綁定功能伍派,而且延續(xù)了很好的SQL使用經(jīng)驗,對于沒有那么高的對象模型要求的項目來說剩胁,相當(dāng)完美诉植。
iBATIS的缺點就是框架還是比較簡陋,功能尚有缺失摧冀,雖然簡化了數(shù)據(jù)綁定代碼倍踪,但是整個底層數(shù)據(jù)庫查詢實際還是要自己寫的,工作量也比較大索昂,而且不太容易適應(yīng)快速數(shù)據(jù)庫修改建车。