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: 1,390 · Posted: 2021-12-16
————        END        ————
Give me a Star, Thanks:)
https://github.com/fendoudebb/LiteNote扫描下方二维码关注公众号和小程序↓↓↓
Loading...