- 用户发送请求
- DispatcherServlet 查找 HandlerMapping 对应的 Handler
- DispatcherServlet 通过 HandlerAdapter 调用 Handler 返回 ModelAndView
- DispatcherServlet 使用 ViewResolver 处理 ModelAndView
- DispatcherServlet 返回结果
- 日志
- 权限控制
- 链路追踪
- 缓存
- 延迟加载
- 事务管理
- prepareRefresh() 准备工作,记录下容器的启动时间、标记“已启动”状态、处理配置文件中的占位符
- obtainFreshBeanFactory() 解析配置文件注册到 BeanFactory(内部是一个 BeanName-> BeanDefinition 的 map)
- prepareBeanFactory() 设置 BeanFactory 的类加载器,添加几个 BeanPostProcessor,手动注册几个特殊的 bean
- postProcessBeanFactory() 给子类的扩展点 具体的子类可以添加一些特殊的 BeanFactoryPostProcessor
- invokeBeanFactoryPostProcessors() 调用 BeanFactoryPostProcessor 的 postProcessBeanFactory(factory)
- registerBeanPostProcessors() 注册 BeanPostProcessor
- initMessageSource() 用于国际化
- initApplicationEventMulticaster() 初始化事件广播器
- onRefresh() 子类的扩展点具体的子类可以在这里初始化一些特殊的 Bean
- registerListeners() 注册事件监听器,监听器需要实现 ApplicationListener 接口
- finishBeanFactoryInitialization() 初始化所有的 singleton beans(lazy-init 的除外)
- finishRefresh() 广播事件,初始化完成
- 扫描得到 BeanDefinition
- 实例化 BeanFactoryPostProcessor
- 调用 BeanFactoryPostProcessor 的 postProcessBeanFactory
- 实例化 BeanPostProcessor
- 调用 InstantiationAwareBeanPostProcessor 的 postProcessBeforeInstantion() 该方法在目标对象实例化之前调用,如果返回不为null,则会替代目标对象,后续直接跳到16步
- 推断并执行Bean的构造器
- 调用 InstantiationAwareBeanPostProcessor 的 postProcessAfterInstantion() 如果返回false,后续直接跳到12步
- 获取属性 autowireByName / autowireByType
- 调用 InstantiationAwareBeanPostProcessor 的 postProcessProoertes() 处理注解
- 调用 InstantiationAwareBeanPostProcessor 的 postProcessProoertyValues() 处理 (弃用)
- 注入Bean的属性
- 调用 Aware接口方法 如 BeanNameAware BeanClassLoaderAware BeanFactoryAware
- 调用 BeanPostProcessor 的 postProcessBeforeInitialization()
- 调用 InitializingBean 的 afterPropertiesSet()
- 调用 Bean 的 init-method
- 调用 BeanPostProcessor 的 postProcessAfterInitialization()
- 调用 DiposibleBean 的 destroy()
- 调用 Bean 的 destroy-method
若只有一个构造函数,直接选用。
若多个构造函数且包含无参构造函数,那么选用无参构造函数。
若多个构造函数且不包含无参构造函数,那么抛异常。
若只有一个构造函数被 @Autowired 修饰,直接选用。
若多个构造函数被 @Autowired 修饰,且其中只要有一个 @Autowired 的 required = true,那么抛异常。
若多个构造函数被 @Autowired 修饰, 且 required = false 均成立,那么对这些构造函数进行排序。排序规则使用差异度算法,根据继承层级计算。