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