Spring启动流程
按Bean状态描述:
- 创建Bean工厂
- 对Bean工厂后置处理
- 通过@Component和@Import扫描BeanDefinition,加入到Bean工厂
- 注册Bean后置处理器,用于拦截Bean创建
- 实例化
- 填充属性
- 初始化
- 调用aware方法
- BeanPostProcessor实例化前执行
- 调用初始化方法
- BeanPostProcessor实例化后执行
- 将Bean放到Bean工厂里
按方法描述:
准备阶段:
- this()
- 调用父类构造方法,获取Bean工厂,默认DefaultListableBeanFactory
- 注册5个内置BeanDefinition
- 设置哪些类生成的对象可以被Spring托管,默认是被@Component标记的类
- 判断被Conditional注解标记的类能否被Spring托管
- register(componentClasses) 注册componentClasses的BeanDefinition
刷新阶段refresh():
- prepareRefresh 准备上下文
- obtainFreshBeanFactory 获取Bean工厂
- prepareBeanFactory Bean工厂初始化
- postProcessBeanFactory 后置处理Bean工厂,空方法,扩展点
- invokeBeanFactoryPostProcessors 执行BeanFactory的后置处理器。在这里
- 扫描@Component那些BeanDefinition
- 执行@Import的逻辑
- registerBeanPostProcessors 注册Bean的后置处理器,用于拦截Bean的创建
- initMessageSource 初始化消息源
- initApplicationEventMulticaster 初始化事件派发器,用来发布事件
- onRefresh 用来初始化一些特殊的Bean,目前默认是空方法,未实现
- registerListeners 注册监听器
- finishBeanFactoryInitialization 初始化所有剩余的单实例Bean(没有使用懒加载的Bean).整个Spring IOC的核心
- finishRefresh 发布事件