Spring Java 核心技术Spring

Spring源码启动过程以及拓展点

2022-04-11  本文已影响0人  蓝梅

容器启动过程

  1. 第一步先调用this();构造方法,这时父类构造器会初始化容器的 beanFactory 属性,属性为DefaultListableBeanFactory,带有存储BeanDefinition 和单例 bean 的功能
  1. 容器调用register(componentClasses);把启动类注册成BeanDefinition放入到容器中
  2. 启动Spring,调用 refresh() 方法去刷新容器
  3. prepareRefresh() 准备刷新方法,没有做什么重要的事情,主要是设置了下容器的启动状态
  4. 调用obtainFreshBeanFactory();获取到容器的工厂,DefaultListableBeanFactory
  5. 调用prepareBeanFactory(beanFactory)
  1. 调用postProcessBeanFactory(beanFactory);留给子类来设置BeanFactory
  2. 调用invokeBeanFactoryPostProcessors(beanFactory) 方法
  1. 调用registerBeanPostProcessors(beanFactory);注册Bean的后置处理器到容器中
  1. 调用 initMessageSource(); 初始化国际化 ,一般是DelegatingMessageSource对象
  2. 调用 initApplicationEventMulticaster(); 设置容器的事件多播器为 SimpleApplicationEventMulticaster
  3. 调用 onRefresh(); 方法,Springboot 就是调用这个方法来启动tomcat容器的
  4. 调用registerListeners();注册事件监听器到容器中,并且如果有早期事件类型,则在容器事件广播器未生成好之前发布事件
  5. 调用 finishBeanFactoryInitialization(beanFactory); 实例化非懒加载的 Bean
  1. 最后调用 finishRefresh(),发布容器 publishEvent(new ContextRefreshedEvent(this)); 刷新完成事件

Spring所有拓展点以及顺序

  1. 实现了 BeanDefinitionRegistryPostProcessor 接口的类,调用 postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) 方法,可以获取到Bean定义的注册器,去注册BeanDefinition,调用会按照先调用实现了 PriorityOrdered 接口 再调用 Ordered 接口 最后再调用没有实现 PriorityOrdered 接口 、 Ordered 接口 的 BeanDefinitionRegistryPostProcessor 类
  2. 实现了 BeanFactoryPostProcessor 接口的类,调用 postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) 方法,可以获取到Bean定义的注册器,去注册BeanDefinition,调用会优先调用实现了BeanDefinitionRegistryPostProcessor 接口的类的 postProcessBeanFactory方法,再按照先调用实现了 PriorityOrdered 接口 再调用 Ordered 接口 最后再调用没有实现 PriorityOrdered 接口 、 Ordered 接口 的 BeanDefinitionRegistryPostProcessor 类
  3. 实现了 InstantiationAwareBeanPostProcessor 接口的类,调用 postProcessBeforeInstantiation(Class<?> beanClass, String beanName) 方法,这个方法可以直接自己初始化出来Bean
  4. 实现了 MergedBeanDefinitionPostProcessor 接口的类,调用 postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName) 方法;这个时候Bean已经初始化了,但是属性还没有注入;AutowiredAnnotationBeanPostProcessor 的 postProcessMergedBeanDefinition 找到所有的 @Autowired或者@Value 注解的方法或属性,为后续IOC,依赖注入做准备
  5. 实现了EnvironmentAware、EmbeddedValueResolverAware、ResourceLoaderAware、ApplicationEventPublisherAware、MessageSourceAware、ApplicationContextAware、ApplicationStartupAware的类,会在这一步注入相关环境变量属性
  6. 实现了 BeanPostProcessor 接口的类,调用 postProcessBeforeInitialization(Object bean, String beanName) 方法,这一步Bean已经实例化了,并且属性已经注入了,也可以通过这个拓展来修改对象
  7. 实现了 InitializingBean 接口的Bean,会调用对象的 afterSingletonsInstantiated() 方法。一般作为对象初始化完成调用的拓展点
  8. 实现了 BeanPostProcessor 接口的类,调用 postProcessAfterInitialization(Object bean, String beanName) 方法,这一步Bean已经实例化了,并且属性已经注入了,也可以通过这个拓展来修改对象
  9. 调用实现了 SmartInitializingSingleton 接口类的 afterSingletonsInstantiated() 方法;这个时候所有的Bean已经实例化完成,后续加入的Bean不会受Bean工厂的后置处理器影响
  10. 监听Spring容器启动事件 ContextRefreshedEvent
上一篇下一篇

猜你喜欢

热点阅读