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

Spring 容器的初始化

ApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);

当我们完成一个ApplicationContext的实例化时就完成了Spring容器的初始化,而AnnotationConfigApplicationContext的构造方法也就是Spring容器的入口。

// 初始化容器
public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) {
	// 注册 Spring 内置后置处理器的 BeanDefinition 到容器
	this();
	// 注册配置类 BeanDefinition 到容器
	register(annotatedClasses);
	// 加载或者刷新容器中的Bean
	refresh();
}

这个构造方法只有三行:

  1. 注册内置的BeanPostProcessor的BeanDefinition到容器
  2. 注册配置类 BeanDefinition 到容器
  3. 加载或者刷新容器中的Bean

容器的初始化过程我认为大致分为:

  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产生的对象。

BeanFactory和FactoryBean的区别

  • BeanFactory:它是对IOC容器所有Bean进行管理,如实例化,配置和获取容器中的Bean。
  • FactoryBean:它是一个能够生产或者修饰对象生成的工厂Bean。

BeanFactory和ApplicationContext的区别

  • BeanFactory是容器的基本定义。
  • ApplicationContext继承自BeanFactory,是容器的高级形态,在BeanFactory的基础上添加了许多对高级容器特性的支持。
发布了203 篇原创文章 · 获赞 145 · 访问量 85万+

猜你喜欢

转载自blog.csdn.net/xiaolyuh123/article/details/103289795
今日推荐