总:
spring启动可以归纳为三步:
1:初始化spring容器,注册后置内置处理器beanPostProcessor的beanDefinition到容器中
2:将配置类的beanDefinition注册到容器中
3:调用refresh()方法刷新容器
因为是基于config技术进行分析源码 那么它的入口是AnnotationConfigApplicationContext,如果是使用xml进行分析的话,那么它的入口是ClassPathXmlApplicationContext,这两个类都是继承啦abstractApplicationContext类,而refresh()方法就是在此类中。
接着分析AnnontationConfigApplicationContext()方法;源码如下:
所以整个spring容器的启动流程可以绘制如下图所示
分:
接着我们主要从这三个入口详细分析spring容器启动流程
注:beanDefinition对象在spring中是一个非常重要的概念,它存储啦bean对象的所有的特征信息,如是否单例,是否懒加载,factoryBeanName等
1)初始化流程:
spring容器的初始化时,通过this()调用无参构造函数,主要做啦一下几件事情
实例化BeanFactory(defaultListableBeanFactory)工厂,进行生成bean对象
实例化beanDefinitionReader注解配置读取器,用于对特定注解(@Service,@Repository)的类进行读取转化成BeanDefinition对象。
实例化ClassPathBeanDefinitionScannner路径扫描器,用于对指定的包目录进行扫描查找bean对象。
到此spring容器构造完毕,然后就可以为容器添加一些内置的组件:
添加两个BeanFactory后置处理器,configurationClassPostPrcessor(用来完成bean的扫描与注入工作 @Configuration,@ComponentScan、@ComponentScans,@Import,@Bean),eventListenerMethodProcessor(@EventListener 的方法进行解析,然后转换为一个 ApplicationListener)
添加两个bean后置处理器autowiredAnnotationBeanPostProcessor(用来完成@AutoWired和@Value 自动注入),commonAnnontationBeanPostProcessor(用来完成@PostConstruct
、@PreDestroy
、@Resource
、@WebServiceRef等注解注入
)
添加普通组件 defaultEventListenerFactory
2)注册springconfig配置类到容器中
这个步骤主要是用来解析用户传入的spring配置类,解析成beanDefinition然后注册到容器中
3)刷新容器:
prepareRefresh()刷新前的预处理:
1 initPropertySources() 初始化一些属性设置,子类自定义个性化的属性设置方法。
2 getEnvironment().validateRequiredProperties():校验属性的合法性
3 earlyApplicationEvents = new LinkedHashSet<ApplicationEvent>() 保存容器中的一些早期的事件
obtainFreshBeanFactory() 获取在容器初始化时创建的beanFactory;
1 refreshBeanFactory() 刷新BeanFactory,设置序列化id
2 getBeanFactory() 返回初始化的genericApplicationContext创建的BeanFactory对象,即DefaultListAbleBeanFactory类型
prepareBeaFactory(beanFactory) BeanFactory的预处理工作,向容器中添加啦一些组件
1设置BeanFactory的类加载器 设置表达式解析器等等
2添加beanPostProcessor(applicationContextAwareProcessor)
3设置忽略自动装配的接口:EnvironmentAware,