天天看點

Spring架構筆記-了解Spring容器、BeanFactory以及ApplicationContext

1.Spring容器

Spring容器可以了解為生産對象(OBJECT)的地方,在這裡容器不隻是幫我們建立了對象那麼簡單,它負責了對象的整個生命周期–建立、裝配、銷毀。而這裡對象的建立管理的控制權都交給了Spring容器,是以這是一種控制權的反轉,稱為IOC容器,而這裡IOC容器不隻是Spring才有,很多架構也都有該技術。

2.BeanFactory和ApplicationContext之間的關系

BeanFactory和ApplicationContext是Spring的兩大核心接口,而其中ApplicationContext是BeanFactory的子接口。它們都可以當做Spring的容器,Spring容器是生成Bean執行個體的工廠,并管理容器中的Bean。在基于Spring的Java EE應用中,所有的元件都被當成Bean處理,包括資料源,Hibernate的SessionFactory、事務管理器等。

生活中我們一般會把生産産品的地方稱為工廠,而在這裡bean對象的地方官方取名為BeanFactory,直譯Bean工廠(com.springframework.beans.factory.BeanFactory),我們一般稱BeanFactory為IoC容器,而稱ApplicationContext為應用上下文。

Spring的核心是容器,而容器并不唯一,架構本身就提供了很多個容器的實作,大概分為兩種類型:

一種是不常用的BeanFactory,這是最簡單的容器,隻能提供基本的DI功能;

一種就是繼承了BeanFactory後派生而來的ApplicationContext(應用上下文),它能提供更多企業級的服務,例如解析配置文本資訊等等,這也是ApplicationContext執行個體對象最常見的應用場景。

3.BeanFactory詳情介紹

Spring容器最基本的接口就是BeanFactory。BeanFactory負責配置、建立、管理Bean,它有一個子接口ApplicationContext,也被稱為Spring上下文,容器同時還管理着Bean和Bean之間的依賴關系。

spring Ioc容器的實作,從根源上是beanfactory,但真正可以作為一個可以獨立使用的ioc容器還是DefaultListableBeanFactory,是以可以這麼說,

DefaultListableBeanFactory 是整個spring ioc的始祖。

Spring架構筆記-了解Spring容器、BeanFactory以及ApplicationContext

接口介紹:

1.BeanFactory接口:

 是Spring bean容器的根接口,提供擷取bean,是否包含bean,是否單例與原型,擷取bean類型,bean 别名的方法 。它最主要的方法就是getBean(String beanName)。

2.BeanFactory的三個子接口:

 * HierarchicalBeanFactory:提供父容器的通路功能

 * ListableBeanFactory:提供了批量擷取Bean的方法

 * AutowireCapableBeanFactory:在BeanFactory基礎上實作對已存在執行個體的管理

3.ConfigurableBeanFactory:

主要單例bean的注冊,生成執行個體,以及統計單例bean

4.ConfigurableListableBeanFactory:

繼承了上述的所有接口,增加了其他功能:比如類加載器,類型轉化,屬性編輯器,BeanPostProcessor,作用域,bean定義,處理bean依賴關系, bean如何銷毀…

5.實作類DefaultListableBeanFactory詳細介紹:

實作了ConfigurableListableBeanFactory,實作上述BeanFactory所有功能。它還可以注冊BeanDefinition。

下面,我們使用Spring配置檔案對Car提供配置資訊,然後通過BeanFactory裝載配置檔案,啟動Spring IoC容器:

public class BeanFactoryTest {
	public static void main(String[] args)throws Throwable{
		ResourcePatternResolver resolver=new PathMatchingResourcePatternResolver();
		Resource res=resolver.getResource("classpath:com/baobaotao/beanfactory/beans.xml");
		BeanFactory bf=new XmlBeanFactory(res);//res裡包含了Spring的配置資訊,并建立了容器
		System.out.println("init BeanFactory");
		Car car=bf.getBean("car",Car.class);//通過BeanFactory#getBean(beanName)方法從IoC容器中擷取Bean
		System.out.println("car bean is ready for use!");
	}
}

           

4.ApplicationContext詳情介紹

如果說BeanFactory是Sping的心髒,那麼ApplicationContext就是完整的身軀了。

ApplicationContext常用實作類:

AnnotationConfigApplicationContext 從一個或多個基于java的配置類中加載上下文定義,适用于java注解的方式。

ClassPathXmlApplicationContext 從類路徑下的一個或多個xml配置檔案中加載上下文定義,适用于xml配置的方式。

FileSystemXmlApplicationContext 從檔案系統下的一個或多個xml配置檔案中加載上下文定義,也就是說系統盤符中加載xml配置檔案。

AnnotationConfigWebApplicationContext 專門為web應用準備的,适用于注解方式。

XmlWebApplicationContext 從web應用下的一個或多個xml配置檔案加載上下文定義,适用于xml配置方式。

Spring具有非常大的靈活性,它提供了三種主要的裝配機制:

1.在XMl中進行顯示配置

2.在Java中進行顯示配置

3.隐式的bean發現機制和自動裝配

元件掃描(component scanning):Spring會自動發現應用上下文中所建立的bean。

自動裝配(autowiring):Spring自動滿足bean之間的依賴。

(使用的優先性: 3>2>1)盡可能地使用自動配置的機制,顯示配置越少越好。當必須使用顯示配置bean的時候(如:有些源碼不是由你來維護的,而當你需要為這些代碼配置bean的時候),推薦使用類型安全比XML更加強大的JavaConfig。最後隻有當你想要使用便利的XML命名空間,并且在JavaConfig中沒有同樣的實作時,才使用XML。

除了提供BeanFactory所支援的所有功能外ApplicationContext還有額外的功能

1.預設初始化所有的Singleton,也可以通過配置取消預初始化。

2.繼承MessageSource,是以支援國際化。

3.資源通路,比如通路URL和檔案。

4.事件機制。

5.同時加載多個配置檔案。

6.以聲明式方式啟動并建立Spring容器。

下面,我們使用Spring配置檔案對Car提供配置資訊,AnnotationConfigApplicationContext将加載Bean.class中Bean定義。

public class AnnotationApplicationContext{
	public static void main(String args[]){
		ApplicationContext ctx=new AnnotationConfigApplicationContext(Bean.class);
		Car car=ctx.getBean("car",Car.class);
	}
}