spring源码-bean加载整体流程
内容概述
本文主要记录spring源码中初始化、实例化bean的整体流程,后面会单独拆开分析spring在初始化中的详细步骤;我在学习的时候,是以Java配置的方式,来学习spring的。所以,就以AnnotationConfigApplicationContext为例了
入口
在spring启动的时候,会通过AbstractApplicationContext的子类来初始化,如果我们指定了对应的配置类,会通过下面的构造函数开始spring的初始化
public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) {
this();
register(annotatedClasses);
refresh();
}
这个方法中,有三个方法,来依次分析三行代码完成的操作
this()
先说这代码完成的操作:
1、初始化了一个AnnotatedBeanDefinitionReader()对象,在初始化该对象的时候,将spring在后面对业务类进行初始化时,需要用到的一些后置处理器,存入了beanDefinitionMap中,我们姑且称这些为spring自带的beanPostProcessor和beanFactoryPostProcessor;
在org.springframework.context.annotation.AnnotationConfigUtils#registerAnnotationConfigProcessors(org.springframework.beans.factory.support.BeanDefinitionRegistry, java.lang.Object)
这个方法中,将spring自带的beanPostProcessor和beanFactoryPostProcessor放到了beanDefinitionMap中;可以debug一下来看下
- ConfigurationClassPostProcessor
- AutowiredAnnotationBeanPostProcessor
- CommonAnnotationBeanPostProcessor
- EventListenerMethodProcessor
- DefaultEventListenerFactory
- PersistenceAnnotationBeanPostProcessor
在这几个bean中,有一个bean需要特别注意一下,ConfigurationClassPostProcessor;这个类是BeanDefinitionRegistryPostProcessor的实现类,BeanDefinitionRegistryPostProcessor又是BeanFactoryPostProcessor的子接口,这个类在扫描bean的时候 有用到;这几个类,后面学习spring扫描bean的时候会详细介绍
2、初始化了一个ClassPathBeanDefinitionScanner对象,在初始化该对象的时候,对两个list集合进行了赋值
private final List includeFilters = new LinkedList<>();