1. 程式人生 > >撩課-Java每天5道面試題第20天

撩課-Java每天5道面試題第20天

131.Spring是什麼?

他解決的是業務邏輯層和其他各層的鬆耦合問題,
因此它將面向介面的程式設計思想
貫穿整個系統應用。

 Spring是一個輕量級的IoC和AOP容器框架。
目的是解決企業應用開發的複雜性,
使用基本的JavaBean來完成
以前只可能由EJB完成的事情,
並提供了更多的企業應用功能,
Spring的用途不僅限於伺服器端的開發,
從簡單性、
可測試性和鬆耦合的角度而言,
任何Java應用都可以從Spring中受益。

 

132.說說Spring 的優點?

1.spring屬於低侵入式設計,
程式碼的汙染極低;

2.spring的DI機制降低了
業務物件替換的複雜性;

3.容器提供了AOP技術, 利用它很容易實現如許可權攔截, 執行期監控等功能; 4.降低了元件之間的耦合性 , 實現了軟體各層之間的解耦; 5.容器提供單例模式支援; 6.可以使用容器提供的眾多服務, 如事務管理,訊息服務等; 7.容器提供了眾多的輔助類, 能加快應用的開發; 8.spring對於主流的應用框架提供了整合支援, 如hibernate,JPA,Struts等 9.獨立於各種應用伺服器 10.Spring的高度開放性, 並不強制應用完全依賴於Spring, 開發者可以自由選擇spring的部分或全部。

 

133.說說你對Spring的IoC與DI的理解

1)IOC就是控制反轉。
就是物件的建立權反轉交給Spring,
由容器控制程式之間的依賴關係,
作用是實現了程式的解耦合,
而非傳統實現中,
由程式程式碼直接操控。
(依賴)控制權由應用程式碼本身轉到了外部容器,
由容器根據配置檔案去建立例項
並管理各個例項之間的依賴關係,
控制權的轉移,
是所謂反轉,
並且由容器動態的將某種依賴關係注入到元件之中。
BeanFactory 是Spring IoC容器的具體實現與核心介面,
提供了一個先進的配置機制,
使得任何型別的物件的配置成為可能,
用來包裝和管理各種bean。

2.最直觀的表達就是,
IOC讓物件的建立不用去new了,
可以由spring自動生產,
這裡用的就是java的反射機制,
通過反射在執行時動態的去建立、
呼叫物件。
spring就是根據配置檔案
在執行時動態的去建立物件,
並呼叫物件的方法的。

3.Spring的IOC有三種注入方式 : 第一是根據屬性注入,也叫set方法注入; 第二種是根據構造方法進行注入; 第三種是根據註解進行注入。 詳細的說: IOC控制反轉: 將物件交給容器管理, 你只需要在spring配置檔案總配置相應的bean, 以及設定相關的屬性, 讓spring容器生成類的例項物件以及管理物件。 在spring容器啟動的時候, spring會把你在配置檔案中配 置的bean都初始化以及裝配好, 然後在你需要呼叫的時候, 就把它已經初始化好的那些bean 分配給你需要呼叫這些bean的類。 就是將物件的控制權反轉給spring容器管理。 DI機制(Dependency Injection,依賴注入): 可以說是IoC的其中一個內容, 在容器例項化物件的時候 主動的將被呼叫者(或者說它的依賴物件) 注入給呼叫物件。 比如物件A需要操作資料庫, 以前我們總是要在A中 自己編寫程式碼來獲得一個Connection物件, 有了 spring我們就只需要告訴spring, A中需要一個Connection, 至於這個Connection怎麼構造, 何時構造, A不需要知道。 在系統執行時, spring會在適當的時候製造一個Connection, 然後像打針一樣,注射到A當中, 這樣就完成了對各個物件之間關係的控制。

 

134.解釋Spring支援的幾種bean的作用域

Spring容器中的bean可以分為5個範圍:
1.singleton:這種bean範圍是預設的,
這種範圍確保不管接受到多少個請求,
每個容器中只有一個bean的例項,
單例的模式由bean factory自身來維護。

2.prototype:原形範圍與單例範圍相反,
為每一個bean請求提供一個例項。

3.request:在請求bean範圍內
會每一個來自客戶端的網路請求建立一個例項,
在請求完成以後,
bean會失效並被垃圾回收器回收。

4.Session:與請求範圍類似,
確保每個session中有一個bean的例項,
在session過期後,
bean會隨之失效。

5.global-session:
global-session和Portlet應用相關。
當你的應用部署在Portlet容器中工作時,
它包含很多portlet。
如果你想要宣告讓所有的portlet
共用全域性的儲存變數的話,
那麼這全域性變數需要儲存在global-session中。
全域性作用域與Servlet中的session
作用域效果相同。

 

135.BeanFactory 介面和 ApplicationContext 介面有什麼區別 ?

BeanFactory和ApplicationContext
是Spring的兩大核心介面,
而其中ApplicationContext是BeanFactory的子介面。
它們都可以當做Spring的容器,
生成Bean例項的,
並管理容器中的Bean。

1.BeanFactory:
是Spring裡面最底層的介面,
提供了最簡單的容器的功能,
負責讀取bean配置文件,
管理bean的載入與例項化,
維護bean之間的依賴關係,
負責bean的生命週期,
但是無法支援spring的aop功能和web應用。

2.ApplicationContext介面
作為BeanFactory的派生,
因而具有BeanFactory所有的功能。
而且ApplicationContext還在功能上做了擴充套件,
以一種更面向框架的方式工作以及對上下文進行分層和實現繼承,
相較於BeanFactorty,
ApplicationContext還提供了以下的功能: 
①預設初始化所有的Singleton,也可以通過配置取消預初始化。
②繼承MessageSource,因此支援國際化。
③資源訪問,比如訪問URL和檔案。
④事件機制。
⑤同時載入多個配置檔案。
⑥以宣告式方式啟動並建立Spring容器。
⑦載入多個(有繼承關係)上下文 ,
使得每一個上下文
都專注於一個特定的層次,
比如應用的web層。

BeanFactroy採用的是延遲載入形式
來注入Bean的,
即只有在使用到某個Bean時(呼叫getBean()),
才對該Bean進行載入例項化,
這樣,我們就不能發現一些存在的Spring的配置問題。
如果Bean的某一個屬性沒有注入,B
eanFacotry載入後,
直至第一次使用呼叫getBean方法
才會丟擲異常。

而ApplicationContext則相反,
它是在容器啟動時,
一次性建立了所有的Bean。
這樣,在容器啟動時,
我們就可以發現Spring中存在的配置錯誤,
這樣有利於檢查所依賴屬性是否注入。 
ApplicationContext啟動後
預載入所有的單例項Bean,
通過預載入單例項bean ,
確保當你需要的時候,
你就不用等待,
因為它們已經建立好了。

相對於基本的BeanFactory,
ApplicationContext 唯一的不足是
佔用記憶體空間。
當應用程式配置Bean較多時,
程式啟動較慢。

BeanFactory通常以程式設計的方式被建立,
ApplicationContext還能以宣告的方式建立,
如使用ContextLoader。

BeanFactory和ApplicationContext
都支援BeanPostProcessor、
BeanFactoryPostProcessor的使用,

但兩者之間的區別是:
BeanFactory需要手動註冊,
而ApplicationContext則是自動註冊。