Spring 源碼(一)Spring 容器的入口

Spring 容器的初始化

ApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);

當咱們完成一個ApplicationContext的實例化時就完成了Spring容器的初始化,而AnnotationConfigApplicationContext的構造方法也就是Spring容器的入口。java

// 初始化容器
public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) {
	// 註冊 Spring 內置後置處理器的 BeanDefinition 到容器
	this();
	// 註冊配置類 BeanDefinition 到容器
	register(annotatedClasses);
	// 加載或者刷新容器中的Bean
	refresh();
}

這個構造方法只有三行:this

  1. 註冊內置的BeanPostProcessor的BeanDefinition到容器
  2. 註冊配置類 BeanDefinition 到容器
  3. 加載或者刷新容器中的Bean

容器的初始化過程我認爲大體分爲:code

  1. 註冊內置的BeanPostProcessor的BeanDefinition到容器
  2. 註冊配置類 BeanDefinition 到容器
  3. 解析配置類
  4. 初始化全部單例Bean,並註冊到容器

AnnotationConfigApplicationContext 總攬

咱們來看下AnnotationConfigApplicationContext的類圖: AnnotationConfigApplicationContext.png對象

  • BeanFactory:它定義了Spring IOC容器最基本的功能規範,主要用來實例化、配置和管理Bean,它是IOC容器容器的心脹。
  • HierarchicalBeanFactory:繼承BeanFactory接口,新增了getParentBeanFactory()方法,使BeanFactory具有了雙親IOC容器的管理功能。
  • ListableBeanFactory:細化了許多BeanFactory接口的功能,好比getBeanDefinitionNames()方法(獲取容器中全部Bean定義的名稱)。
  • ResourceLoader:資源加載器。
  • MessageSource:支持不一樣的信息源,從而實現國際化。
  • ApplicationEventPublisher:支持應用事件,提供事件機制的定義。
  • EnvironmentCapable:提供了對環境變量的支持。
  • ApplicationContext:它繼承了上述全部接口,是IOC容器的高級形態,它定了一個完成容器的雛形。
  • AbstractApplicationContext:一個容器的抽象實現。

用戶使用容器時,能夠使用轉義符"&"來獲得FactoryBean自己,若是不加則是獲取FactoryBean產生的對象。blog

BeanFactory和FactoryBean的區別

  • BeanFactory:它是對IOC容器全部Bean進行管理,如實例化,配置和獲取容器中的Bean。
  • FactoryBean:它是一個可以生產或者修飾對象生成的工廠Bean。

BeanFactory和ApplicationContext的區別

  • BeanFactory是容器的基本定義。
  • ApplicationContext繼承自BeanFactory,是容器的高級形態,在BeanFactory的基礎上添加了許多對高級容器特性的支持。
相關文章
相關標籤/搜索