Spring 源码(一)Spring 容器的入口
2019-09-29 本文已影响0人
xiaolyuh
Spring 容器的初始化
ApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);
当我们完成一个ApplicationContext的实例化时就完成了Spring容器的初始化,而AnnotationConfigApplicationContext的构造方法也就是Spring容器的入口。
// 初始化容器
public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) {
// 注册 Spring 内置后置处理器的 BeanDefinition 到容器
this();
// 注册配置类 BeanDefinition 到容器
register(annotatedClasses);
// 加载或者刷新容器中的Bean
refresh();
}
这个构造方法只有三行:
- 注册内置的BeanPostProcessor的BeanDefinition到容器
- 注册配置类 BeanDefinition 到容器
- 加载或者刷新容器中的Bean
容器的初始化过程我认为大致分为:
- 注册内置的BeanPostProcessor的BeanDefinition到容器
- 注册配置类 BeanDefinition 到容器
- 解析配置类
- 初始化所有单例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的基础上添加了许多对高级容器特性的支持。