Spring概念比較

一、BeanFactory vs ApplicationContext Reference Bean Factoryweb

Bean instantiation/wiring

Application Contextsession

1. Bean instantiation/wiring
2. Automatic BeanPostProcessor registration
3. Automatic BeanFactoryPostProcessor registration
4. Convenient MessageSource access (for i18n)
5. ApplicationEvent publication

So if you need any of the points presented on the Application Context side, you should use ApplicationContext.app

BeanFactory只是提供最基本的功能,ApplicationContext繼承了不少的接口,提供更多的高級功能。 類圖以下:ide

輸入圖片說明

2.ClassPathXmlApplicationContext vs FileSystemXmlApplicationContextthis

參考一 參考二spa

  1. ClassPathXmlApplicationContext will read files from your classpath. They must be in classesfolder of your web application or in a jar in your libfolder.code

  2. FileSystemXmlApplicationContext can access all your file system, for example c:/config/applicationContext.xml.xml

  3. XmlWebApplicationContext certainly can access to files contained in your web application, but this is not the most important thing. It implements WebApplicationContext and this means that it will detect ServletContextAware beans, register custom scopes (request, session, ...) among other things.對象

可加載文件的位置不一樣,ClassPathXmlApplicationContext讀取文件從classpath下。繼承

FileSystemXmlApplicationContext 可讀取文件系統中的任何位置。

XmlWebApplicationContext 訪問Web容器的目錄下

3.構造注入和setter注入比較

他們的執行效果與設值注入的執行效果同樣。可是仍是有點卻別:建立Person實例中Axe的屬性時機不一樣—設值注入式先經過無參數的構造器建立一個Bean實例,而後調用它的setter方法注入依賴關係,而構造注入則是直接調用有參數的構造器,當Bean實例建立完成後,依賴關係也已經完成。

構造注入的缺點: 若是涉及到注入比較多,構造器注入傳入參數比較多,會顯得比較臃腫,因此仍是首推setter注入。

構造注入的優勢: 構造注入能夠在構造器中決定依賴關係的注入順序,優先依賴的優先注入。例如,組件中其餘依賴關係的注入,經常要依賴於DataSrouce的注入。採用構造注入,能夠在代碼中清晰的決定注入順序。

對於依賴關係無需變化的Bean,構造注入更有用處。由於沒有Setter方法,全部的依賴關係所有在構造器內設定。所以,無需擔憂後續的代碼對依賴關係產生破壞。

 建議:採用以設值注入爲主,構造注入爲輔的注入策略。對於依賴關係無需變化的注入,儘可能採用構造注入;而其餘的依賴關係的注入,則考慮採用設值注入。

請注意如下明顯的區別:

在設值注入方法支持大部分的依賴注入,若是咱們僅須要注入int、string和long型的變量,咱們不要用設值的方法注入。對於基本類型,若是咱們沒有注入的話,能夠爲基本類型設置默認值。在構造方法注入不支持大部分的依賴注入,由於在調用構造方法中必須傳入正確的構造參數,不然的話爲報錯。 設值注入不會重寫構造方法的值。若是咱們對同一個變量同時使用了構造方法注入又使用了設置方法注入的話,那麼構造方法將不能覆蓋由設值方法注入的值。很明顯,由於構造方法盡在對象被建立時調用。 在使用設值注入時有可能還不能保證某種依賴是否已經被注入,也就是說這時對象的依賴關係有多是不完整的。而在另外一種狀況下,構造器注入則不容許生成依賴關係不完整的對象。 在設值注入時若是對象A和對象B互相依賴,在建立對象A時Spring會拋出sObjectCurrentlyInCreationException異常,由於在B對象被建立以前A對象是不能被建立的,反之亦然。因此Spring用設值注入的方法解決了循環依賴的問題,因對象的設值方法是在對象被建立以前被調用的。

相關文章
相關標籤/搜索