java面试题(开发框架)
?
博客分類:
- java基礎(chǔ)
?? java基礎(chǔ)面試題目,以備不時之需
??? 俗話說 細節(jié)決定成敗。
???? 就算很簡單,很小的問題,我們還是要注意一下的。
???? 往往那些’老奸巨滑‘的老一輩面試官,他們都是很強大的,給你上這么一道題。讓你措手不及怎么辦?? 。
??
?????
題目:
第一,談?wù)刦inal, finally, finalize的區(qū)別。
??? final 用于聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。
finally是異常處理語句結(jié)構(gòu)的一部分,表示總是執(zhí)行。
finalize是Object類的一個方法,在垃圾收集器執(zhí)行的時候會調(diào)用被回收對象的此方法,可以覆蓋此方法提供垃圾收集時的其他資源回收,例如關(guān)閉文件等。
第二,Anonymous Inner Class (匿名內(nèi)部類) 是否可以extends(繼承)其它類,是否可以implements(實現(xiàn))interface(接口)?
??? 可以繼承其他類或完成其他接口,在swing編程中常用此方式。
第三,Static Nested Class 和 Inner Class的不同,說得越多越好(面試題有的很籠統(tǒng))。
???? Static Nested Class是被聲明為靜態(tài)(static)的內(nèi)部類,它可以不依賴于外部類實例被實例化。而通常的內(nèi)部類需要在外部類實例化后才能實例化。
第四,&和&&的區(qū)別。
?? &是位運算符,表示按位與運算,&&是邏輯運算符,表示邏輯與(and).
第五,HashMap和Hashtable的區(qū)別。
??? HashMap是Hashtable的輕量級實現(xiàn)(非線程安全的實現(xiàn)),他們都完成了Map接口,主要區(qū)別在于HashMap允許空(null)鍵值(key),由于非線程安全,效率上可能高于Hashtable.
第六,Collection 和 Collections的區(qū)別。
Collection是集合類的上級接口,繼承與他的接口主要有Set 和List.
Collections是針對集合類的一個幫助類,他提供一系列靜態(tài)方法實現(xiàn)對各種集合的搜索、排序、線程安全化等操作。
第七,什么時候用assert。 1.4新增關(guān)鍵字(語法),用于測試boolean表達式狀態(tài),可用于調(diào)試程序。
使用方法 assert <boolean表達式>,表示如果表達式為真(true),則下面的語句執(zhí)行,否則拋出AssertionError。
另外的使用方式assert < boolean表達式>:<other表達式>,表示如果表達式為真,后面的表達式忽略,否則后面表達式的值用于AssertionError的構(gòu)建參數(shù)。
注意編譯時要增加-source 1.4 參數(shù),否則報錯。]運行時要增加 –ea參數(shù),否則assert行被忽略
第八,GC是什么? 為什么要有GC?
GC是垃圾收集的意思(Gabage Collection),內(nèi)存處理是編程人員容易出現(xiàn)問題的地方,忘記或者錯誤的內(nèi)存回收會導(dǎo)致程序或系統(tǒng)的不穩(wěn)定甚至崩潰,Java提供的GC功能可以 自動監(jiān)測對象是否超過作用域從而達到自動回收內(nèi)存的目的,Java語言沒有提供釋放已分配內(nèi)存的顯示操作方法。
第九,String s = new String("xyz");創(chuàng)建了幾個String Object?
? 兩個
第十,Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
? Math.round(11.5)==12
? Math.round(-11.5)==-11
round方法返回與參數(shù)最接近的長整數(shù),參數(shù)加1/2后求其floor.
第十一,short s1 = 1; s1 = s1 + 1;有什么錯? short s1 = 1; s1 += 1;有什么錯?
??? short s1 = 1; s1 = s1 + 1; (s1+1運算結(jié)果是int型,需要強制轉(zhuǎn)換類型)
short s1 = 1; s1 += 1;(可以正確編譯)
第十二,sleep() 和 wait() 有什么區(qū)別?
??? sleep是線程類(Thread)的方法,導(dǎo)致此線程暫停執(zhí)行指定時間,給執(zhí)行機會給其他線程,但是監(jiān)控狀態(tài)依然保持,到時后會自動恢復(fù)。調(diào)用sleep不會釋放對象鎖。
wait是Object類的方法,對此對象調(diào)用wait方法導(dǎo)致本線程放棄對象鎖,進入等待此對象的等待鎖定池,只有針對此對象發(fā)出notify方法(或notifyAll)后本線程才進入對象鎖定池準備獲得對象鎖進入運行狀態(tài)。
第十三,Java有沒有g(shù)oto?
?? 沒有 很十三的問題,如果哪個面試的問到這個問題,我勸你還是別進這家公司。(完)(job.sohu.com)
第十四,數(shù)組有沒有l(wèi)ength()這個方法? String有沒有l(wèi)ength()這個方法?
?? 數(shù)組沒有l(wèi)ength()這個方法,有l(wèi)ength的屬性。String有有l(wèi)ength()這個方法。
第十五,Overload和Override的區(qū)別。
??? Overloaded的方法是否可以改變返回值的類型?方法的重寫Overriding和重載Overloading是Java多態(tài)性的不同表現(xiàn)。重寫 Overriding是父類與子類之間多態(tài)性的一種表現(xiàn),重載Overloading是一個類中多態(tài)性的一種表現(xiàn)。如果在子類中定義某方法與其父類有相同 的名稱和參數(shù),我們說該方法被重寫 (Overriding)。子類的對象使用這個方法時,將調(diào)用子類中的定義,對它而言,父類中的定義如同被“屏蔽”了。如果在一個類中定義了多個同名的方 法,它們或有不同的參數(shù)個數(shù)或有不同的參數(shù)類型,則稱為方法的重載(Overloading)。Overloaded的方法是可以改變返回值的類型。
第十六,Set里的元素是不能重復(fù)的,那么用什么方法來區(qū)分重復(fù)與否呢? 是用==還是equals()? 它們有何區(qū)別?Set里的元素是不能重復(fù)的,那么用iterator()方法來區(qū)分重復(fù)與否。
???? equals()是判讀兩個Set是否相等。equals()和==方法決定引用值是否指向同一對象equals()在類中被覆蓋,==的是當兩個分離的對象的內(nèi)容和類型相配的話,返回真值。
第十七,給我一個你最常見到的runtime exception。ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotRedoException, CannotUndoException, ClassCastException, CMMException, ConcurrentModificationException, DOMException, EmptyStackException, IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException, IllegalStateException, ImagingOpException, IndexOutOfBoundsException, MissingResourceException, NegativeArraySizeException, NoSuchElementException, NullPointerException, ProfileDataException, ProviderException, RasterFormatException, SecurityException, SystemException, UndeclaredThrowableException, UnmodifiableSetException, UnsupportedOperationException
第十八,error和exception有什么區(qū)別?
??? error 表示恢復(fù)不是不可能但很困難的情況下的一種嚴重問題。比如說內(nèi)存溢出。不可能指望程序能處理這樣的情況。exception 表示一種設(shè)計或?qū)崿F(xiàn)問題。也就是說,它表示如果程序運行正常,從不會發(fā)生的情況。
第十九,List, Set, Map是否繼承自Collection接口?
?? List,Set是
?? Map不是
第二十,abstract class和interface有什么區(qū)別?(能說多少說多少)
聲明方法的存在而不去實現(xiàn)它的類被叫做抽象類(abstract class),它用于要創(chuàng)建一個體現(xiàn)某些基本行為的類,并為該類聲明方法,但不能在該類中實現(xiàn)該類的情況。不能創(chuàng)建abstract 類的實例。然而可以創(chuàng)建一個變量,其類型是一個抽象類,并讓它指向具體子類的一個實例。不能有抽象構(gòu)造函數(shù)或抽象靜態(tài)方法。Abstract 類的子類為它們父類中的所有抽象方法提供實現(xiàn),否則它們也是抽象類為。取而代之,在子類中實現(xiàn)該方法。知道其行為的其它類可以在類中實現(xiàn)這些方法。接口 (interface)是抽象類的變體。在接口中,所有方法都是抽象的。多繼承性可通過實現(xiàn)這樣的接口而獲得。接口中的所有方法都是抽象的,沒有一個有程 序體。接口只可以定義static final成員變量。接口的實現(xiàn)與子類相似,除了該實現(xiàn)類不能從接口定義中繼承行為。當類實現(xiàn)特殊接口時,它定義(即將程序體給予)所有這種接口的方法。 然后,它可以在實現(xiàn)了該接口的類的任何對象上調(diào)用接口的方法。由于有抽象類,它允許使用接口名作為引用變量的類型。通常的動態(tài)聯(lián)編將生效。引用可以轉(zhuǎn)換到 接口類型或從接口類型轉(zhuǎn)換,instanceof 運算符可以用來決定某對象的類是否實現(xiàn)了接口。
第二十一,abstract的method是否可同時是static,是否可同時是native,是否可同時是synchronized?
?? 都不能
第二十二,接口是否可繼承接口?
? 抽象類是否可實現(xiàn)(implements)接口? 抽象類是否可繼承實體類(concrete class)?接口可以繼承接口。抽象類可以實現(xiàn)(implements)接口,抽象類是否可繼承實體類,但前提是實體類必須有明確的構(gòu)造函數(shù)。
第二十三,啟動一個線程是用run()還是start()?
?? 啟動一個線程是調(diào)用start()方法,使線程所代表的虛擬處理機處于可運行狀態(tài),這意味著它可以由JVM調(diào)度并執(zhí)行。這并不意味著線程就會立即運行。run()方法可以產(chǎn)生必須退出的標志來停止一個線程。
第二十四,構(gòu)造器Constructor是否可被override?
?? 構(gòu)造器Constructor不能被繼承,因此不能重寫Overriding,但可以被重載Overloading。
第二十五,是否可以繼承String類?
? String類是final類故不可以繼承。
第二十六,當一個線程進入一個對象的一個synchronized方法后,其它線程是否可進入此對象的其它方法?不能,一個對象的一個synchronized方法只能由一個線程訪問。
第二十七,try {}里有一個return語句,那么緊跟在這個try后的finally {}里的code會不會被執(zhí)行,什么時候被執(zhí)行,在return前還是后?會執(zhí)行,在return前執(zhí)行。
第二十八,編程題: 用最有效率的方法算出2乘以8等於幾?有C背景的程序員特別喜歡問這種問題。
2 << 3
第二十九,兩個對象值相同(x.equals(y) == true),但卻可有不同的hash code,這句話對不對?不對,有相同的hash code。
第三十,當一個對象被當作參數(shù)傳遞到一個方法后,此方法可改變這個對象的屬性,并可返回變化后的結(jié)果,那么這里到底是值傳遞還是引用傳遞? 是值傳遞。Java 編程語言只由值傳遞參數(shù)。當一個對象實例作為一個參數(shù)被傳遞到方法中時,參數(shù)的值就是對該對象的引用。對象的內(nèi)容可以在被調(diào)用的方法中改變,但對象的引用 是永遠不會改變的。
第三十一,swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?switch(expr1) 中,expr1是一個整數(shù)表達式。因此傳遞給 switch 和 case 語句的參數(shù)應(yīng)該是 int、 short、 char 或者 byte。long,string 都不能作用于swtich。
第三十二,編程題: 寫一個Singleton出來。??
一,同步方法
Java代碼 ?
二,放棄同步,使用靜態(tài)變量:
Java代碼 ?
三,比較新穎的寫法:
Java代碼 ?
總結(jié)單例:
?Singleton模式主要作用是保證在Java應(yīng)用程序中,一個類Class只有一個實例存在。
一般Singleton模式通常有幾種種形式:
第一種形式: 定義一個類,它的構(gòu)造函數(shù)為private的,它有一個static的private的該類變量,在類初始化時實例話,通過一個public的getInstance方法獲取對它的引用,繼而調(diào)用其中的方法。
public class Singleton { private Singleton(){} //在自己內(nèi)部定義自己一個實例,是不是很奇怪? //注意這是private 只供內(nèi)部調(diào)用 private static Singleton instance = new Singleton(); //這里提供了一個供外部訪問本class的靜態(tài)方法,可以直接訪問 public static Singleton getInstance() { return instance; } }
第二種形式: public class Singleton { private static Singleton instance = null; public static synchronized Singleton getInstance() { //這個方法比上面有所改進,不用每次都進行生成對象,只是第一次 //使用時生成實例,提高了效率! if (instance==null) instance=new Singleton();return instance; } }
其他形式:定義一個類,它的構(gòu)造函數(shù)為private的,所有方法為static的。聲明方法的存在而不去實現(xiàn)它的類被叫做抽象類 (abstract class),它用于要創(chuàng)建一個體現(xiàn)某些基本行為的類,并為該類聲明方法,但不能在該類中實現(xiàn)該類的情況。不能創(chuàng)建abstract 類的實例。
然而可以創(chuàng)建一個變量,其類型是一個抽象類,并讓它指向具體子類的一個實例。
不能有抽象構(gòu)造函數(shù)或抽象靜態(tài)方法。Abstract 類的子類為它們父類中的所有抽象方法提供實現(xiàn),否則它們也是抽象類為。取而代之,在子類中實現(xiàn)該方法。知道其行為的其它類可以在類中實現(xiàn)這些方法。接口 (interface)是抽象類的變體。在接口中,所有方法都是抽象的。多繼承性可通過實現(xiàn)這樣的接口而獲得。接口中的所有方法都是抽象的,沒有一個有程 序體。接口只可以定義static final成員變量。接口的實現(xiàn)與子類相似,除了該實現(xiàn)類不能從接口定義中繼承行為。當類實現(xiàn)特殊接口時,它定義(即將程序體給予)所有這種接口的方法。 然后,它可以在實現(xiàn)了該接口的類的任何對象上調(diào)用接口的方法。由于有抽象類,它允許使用接口名作為引用變量的類型。通常的動態(tài)聯(lián)編將生效。引用可以轉(zhuǎn)換到 接口類型或從接口類型轉(zhuǎn)換,instanceof 運算符可以用來決定某對象的類是否實現(xiàn)了接口。
Struts,Hibernate,Spring經(jīng)典面試題收藏(轉(zhuǎn))
http://dengzhangtao.iteye.com/blog/827471
Struts,Hibernate,Spring經(jīng)典面試題收藏?? ?以備不時只需。
關(guān)鍵字: struts, hibernate, spring?
先簡單的提一下, 要開發(fā)出好的,高質(zhì)量的j2ee系統(tǒng), 評價系統(tǒng)的高低水平 ,解耦性 至關(guān)重要! 而在開發(fā)中主要分成三個層次,表現(xiàn)層, 服務(wù)層, 持久層。從這三層次去解藕。
?
spring的作用就是把服務(wù)從表現(xiàn)層中,抽取出來,
hibernate把持久層抽取出來。?
剩下的表現(xiàn)層交給 struts控制
?
但是面對那么多的框架,為什么在持久層中我們選擇hibernate ,在服務(wù)層我們用spring,下面都有說。
Hibernate工作原理??
原理:?
1.讀取并解析配置文件?
2.讀取并解析映射信息,創(chuàng)建SessionFactory?
3.打開Sesssion?
4.創(chuàng)建事務(wù)Transation?
5.持久化操作?
6.提交事務(wù)?
7.關(guān)閉Session?
8.關(guān)閉SesstionFactory?
為什么要用:?
1. 對JDBC訪問數(shù)據(jù)庫的代碼做了封裝,大大簡化了數(shù)據(jù)訪問層繁瑣的重復(fù)性代碼。?
2. Hibernate是一個基于JDBC的主流持久化框架,是一個優(yōu)秀的ORM實現(xiàn)。他很大程度的簡化DAO層的編碼工作?
3. hibernate使用Java反射機制,而不是字節(jié)碼增強程序來實現(xiàn)透明性。?
4. hibernate的性能非常好,因為它是個輕量級框架。映射的靈活性很出色。它支持各種關(guān)系數(shù)據(jù)庫,從一對一到多對多的各種復(fù)雜關(guān)系。?
2. Hibernate是如何延遲加載??
1. Hibernate2延遲加載實現(xiàn):a)實體對象 b)集合(Collection)?
2. Hibernate3 提供了屬性的延遲加載功能?
當Hibernate在查詢數(shù)據(jù)的時候,數(shù)據(jù)并沒有存在與內(nèi)存中,當程序真正對數(shù)據(jù)的操作時,對象才存在與內(nèi)存中,就實現(xiàn)了延遲加載,他節(jié)省了服務(wù)器的內(nèi)存開銷,從而提高了服務(wù)器的性能。?
3.Hibernate中怎樣實現(xiàn)類之間的關(guān)系?(如:一對多、多對多的關(guān)系)?
類與類之間的關(guān)系主要體現(xiàn)在表與表之間的關(guān)系進行操作,它們都市對對象進行操作,我們程序中把所有的表與類都映射在一起,它們通過配置文件中的many-to-one、one-to-many、many-to-many、?
4. 說下Hibernate的緩存機制?
1. 內(nèi)部緩存存在Hibernate中又叫一級緩存,屬于應(yīng)用事物級緩存?
2. 二級緩存:?
a) 應(yīng)用及緩存?
b) 分布式緩存?
條件:數(shù)據(jù)不會被第三方修改、數(shù)據(jù)大小在可接受范圍、數(shù)據(jù)更新頻率低、同一數(shù)據(jù)被系統(tǒng)頻繁使用、非 關(guān)鍵數(shù)據(jù)?
c) 第三方緩存的實現(xiàn)?
5. Hibernate的查詢方式?
Sql、Criteria,object comptosition?
Hql:?
1、 屬性查詢?
2、 參數(shù)查詢、命名參數(shù)查詢?
3、 關(guān)聯(lián)查詢?
4、 分頁查詢?
5、 統(tǒng)計函數(shù)?
6. 如何優(yōu)化Hibernate??
1.使用雙向一對多關(guān)聯(lián),不使用單向一對多?
2.靈活使用單向一對多關(guān)聯(lián)?
3.不用一對一,用多對一取代?
4.配置對象緩存,不使用集合緩存?
5.一對多集合使用Bag,多對多集合使用Set?
6. 繼承類使用顯式多態(tài)?
7. 表字段要少,表關(guān)聯(lián)不要怕多,有二級緩存撐腰?
7. Struts工作機制?為什么要使用Struts??
工作機制:?
Struts的工作流程:?
在web應(yīng)用啟動時就會加載初始化ActionServlet,ActionServlet從?
struts-config.xml文件中讀取配置信息,把它們存放到各種配置對象?
當ActionServlet接收到一個客戶請求時,將執(zhí)行如下流程.?
-(1)檢索和用戶請求匹配的ActionMapping實例,如果不存在,就返回請求路徑無效信息;?
-(2)如果ActionForm實例不存在,就創(chuàng)建一個ActionForm對象,把客戶提交的表單數(shù)據(jù)保存到ActionForm對象中;?
-(3)根據(jù)配置信息決定是否需要表單驗證.如果需要驗證,就調(diào)用ActionForm的validate()方法;?
-(4)如果ActionForm的validate()方法返回null或返回一個不包含ActionMessage的ActuibErrors對象, 就表示表單驗證成功;?
-(5)ActionServlet根據(jù)ActionMapping所包含的映射信息決定將請求轉(zhuǎn)發(fā)給哪個Action,如果相應(yīng)的 Action實例不存在,就先創(chuàng)建這個實例,然后調(diào)用Action的execute()方法;?
-(6)Action的execute()方法返回一個ActionForward對象,ActionServlet在把客戶請求轉(zhuǎn)發(fā)給 ActionForward對象指向的JSP組件;?
-(7)ActionForward對象指向JSP組件生成動態(tài)網(wǎng)頁,返回給客戶;?
為什么要用:?
JSP、Servlet、JavaBean技術(shù)的出現(xiàn)給我們構(gòu)建強大的企業(yè)應(yīng)用系統(tǒng)提供了可能。但用這些技術(shù)構(gòu)建的系統(tǒng)非常的繁亂,所以在此之上,我們需要一個規(guī)則、一個把這些技術(shù)組織起來的規(guī)則,這就是框架,Struts便應(yīng)運而生。?
基于Struts開發(fā)的應(yīng)用由3類組件構(gòu)成:控制器組件、模型組件、視圖組件?
8. Struts的validate框架是如何驗證的??
在struts配置文件中配置具體的錯誤提示,再在FormBean中的validate()方法具體調(diào)用。?
9.?說下Struts的設(shè)計模式?
MVC 模式: web應(yīng)用程序啟動時就會加載并初始化ActionServler。用戶提交表單時,一個配置好的ActionForm對象被創(chuàng)建,并被填入表單相應(yīng)的數(shù) 據(jù),ActionServler根據(jù)Struts-config.xml文件配置好的設(shè)置決定是否需要表單驗證,如果需要就調(diào)用ActionForm的 Validate()驗證后選擇將請求發(fā)送到哪個Action,如果Action不存在,ActionServlet會先創(chuàng)建這個對象,然后調(diào)用 Action的execute()方法。Execute()從ActionForm對象中獲取數(shù)據(jù),完成業(yè)務(wù)邏輯,返回一個ActionForward對 象,ActionServlet再把客戶請求轉(zhuǎn)發(fā)給ActionForward對象指定的jsp組件,ActionForward對象指定的jsp生成動 態(tài)的網(wǎng)頁,返回給客戶。?
10. spring工作機制及為什么要用??
1.spring mvc請所有的請求都提交給DispatcherServlet,它會委托應(yīng)用系統(tǒng)的其他模塊負責(zé)負責(zé)對請求進行真正的處理工作。?
2.DispatcherServlet查詢一個或多個HandlerMapping,找到處理請求的Controller.?
3.DispatcherServlet請請求提交到目標Controller?
4.Controller進行業(yè)務(wù)邏輯處理后,會返回一個ModelAndView?
5.Dispathcher查詢一個或多個ViewResolver視圖解析器,找到ModelAndView對象指定的視圖對象?
6.視圖對象負責(zé)渲染返回給客戶端。?
為什么用:?
{AOP 讓開發(fā)人員可以創(chuàng)建非行為性的關(guān)注點,稱為橫切關(guān)注點,并將它們插入到應(yīng)用程序代碼中。使用 AOP 后,公共服務(wù) (比如日志、持久性、事務(wù)等)就可以分解成方面并應(yīng)用到域?qū)ο笊?#xff0c;同時不會增加域?qū)ο蟮膶ο竽P偷膹?fù)雜性。?
IOC 允許創(chuàng)建一個可以構(gòu)造對象的應(yīng)用環(huán)境,然后向這些對象傳遞它們的協(xié)作對象。正如單詞 倒置 所表明的,IOC 就像反 過來的 JNDI。沒有使用一堆抽象工廠、服務(wù)定位器、單元素(singleton)和直接構(gòu)造(straight construction),每一個對象都是用其協(xié)作對象構(gòu)造的。因此是由容器管理協(xié)作對象(collaborator)。?
Spring即使一個AOP框架,也是一IOC容器。 Spring 最好的地方是它有助于您替換對象。有了 Spring,只要用 JavaBean 屬性和配置文件加入依賴性(協(xié)作對象)。然后可以很容易地在需要時替換具有類似接口的協(xié)作對象。}?
Spring 框架是一個分層架構(gòu),由 7 個定義良好的模塊組成。Spring 模塊構(gòu)建在核心容器之上,核心容器定義了創(chuàng)建、配置和管理 bean 的方式,如圖 1 所示。?
組成 Spring 框架的每個模塊(或組件)都可以單獨存在,或者與其他一個或多個模塊聯(lián)合實現(xiàn)。每個模塊的功能如下:?
☆ 核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要組件是 BeanFactory,它是工廠模式的實現(xiàn)。BeanFactory 使用控制反轉(zhuǎn) (IOC)模式將應(yīng)用程序的配置和依賴性規(guī)范與實際的應(yīng)用程序代碼分開。?
☆ Spring 上下文:Spring 上下文是一個配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企業(yè)服務(wù),例如 JNDI、EJB、電子郵件、國際化、校驗和調(diào)度功能。?
☆ Spring AOP:通過配置管理特性,Spring AOP 模塊直接將面向方面的編程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何對象支持 AOP。Spring AOP 模塊為基于 Spring 的應(yīng)用程序中的對象提供了事務(wù)管理服務(wù)。通過使用 Spring AOP,不用依賴 EJB 組件,就可以將聲明性事務(wù)管理集成到應(yīng)用程序中。?
☆ Spring DAO:JDBC DAO 抽象層提供了有意義的異常層次結(jié)構(gòu),可用該結(jié)構(gòu)來管理異常處理和不同數(shù)據(jù)庫供應(yīng)商拋出的錯誤消息。異常層次結(jié)構(gòu)簡化了錯誤處理,并且極大地降低了需要編寫 的異常代碼數(shù)量(例如打開和關(guān)閉連接)。Spring DAO 的面向 JDBC 的異常遵從通用的 DAO 異常層次結(jié)構(gòu)。?
☆ Spring ORM:Spring 框架插入了若干個 ORM 框架,從而提供了 ORM 的對象關(guān)系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有這些都遵從 Spring 的通用事務(wù)和 DAO 異常層次結(jié)構(gòu)。?
☆ Spring Web 模塊:Web 上下文模塊建立在應(yīng)用程序上下文模塊之上,為基于 Web 的應(yīng)用程序提供了上下文。所以,Spring 框架支持與 Jakarta Struts 的集成。Web 模塊還簡化了處理多部分請求以及將請求參數(shù)綁定到域?qū)ο蟮墓ぷ鳌?
☆ Spring MVC 框架:MVC 框架是一個全功能的構(gòu)建 Web 應(yīng)用程序的 MVC 實現(xiàn)。通過策略接口,MVC 框架變成為高度可配置的,MVC 容納了大量視圖技術(shù),其中包括 JSP、Velocity、Tiles、iText 和 POI。?
Spring 框架的功能可以用在任何 J2EE 服務(wù)器中,大多數(shù)功能也適用于不受管理的環(huán)境。Spring 的核心要點是:支持不綁定到特定 J2EE 服務(wù)的可重用業(yè)務(wù)和數(shù)據(jù)訪問對象。毫無疑問,這樣的對象可以在不同 J2EE 環(huán)境 (Web 或 EJB)、獨立應(yīng)用程序、測試環(huán)境之間重用。?
IOC 和 AOP?
控制反轉(zhuǎn)模式(也稱作依賴性介入)的基本概念是:不創(chuàng)建對象,但是描述創(chuàng)建它們的方式。在代碼中不直接與對象和服務(wù)連接,但在配置文件中描述哪一個組件需要哪一項服務(wù)。容器(在 Spring 框架中是 IOC 容器) 負責(zé)將這些聯(lián)系在一起。?
在典型的 IOC 場景中,容器創(chuàng)建了所有對象,并設(shè)置必要的屬性將它們連接在一起,決定什么時間調(diào)用方法。下表列出了 IOC 的一個實現(xiàn)模式。?
Spring 框架的 IOC 容器采用類型 2 和類型3 實現(xiàn)。?
面向方面的編程?
面向方面的編程,即 AOP,是一種編程技術(shù),它允許程序員對橫切關(guān)注點或橫切典型的職責(zé)分界線的行為(例如日志和事務(wù)管理)進行模塊化。AOP 的核心構(gòu)造是方面,它將那些影響多個類的行為封裝到可重用的模塊中。?
AOP 和 IOC 是補充性的技術(shù),它們都運用模塊化方式解決企業(yè)應(yīng)用程序開發(fā)中的復(fù)雜問題。在典型的面向?qū)ο箝_發(fā)方式中,可能要將日志記錄語句放在所有方法和 Java 類中才能實現(xiàn)日志功能。在 AOP 方式中,可以反過來將日志服務(wù)模塊化,并以聲明的方式將它們應(yīng)用到需要日志的組件上。當然,優(yōu)勢就是 Java 類不需要知道日志服務(wù)的存在,也不需要考慮相關(guān)的代碼。所以,用 Spring AOP 編寫的應(yīng)用程序代碼是松散耦合的。?
AOP 的功能完全集成到了 Spring 事務(wù)管理、日志和其他各種特性的上下文中。?
IOC 容器?
Spring 設(shè)計的核心是 org.springframework.beans 包,它的設(shè)計目標是與 JavaBean 組件一起使用。這個包通常不是由用戶直接使用,而是由服務(wù)器將其用作其他多數(shù)功能的底層中介。下一個最高級抽象是 BeanFactory 接口,它是工廠設(shè)計模式的實現(xiàn),允許通過名稱創(chuàng)建和檢索對象。BeanFactory 也可以管理對象之間的關(guān)系。?
BeanFactory 支持兩個對象模型。?
□ 單態(tài) 模型提供了具有特定名稱的對象的共享實例,可以在查詢時對其進行檢索。Singleton 是默認的也是最常用的對象模型。對于無狀態(tài)服務(wù)對象很理想。?
□ 原型 模型確保每次檢索都會創(chuàng)建單獨的對象。在每個用戶都需要自己的對象時,原型模型最適合。?
bean 工廠的概念是 Spring 作為 IOC 容器的基礎(chǔ)。IOC 將處理事情的責(zé)任從應(yīng)用程序代碼轉(zhuǎn)移到框架。正如我將在下一個示例中演示的那樣,Spring 框架使用 JavaBean 屬性和配置數(shù)據(jù)來指出必須設(shè)置的依賴關(guān)系。?
BeanFactory 接口?
因 為 org.springframework.beans.factory.BeanFactory 是一個簡單接口,所以可以針對各種底層存儲方法實現(xiàn)。最常用的 BeanFactory 定義是 XmlBeanFactory,它根據(jù) XML 文件中的定義裝入 bean,如清單 1 所示。?
清單 1. XmlBeanFactory?
BeanFactory factory = new XMLBeanFactory(new FileInputSteam("mybean.xml"));?
在 XML 文件中定義的 Bean 是被消極加載的,這意味在需要 bean 之前,bean 本身不會被初始化。要從 BeanFactory 檢索 bean,只需調(diào)用 getBean() 方法,傳入將要檢索的 bean 的名稱即可,如清單 2 所示。?
清單 2. getBean()?
MyBean mybean = (MyBean) factory.getBean("mybean");?
每個 bean 的定義都可以是 POJO (用類名和 JavaBean 初始化屬性定義) 或 FactoryBean。FactoryBean 接口為使用 Spring 框架構(gòu)建的應(yīng)用程序添加了一個間接的級別。?
IOC 示例?
理解控制反轉(zhuǎn)最簡單的方式就是看它的實際應(yīng)用。在對由三部分組成的 Spring 系列 的第 1 部分進行總結(jié)時,我使用了一個示例,演示了如何通過 Spring IOC 容器注入應(yīng)用程序的依賴關(guān)系(而不是將它們構(gòu)建進來)。?
我用開啟在線信用帳戶的用例作為起點。對于該實現(xiàn),開啟信用帳戶要求用戶與以下服務(wù)進行交互:?
☆ 信用級別評定服務(wù),查詢用戶的信用歷史信息。?
☆ 遠程信息鏈接服務(wù),插入客戶信息,將客戶信息與信用卡和銀行信息連接起來,以進行自動借記(如果需要的話)。?
☆ 電子郵件服務(wù),向用戶發(fā)送有關(guān)信用卡狀態(tài)的電子郵件。?
三個接口?
對于這個示例,我假設(shè)服務(wù)已經(jīng)存在,理想的情況是用松散耦合的方式把它們集成在一起。以下清單顯示了三個服務(wù)的應(yīng)用程序接口。?
清單 3. CreditRatingInterface?
public interface CreditRatingInterface {?
public boolean getUserCreditHistoryInformation(ICustomer iCustomer);?
}?
清單 3 所示的信用級別評定接口提供了信用歷史信息。它需要一個包含客戶信息的 Customer 對象。該接口的實現(xiàn)是由 CreditRating 類提供的。?
清單 4. CreditLinkingInterface?
public interface CreditLinkingInterface {?
public String getUrl();?
public void setUrl(String url);?
public void linkCreditBankAccount() throws Exception ;?
}?
信 用鏈接接口將信用歷史信息與銀行信息(如果需要的話)連接在一起,并插入用戶的信用卡信息。信用鏈接接口是一個遠程服務(wù),它的查詢是通過 getUrl() 方法進行的。URL 由 Spring 框架的 bean 配置機制設(shè)置,我稍后會討論它。該接口的實現(xiàn)是由 CreditLinking 類提供的。?
清單 5. EmailInterface?
public interface EmailInterface {?
public void sendEmail(ICustomer iCustomer);?
public String getFromEmail();?
public void setFromEmail(String fromEmail) ;?
public String getPassword();?
public void setPassword(String password) ;?
public String getSmtpHost() ;?
public void setSmtpHost(String smtpHost);?
public String getUserId() ;?
public void setUserId(String userId);?
spring 的優(yōu)點??
1.降低了組件之間的耦合性 ,實現(xiàn)了軟件各層之間的解耦?
2.可以使用容易提供的眾多服務(wù),如事務(wù)管理,消息服務(wù)等?
3.容器提供單例模式支持?
4.容器提供了AOP技術(shù),利用它很容易實現(xiàn)如權(quán)限攔截,運行期監(jiān)控等功能?
5.容器提供了眾多的輔助類,能加快應(yīng)用的開發(fā)?
6.spring對于主流的應(yīng)用框架提供了集成支持,如hibernate,JPA,Struts等?
7.spring屬于低侵入式設(shè)計,代碼的污染極低?
8.獨立于各種應(yīng)用服務(wù)器?
9.spring的DI機制降低了業(yè)務(wù)對象替換的復(fù)雜性?
10.Spring的高度開放性,并不強制應(yīng)用完全依賴于Spring,開發(fā)者可以自由選擇spring的部分或全部?
什么是DI機制??
依賴注入(Dependecy Injection)和控制反轉(zhuǎn)(Inversion of Control)是同一個概念,具體的講:當某個角色?
需要另外一個角色協(xié)助的時候,在傳統(tǒng)的程序設(shè)計過程中,通常由調(diào)用者來創(chuàng)建被調(diào)用者的實例。但在spring中?
創(chuàng)建被調(diào)用者的工作不再由調(diào)用者來完成,因此稱為控制反轉(zhuǎn)。創(chuàng)建被調(diào)用者的工作由spring來完成,然后注入調(diào)用者?
因此也稱為依賴注入。?
spring以動態(tài)靈活的方式來管理對象 , 注入的兩種方式,設(shè)置注入和構(gòu)造注入。?
設(shè)置注入的優(yōu)點:直觀,自然?
構(gòu)造注入的優(yōu)點:可以在構(gòu)造器中決定依賴關(guān)系的順序。?
什么是AOP??
面向切面編程(AOP)完善spring的依賴注入(DI),面向切面編程在spring中主要表現(xiàn)為兩個方面?
1.面向切面編程提供聲明式事務(wù)管理?
2.spring支持用戶自定義的切面?
面向切面編程(aop)是對面向?qū)ο缶幊?#xff08;oop)的補充,?
面向?qū)ο缶幊虒⒊绦蚍纸獬筛鱾€層次的對象,面向切面編程將程序運行過程分解成各個切面。?
AOP從程序運行角度考慮程序的結(jié)構(gòu),提取業(yè)務(wù)處理過程的切面,oop是靜態(tài)的抽象,aop是動態(tài)的抽象,?
是對應(yīng)用執(zhí)行過程中的步驟進行抽象,,從而獲得步驟之間的邏輯劃分。?
aop框架具有的兩個特征:?
1.各個步驟之間的良好隔離性?
2.源代碼無關(guān)性
轉(zhuǎn)載于:https://www.cnblogs.com/zhengah/p/4988890.html
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的java面试题(开发框架)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: insta经典滤镜下载
- 下一篇: intellij idea 15,web