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():设置BeanFactory的id,返回ConfigurableListableBeanFactory类型的BeanFactory。prepareBeanFactory(beanFactory):给BeanFactory添加监听器BeanPostProcessor、注册ResolvableDependency可解析的依赖。postProcessBeanFactory(beanFactory):BeanFactory后置处理。交由需要的子类复写。(AnnotationConfigApplicationContext没有复写)invokeBeanFactoryPostProcessors(beanFactory):调用第一步中添加的ConfigurationClassPostProcessor(同时也是调用beanFactory.getBean()获得ConfigurationClassPostProcessor),会解析MainConfig标注的@ComponentScan注解,解析包路径中的组件并加入到BeanDefiniationMap中。并且创建自定义的后置处理器示例且注册到BeanPostProcessors(ConfigurationClassPostProcessor实现了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: 2,026 · Posted: 2021-12-16
————        END        ————
Give me a Star, Thanks:)
https://github.com/fendoudebb/LiteNote扫描下方二维码关注公众号和小程序↓↓↓
Loading...