Spring 创建 IOC 容器步骤

Spring 面试 About 2,185 words

代码

AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
applicationContext.register(MainConfig.class);
applicationContext.refresh();

第一步

执行ApplicationContext构造。

  • 先初始化父类GenericApplicationContext的构造
    • 创建DefaultListableBeanFactory默认的BeanFactory
  • 创建AnnotatedBeanDefinitionReader对象。
    • 初始化Condition计算者类,shouldSkip()用于判断@Condition标注的类是否跳过加载。
    • 注册ConfigurationClassPostProcessor等后置处理器到BeanDefiniationMap中。
  • 创建ClassPathBeanDefinitionScanner对象。
    • 将添加@Component添加到includeFilters包含过滤器中,isCandidateComponent用于判断是否是候选组件。

第二步

注册自定义的配置类MainConfig

  • MainConfig类的BeanDefiniation信息加入到BeanDefiniationMap中。

第三步

将容器刷新,调用的是AnnotationConfigApplicationContext父类GenericApplicationContext的父类AbstractApplicationContext的方法。

此方法又分为:

  • prepareRefresh():预刷新步骤只做一些记录开始、校验环境、初始化监听器容器等操作。
  • ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory():设置BeanFactoryid,返回ConfigurableListableBeanFactory类型的BeanFactory
  • prepareBeanFactory(beanFactory):给BeanFactory添加监听器BeanPostProcessor、注册ResolvableDependency可解析的依赖。
  • postProcessBeanFactory(beanFactory)BeanFactory后置处理。交由需要的子类复写。(AnnotationConfigApplicationContext没有复写)
  • invokeBeanFactoryPostProcessors(beanFactory):调用第一步中添加的ConfigurationClassPostProcessor(同时也是调用beanFactory.getBean()获得ConfigurationClassPostProcessor),会解析MainConfig标注的@ComponentScan注解,解析包路径中的组件并加入到BeanDefiniationMap中。并且创建自定义的后置处理器示例且注册到BeanPostProcessorsConfigurationClassPostProcessor实现了BeanDefinitionRegistryPostProcessor接口,而BeanDefinitionRegistryPostProcessor又继承自BeanFactoryPostProcessor
  • registerBeanPostProcessors(beanFactory):注册用户自定义的BeanFactoryPostProcessors并添加到BeanDefiniationMap中。
  • initMessageSource():初始化国际化资源处理器。默认没有信息资源,所以创建了DelegatingMessageSource空的信息资源,直接添加到单例Map中。
  • initApplicationEventMulticaster():初始化应用事件派发器。默认没有派发器,所以创建了SimpleApplicationEventMulticaster,直接添加到单例Map中。
  • onRefresh():交由需要的子类复写。(AnnotationConfigApplicationContext没有复写)
  • registerListeners():注册监听器。用户自定义的实现了ApplicationListener的组件名添加到事件派发器集合中。
  • finishBeanFactoryInitialization(beanFactory):实例化所有单例对象,完成后统一遍历实现了SmartInitializingSingleton接口的类,调用afterSingletonsInstantiated()通知单例bean完成初始化
  • finishRefresh():完成refresh操作,清理资源,发送ContextRefreshedEvent事件。
  • resetCommonCaches():清理反射、注解等缓存。
Views: 1,465 · Posted: 2021-12-16

————        END        ————

Give me a Star, Thanks:)

https://github.com/fendoudebb/LiteNote

扫描下方二维码关注公众号和小程序↓↓↓

扫描下方二维码关注公众号和小程序↓↓↓


Today On History
Browsing Refresh