1. 程式人生 > >【面試】【Spring常見問題總結】【07】

【面試】【Spring常見問題總結】【07】

之間 編程方式 順序 莫名其妙 接口編程 情況 spring容器 相互 lazy

【常見面試問題總結文件夾>>>】



61、Spring IoC容器的依賴有兩層含義:

Bean依賴容器:也就是說Bean要依賴於容器,這裏的依賴是指容器負責創建Bean並管理Bean的生命周期,正是因為由容器來控制創建Bean並註入依賴,也就是控制權被反轉了,這也正是IoC名字的由來,此處的有依賴是指Bean和容器之間的依賴關系。

容器註入Bean的依賴資源:容器負責註入Bean的依賴資源,依賴資源能夠是Bean、外部文件、常量數據等,在Java中都反映為對象。而且由容器負責組裝Bean之間的依賴關系,此處的依賴是指Bean之間的依賴關系。能夠覺得是傳統類與類之間的“關聯”、“聚合”、“組合”關系。

62、為什麽要應用依賴註入。應用依賴註入能給我們帶來哪些優點呢?

動態替換Bean依賴對象,程序更靈活:替換Bean依賴對象,無需改動源文件:應用依賴註入後。因為能夠採用配置文件方式實現,從而能隨時動態的替換Bean的依賴對象,無需改動java源文件;

更好實踐面向接口編程。代碼更清晰:在Bean中僅僅需指定依賴對象的接口,接口定義依賴對象完畢的功能,通過容器註入依賴實現;

更好實踐優先使用對象組合,而不是類繼承:由於IoC容器採用註入依賴,也就是組合對象,從而更好的實踐對象組合。

採用對象組合,Bean的功能可能由幾個依賴Bean的功能組合而成,其Bean本身可能僅僅提供少許功能或根本無不論什麽功能,所有托付給依賴Bean,對象組合具有動態性,能更方便的替換掉依賴Bean,從而改變Bean功能;

而假設採用類繼承,Bean沒有依賴Bean,而是採用繼承方式加入新功能,,並且功能是在編譯時就確定了,不具有動態性。並且採用類繼承導致Bean與子Bean之間高度耦合,難以復用。

添加Bean可復用性:依賴於對象組合,Bean更可復用且復用更簡單。

減少Bean之間耦合:因為我們全然採用面向接口編程,在代碼中沒有直接引用Bean依賴實現,所有引用接口,並且不會出現顯示的創建依賴對象代碼。並且這些依賴是由容器來註入,非常easy替換依賴實現類。從而減少Bean與依賴之間耦合;

代碼結構更清晰:要應用依賴註入。代碼結構要依照規約方式進行書寫。從而更好的應用一些最佳實踐,因此代碼結構更清晰。

63、什麽是循環依賴?

循環依賴就是循環引用,就是兩個或多個Bean 相互之間的持有對方。比方CircleA 引用CircleB。CircleB 引用CircleC,CircleC 引用CircleA,則它們終於反映為一個環。

64、Spring怎樣解決循環依賴

構造器循環依賴:表示通過構造器註入構成的循環依賴,此依賴是無法解決的,僅僅能拋出BeanCurrentlyInCreationException異常表示循環依賴。

setter循環依賴:表示通過setter註入方式構成的循環依賴。對於setter註入造成的依賴是通過Spring容器提前暴露剛完畢構造器註入但未完畢其它步驟(如setter註入)的Bean來完畢的,並且僅僅能解決單例作用域的Bean循環依賴。對於“prototype”作用域Bean,Spring容器無法完畢依賴註入。由於“prototype”作用域的Bean。Spring容器不進行緩存,因此無法提前暴露一個創建中的Bean。對於“singleton”作用域Bean。能夠通過“setAllowCircularReferences(false);”來禁用循環引用。

65、延遲初始化Bean

延遲初始化也叫做惰性初始化,指不提前初始化Bean,而是僅僅有在真正使用時才創建及初始化Bean。

