spring beanFactory
1.什么叫beanfactory?
spring使用BeanFactory來實例化、配置和管理對象,但是它只是一個接口,里面有一個getBean()方法。我們一般都不直接用BeanFactory,而是用它的實現類ApplicationContext,這個類會自動解析我們配置的applicationContext.xml,然后根據我們配置的bean來new對象,將new好的對象放進一個Map中,鍵就是我們bean的id,值就是new的對象。
原文參考http://www.cnblogs.com/liuling/archive/2013/04/14/BeanFactory.html?
2.什么叫ApplicationContext?
答:實用的Bean工廠ApplicationContext,繼承BeanFactory接口
在ApplicationContext接口的眾多實現類中,有3個是我們經常用到的(見表1-1),并且使用這3個實現類也基本能滿足我們Java EE應用開發中的絕大部分需求。 表1-1 ApplicationContext接口的常用實現類介紹| 類 名 稱 | 功 能 描 述 |
| ClassPathXmlApplicationContext | 從類路徑ClassPath中尋找指定的XML配置文件,找到并裝載 完成ApplicationContext的實例化工作。例如: //裝載單個配置文件實例化ApplicationContext容器 ApplicationContext cxt = new ClassPathXmlApplicationContext ("applicationContext.xml"); //裝載多個配置文件實例化ApplicationContext容器 String[] configs = {"bean1.xml","bean2.xml","bean3.xml"}; ApplicationContext cxt = new ClassPathXmlApplicationContext(configs); |
| FileSystemXmlApplicationContext | 從指定的文件系統路徑中尋找指定的XML配置文件,找到并裝載 完成ApplicationContext的實例化工作。例如: //裝載單個配置文件實例化ApplicationContext容器 ApplicationContext cxt = new FileSystemXMLApplicationContext ("beans.xml"); //裝載多個配置文件實例化ApplicationContext容器 String[] configs = {"c:/beans1.xml","c:/beans2.xml"}; ApplicationContext cxt = new FileSystemXmlApplicationContext(configs); |
| XmlWebApplicationContext | 從Web應用中的尋找指定的XML配置文件,找到并裝載完成ApplicationContext的實例化工作。這是為Web工程量身定制的,使用WebApplicationContextUtils類的getRequiredWebApplicationContext方法可在JSP與Servlet中取得IoC容器的引用 |
3.applicationContext與beanFactory的不同?
與BeanFactory不同的是,ApplicationContext容器實例化后會自動對所有的單實例Bean進行實例化與依賴關系的裝配,使之處于待用狀態。而BeanFactory容器實例化后并不會自動實例化Bean,只有當Bean被使用時BeanFactory容器才會對該Bean進行實例化與依賴關系的裝配。 在Java項目中通過ClassPathXmlApplicationContext類手動實例化ApplicationContext容器通常是不二之選。但對于Web項目就不行了,Web項目的啟動是由相應的Web服務器負責的,因此,在Web項目中ApplicationContext容器的實例化工作最好交給Web服務器來完成。 4.在web項目中,怎樣實例化applicationContext? 答: Spring為此提供了兩種解決方案,一種是基于ContextLoaderListener實現的(此方案只適用于Servlet2.4及以上規范的Servlet容器)。例如,在web.xml中加入如下代碼: <!-- 指定Spring的配置文件,多個配置文件以逗號分隔 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-config/applicationContext.xml</param-value> </context-param> <!-- 指定以Listener方式啟動Spring容器 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> 另外一種方案則是基于ContextLoaderServlet實現的。例如,在web.xml中加入如下代碼: <!-- 指定Spring的配置文件,多個配置文件以逗號分隔 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-config/applicationContext.xml</param-value> </context-param> <!-- 指定以Servlet方式啟動Spring容器 --> <servlet> <servlet-name>context</servlet-name> <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> 從servlet容器啟動時加載組件的順序來看,Listener組件是優先于Servlet組件的。基于Servlet方式的加載方案主要是為了兼容Servlet2.3及以下規范的Servlet容器。以Tomcat為例,Tomcat 5.x都已經支持Servlet2.4規范了,因此,基于Listener方式啟動Spring容器是目前的主流選擇。 5.web開發選擇哪種方式實例化applicationConntext比較好? 答:從servlet容器啟動時加載組件的順序來看,Listener組件是優先于Servlet組件的。因此,基于Listener方式啟動Spring容器是目前的主流選擇。 本文主要參考:http://baike.baidu.com/link?url=Ll-tgSO20TwrB6sm7Eu9RKtaZuxb-hwazwqg-53kwlkPynRPwdF27bX6kOgEzq6vHiXv8dwj7xqRw9v0IsSKINnn__SFKp_XOcsvWPYvuqy 6.spring的上下文和spring mvc的上下文和web應用的上下文之間有什么關系? 答:要想很好理解這三個上下文的關系,需要先熟悉spring是怎樣在web容器中啟動起來的。spring的啟動過程其實就是其IoC容器的啟動過程,對于web程序,IoC容器啟動過程即是建立上下文的過程。
spring的啟動過程:
首先,對于一個web應用,其部署在web容器中,web容器提供其一個全局的上下文環境,這個上下文就是ServletContext,其為后面的spring IoC容器提供宿主環境;
其次,在web.xml中會提供有contextLoaderListener。在web容器啟動時,會觸發容器初始化事件,此時contextLoaderListener會監聽到這個事件,其contextInitialized方法會被調用,在這個方法中,spring會初始化一個啟動上下文,這個上下文被稱為根上下文,即WebApplicationContext,這是一個接口類,確切的說,其實際的實現類是XmlWebApplicationContext。這個就是spring的IoC容器,其對應的Bean定義的配置由web.xml中的context-param標簽指定。在這個IoC容器初始化完畢后,spring以WebApplicationContext.ROOTWEBAPPLICATIONCONTEXTATTRIBUTE為屬性Key,將其存儲到ServletContext中,便于獲取;
再次,contextLoaderListener監聽器初始化完畢后,開始初始化web.xml中配置的Servlet,這個servlet可以配置多個,以最常見的DispatcherServlet為例,這個servlet實際上是一個標準的前端控制器,用以轉發、匹配、處理每個servlet請求。DispatcherServlet上下文在初始化的時候會建立自己的IoC上下文,用以持有spring mvc相關的bean。在建立DispatcherServlet自己的IoC上下文時,會利用WebApplicationContext.ROOTWEBAPPLICATIONCONTEXTATTRIBUTE先從ServletContext中獲取之前的根上下文(即WebApplicationContext)作為自己上下文的parent上下文。有了這個parent上下文之后,再初始化自己持有的上下文。這個DispatcherServlet初始化自己上下文的工作在其initStrategies方法中可以看到,大概的工作就是初始化處理器映射、視圖解析等。這個servlet自己持有的上下文默認實現類也是mlWebApplicationContext。初始化完畢后,spring以與servlet的名字相關(此處不是簡單的以servlet名為Key,而是通過一些轉換,具體可自行查看源碼)的屬性為屬性Key,也將其存到ServletContext中,以便后續使用。這樣每個servlet就持有自己的上下文,即擁有自己獨立的bean空間,同時各個servlet共享相同的bean,即根上下文(第2步中初始化的上下文)定義的那些bean。
說完了spring上下文的初始化過程,這三個上下文的關系應該就了解了。如還是不太清楚,我就愛莫能助了,只能自行看代碼去了。
轉自https://segmentfault.com/q/1010000000210417 感謝作者
轉載于:https://www.cnblogs.com/panxuejun/p/5898539.html
總結
以上是生活随笔為你收集整理的spring beanFactory的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ps调整图层
- 下一篇: hihocoder #1388 : Pe