Spring 中常見的容器
我們知道spring容器就是spring中bean的駐留場所。spring容器並不是只有一個。spring自帶了多個容器實現,可以歸為兩種不同的類型:bean工廠和應用上下文。bean工廠是最簡單的容器,提供了基本的Di支持;而應用上下文是基於beanFactory構建,並提供了應用框架級別的服務,例如從屬性文件解析文本信息以及發布應用實踐給感性趣的事件監聽者。
雖然我們可以在bean工廠和應用上下文之間任選一種,但是bean工廠對於大多數應用來說往往太低級了,因此,應用上下文要比bean工廠更受歡迎。所以下面我們重點討論的都是應用上下文對bean的管理。
兩類容器的區別:
- BeanFactory
BeanFactory采用了工廠設計模式,負責讀取bean配置文檔,管理bean的加載,實例化,維護bean之間的依賴關系,負責bean的生命周期。BeanFactory在解析配置文件時並不會初始化對象,只有在使用對象getBean()才會對該對象進行初始化
- ApplicationContext(接口)
ApplicationContext除了提供上述BeanFactory所能提供的功能之外,還提供了更完整的框架功能:國際化支持、aop、事務等。而ApplicationContext在解析配置文件時對配置文件中的所有對象都初始化了,getBean()方法只是獲取對象的過程,這樣可以確保應用不需要等待他們被創建。
spring自帶了很多種類型的應用上下文,常見的有如下幾種:
1.AnnotationConfigApplicationContext:從一個或多個基於java的配置類中加載spring上下文定義,適用於java注解的方式;
2.ClassPathXmlApplicationContext:從類路徑下的一個或多個xml配置文件中加載上下文定義,把應用上下文的定義文件作為類資源。適用於xml配置的方式;
3.FileSystemXmlApplicationContext:從文件系統下的一個或多個xml配置文件中加載上下文定義,也就是說系統盤符中加載xml配置文件;
4.AnnotationConfigWebApplicationContext:從一個或多個基於java的配置類中加載spring web應用上下文。專門為web應用准備的,適用於注解方式;
5.XmlWebApplicationContext:從web應用下的一個或多個xml配置文件加載上下文定義,適用於xml配置方式
Spring如何管理bean
注意:這里我們是以應用上下文管理bean為例的。
以<bean id="airplane" class="spring.Airplane"/>為例,spring在啟動的時候,會創建應用上下文容器,而所有的bean都是在創建應用上下文容器的時候進行加載的,大致流程就是,應用上下文對象會根據我們傳入的配置文件路徑去加載這個配置文件,然后解析配置文件的<beans>標簽下的<bean>標簽,然后會對每個bean標簽進行解析,這時會根據我們在bean標簽中配置的屬性(這里我們只定義了id和class)給每一個bean實例化一個BeanDefinition,同時會把這些BeanDefinition對象放入到應用上下文中的一個List<BeanDefinition>集合中,接着就是對List<BeanDefinition>進行循環並且通過class的值通過反射,實例化bean,最后將實例化的bean維護到一個map中,map的key就是bean的id,map的value就是bean的實例化對象,最后我們就可以通過id來獲取我們想要的bean了,但是這里只是簡單的介紹了bean的加載,應用上下文所做的事情遠不止這些,還有對懶加載bean的維護,對bean之間依賴關系的維護(就是我們常說的依賴關系,其實也是通過一個Map<String, Set<String>>類型ConcurrentHashMap來維護的)等等。
