Spring启动过程(概括)
Spring在BeanFactory基础上提供了一些列具体容器的实现,其中AnnotationConfigApplicationContext是一个用来管理注解bean的容器,从AnnotationConfigApplicationContext的实现结构图中可以看出:
- AnnotationConfigApplicationContext继承GenericApplicationContext这个通用应用上下文,GenericApplicationContext内部定义了一个DefaultListableBeanFactory实例,GenericApplicationContext实现了BeanDefinitionRegistry接口,所以可以通过AnnotationConfigApplicationContext实例注册bean defintion,然后调用refresh()方法来初始化上下文。
- AnnotationConfigApplicationContext继承AbstractApplicationContext,AbstractApplicationContext提供了ApplicationContext的抽象实现。
public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) {
//1.初始化bean定义读取器和扫描器;
//2.调用父类GenericApplicationContext无参构造函数,初始化一个BeanFactory: DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory()
//3.注册Spring自带的bean,共5个 包括: ConfigurationClassPostProcessor
// AutowiredAnnotationBeanPostProcessor CommonAnnotationBeanPostProcessor
// EventListenerMethodProcessor DefaultEventListenerFactory
this();
// 注册AppConfig, ApplicationContext传入的配置类
//此处只是注册了 @Configuration 注释的配置类,
//register方法 作用是 将对应的Bean生成BeanDefinition,放到spring容器中;容器是一个 map,key是beanName(xml<Bean>标签里 id),value是BeanDefinition
register(annotatedClasses);
//刷新容器,主要完成了 @Component 等相关注解注释的bean的初始化工作,将bean加载到 spring容器管理(与SpringBoot有相似部分)
refresh();