Spring Boot启动流程
1. 服务构建(构造器)
- 设置primarySources:主方法类
- 设置webType:SERVLET
- 从Spring.factories获取初始化器
- 从Spring.factories获取监听器ApplicationListener
- 设置启动类:启动类
2. 环境准备(run)
- 发布Spring启动事件listeners.starting()
- 封装args参数 new DefaultApplicationArguments(args);
- 配置环境并让环境生效prepareEnvironment() & configureIgnoreBeanInfo()
- 打印Banner图printBanner(environment)
3. 容器创建(run)
- 创建容器createApplicationContext()
- 设置容器prepareContext()
- 刷新容器refreshContext(),包括refresh()和注册钩子
- afterRefresh()自定义接口
- listener.started()
- 执行Runners
- listener.running()
4. 填充容器(就是容器创建的refreshContext().refresh())
- prepareRefresh()刷新前操作,例如:清空缓存、初始化占位符
- obtainFreshBeanFactory()创建BeanFactory
- prepareBeanFactory(beanFactory)设置beanFactory.xxx属性
- postProcessBeanFactory(beanFactory)注册与Servlet相关的特殊Bean,beanDefinition,beanFactory
- invokeBeanFactoryPostProcessors(beanFactory)拓展接口,beanFactoryPostProcessor可以对bean的属性修改
- registerBeanPostProcessors(beanFactory)对Bean实例的增强
- initMessageSource()初始化信息源
- initApplicationEventMulticaster()初始化Application事件发布器
- onRefresh()初始化其他特殊bean
- registerListeners()注册监听器
- finishBeanFactoryInitialization(beanFactory)初始化剩下的Bean,例如用户自定义的Bean
- finishRefresh()完成刷新,发布完成事件
Spring Boot自动装配
1. Spring Boot Starter
概念
Starter是Spring Boot中的一个非常重要的概念,Starter相当于模块,它能将模块所需的依赖整合起来并对模块内的Bean根据环境( 条件)进行自动配置。
举例来说,你打算把这个阅读列表应用程序做成一个Web应用程序。与其向项目的构建文件里添加一堆单独的库依赖,还不如声明这是一个Web应用程序来得简单。你只要添加Spring Boot的Web起步依赖就好了。
2. 自动装配
Maven引入的每个Jar都有META-IF/spring.factories,里面包含了不同版本的类