Spring Framework 启动
2021-07-06 21:34:45 0 举报
Spring Framework 启动流程分析
作者其他创作
大纲/内容
⑦ preInstantiateSingletons()初始化剩下来的所有单实例 bean在这里会循环所有的 beanNames,挨个调用 getBean() 方法创建对象
obtainFreshBeanFactory()获取 beanFactory,在前面的步骤中已经初始化
refresh()容器刷新,Spring 中最核心的方法
register(annotatedClasses)注入传入的配置类,注意这里允许传入多个
invokeBeanFactoryPostProcessors(beanFactor)执行 BeanFactoryPostProcessor 方法
初始化
new AnnotationConfigApplicationContext()创建 Spring 容器
先注册实现了 PriorityOrdered 接口的 beanPostProcessor再注册实现了 Ordered 接口的 beanPostProcessor再注册常规的 beanPostProcessor最后注册 MergedBeanDefinitionPostProcessor 类型的 beanPostProcessor此时容器中默认会有 6 个内置的 beanPostProcessor(在无任何代理模式下)【ApplicationContextAwareProcessor】【ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor】【PostProcessorRegistrationDelegate$BeanPostProcessorChecker】【CommonAnnotationBeanPostProcessor】【AutowiredAnnotationBeanPostProcessor】【ApplicationListenerDetector】
GenericApplicationContext#<init>先执行父类初始化方法,实例化一个 DefaultListableBeanFactory 工厂
将之前步骤产生的 ApplicationListener 以及容器中的 ApplicationListener 保存到 applicationEventMulticaster 属性,然后进行事件派发
afterSingletonsInstantiated()如果 bean 是【SmartInitializingSingleton】类型,会回调 afterSingletonsInstantiated() 方法
ClassPathBeanDefinitionScanner#<init>实例化 ClassPathBeanDefinitionScanner 扫包器
② doRegisterBean()将配置类 【SpringConfig】注册到容器中,注意这里只是注册 BeanDefinition 信息,并非实例化
registerBeanPostProcessors(beanFactory)向容器中注册 bean 后置处理器
② prepareBeanFactory(beanFactory)预处理 beanFactory,向容器中添加一些组件
prepareRefresh()刷新前的预处理
postProcessBeanFactory(beanFactory)子类通过重写这个方法可以在 BeanFactory 创建并与准备完成以后做进一步的设置
判断容器中是否有名为 applicationEventMulticaster 的组件,如果有就从容器中取出来并且给 applicationEventMulticaster 赋值如果没有就创建一个 SimpleApplicationEventMulticaster 事件派发器
getBean()从工厂获取 bean,不存在会自动创建
⑤ initApplicationEventMulticaster()初始化事件派发器,在注册监听器时会用到
initMessageSource()初始化 MessageSource 组件:国际化、消息绑定与解析
this()通过 this() 调用无参构造方法
添加 bean 后置处理器(2个):【ApplicationContextAwareProcessor】、【ApplicationListenerDetector】添加可以解析的自动装配器,即在任何组件中都可以自动注入(4个):【BeanFactory】、【ResourceLoader】、【ApplicationEventPublisher】、【ApplicationContext】添加组件(3个):【environment -》ConfigurableEnvironment】、span style=\"font-size: inherit;\
AnnotationConfigApplicationContext#<init>调用构造方法,注意这里是有参的
AnnotatedBeanDefinitionReader#<init>实例化 BeanDefinitionReader 读取器
① AbstractApplicationContext.refresh()容器刷新
getLifecycleProcessor().onRefresh()拿到前面定义的生命周期处理器【LifecycleProcessor】回调 onRefresh() 方法
这里的 getBeanFactoryPostProcessors() 是指通过 AnnotationConfigApplicationContext.addBeanFactoryPostProcessor() 方法手动传入的,并非是被 Spring 管理的 BeanFactoryPostProcessor
③ invokeBeanFactoryPostProcessors()执行 BeanFactory 后置处理器
⑥ registerListeners()注册监听器,派发之前步骤产生的一些事件(可能没有)
⑧ finishRefresh()发布容器刷新完成事件
publishEvent(new ContextRefreshedEvent(this))发布容器刷新完成事件
refreshBeanFactory()刷新 beanFactory,设置序列化 ID
onRefresh()留给子容器(子类),子类重写这个方法,在容器刷新的时候可以自定义逻辑,web 场景下会使用
initLifecycleProcessor()初始化和生命周期有关的后置处理器
① registerAnnotationConfigProcessors()
getBeanFactory()返回之前初始化中创建的 beanFactory,即【DefaultListableBeanFactory】
④ registerBeanPostProcessors()按顺序注册 bean 后置处理器
向容器中添加 2 个 baanFactory 后置处理器:【ConfigurationClassPostProcessor】【EventListenerMethodProcessor】向容器中添加 2 个 bean 后置处理器:【AutowiredAnnotationBeanPostProcessor】【CommonAnnotationBeanPostProcessor】向容器中添加普通组件:【DefaultEventListenerFactory】
finishBeanFactoryInitialization(beanFactory)初始化所有的非单实例 bean
0 条评论
回复 删除
下一页