配置方式非常easy僅僅需在<bean>標簽上指定 “lazy-init” 屬性值為“true”就可以延遲初始化Bean。

Spring容器會在創建容器時提前初始化“singleton”作用域的Bean,“singleton”就是單例的意思即整個容器每一個Bean僅僅有一個實例,後邊會具體介紹。Spring容器預先初始化Bean通常能幫助我們提前發現配置錯誤。所以假設沒有什麽情況建議開啟,除非有某個Bean可能須要載入非常大資源,並且非常可能在整個應用程序生命周期中非常可能使用不到。能夠設置為延遲初始化。

延遲初始化的Bean一般會在第一次使用時被初始化;或者在被非延遲初始化Bean作為依賴對象註入時在會隨著初始化該Bean時被初始化,由於在這時使用了延遲初始化Bean。

容器管理初始化Bean消除了編程實現延遲初始化。全然由容器控制。僅僅需在須要延遲初始化的Bean定義上配置就可以,比編程方式更簡單,並且是無侵入代碼的。

66、使用depends-on

depends-on是指指定Bean初始化及銷毀時的順序,使用depends-on屬性指定的Bean要先初始化完成後才初始化當前Bean,因為僅僅有“singleton”Bean能被Spring管理銷毀。所以當指定的Bean都是“singleton”時,使用depends-on屬性指定的Bean要在指定的Bean之後銷毀。

“depends-on”有什麽優點呢?主要是給出明白的初始化及銷毀順序。降低發生錯誤。

67、不是全部類型都能自己主動裝配:

不能自己主動裝配的數據類型:Object、基本數據類型(Date、CharSequence、Number、URI、URL、Class、int)等。

通過“<beans>”標簽default-autowire-candidates屬性指定的匹配模式,不匹配的將不能作為自己主動裝配的候選者,比如指定“*Service,*Dao”。將僅僅把匹配這些模式的Bean作為候選者,而不匹配的不會作為候選者;

通過將“<bean>”標簽的autowire-candidate屬性可被設為false。從而該Bean將不會作為依賴註入的候選者。

68、數組、集合、字典類型的依據類型自己主動裝配和普通類型的自己主動裝配是有差別的

數組類型、集合(Set、Collection、List)接口類型:將依據泛型獲取匹配的全部候選者並註入到數組或集合中,如“List<HelloApi> list”將選擇全部的HelloApi類型Bean並註入到list中。而對於集合的詳細類型將僅僅選擇一個候選者,“如 ArrayList<HelloApi> list”將選擇一個類型為ArrayList的Bean註入,而不是選擇全部的HelloApi類型Bean進行註入;

字典(Map)接口類型:相同依據泛型信息註入,鍵必須為String類型的Bean名字,值依據泛型信息獲取,如“Map<String, HelloApi>map” 將選擇全部的HelloApi類型Bean並註入到map中,而對於詳細字典類型如“HashMap<String,HelloApi> map”將僅僅選擇類型為HashMap的Bean註入。而不是選擇全部的HelloApi類型Bean進行註入。

69、自己主動裝配的優點和壞處?

首先,自己主動裝配確實降低了配置文件的量。其次,“byType”自己主動裝配能在對應的Bean更改了字段類型時自己主動更新。即改動Bean類不須要改動配置。確實簡單了。

自己主動裝配也是有缺點的,最重要的缺點就是沒有了配置,在查找註入錯誤時很麻煩,還有比方基本類型沒法完畢自己主動裝配。所以可能常常發生一些莫名其妙的錯誤,在此我推薦大家不要使用該方式,最好是指定明白的註入方式,或者採用最新的Java5+註解註入方式。所以大家在使用自己主動裝配時應該考慮自己負責項目的復雜度來進行衡量是否選擇自己主動裝配方式。

70、自己主動裝配註入方式能和配置註入方式一同工作嗎?

當然能夠。配置註入的數據會覆蓋自己主動裝配註入的數據。

【面試】【Spring常見問題總結】【07】