01. Spring Framework 启动流程
2022-02-26 09:49:20 0 举报
AI智能生成
Spring 容器启动流程
作者其他创作
大纲/内容
this()<br>通过 this() 调用无参构造方法<br>
GenericApplicationContext#<init><br>先调用父类的构造方法初始化 beanFactory,实例类型是 DefaultListableBeanFactory<br>
this.reader = new AnnotatedBeanDefinitionReader(this)<br>初始化 reader<br>
getOrCreateEnvironment(registry)<br>创建 StandardEnvironment
AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry)<br>向 beanDefinitionMap 属性添加一些初始化组件
this.scanner = new ClassPathBeanDefinitionScanner(this)<br>初始化 scanner,配置扫描策略<br>
register(annotatedClasses)<br>注册传入的配置类,这里允许传入多个<br>
doRegisterBean()<div>向 beanDefinitionMap 属性添加配置类 [SpringConfig]</div>
refresh()<br>Spring 容器刷新流程
prepareRefresh()<br><div>刷新前的预处理,如记录启动时间</div>
obtainFreshBeanFactory()<br>获取 beanFactory,在前面的步骤中已经初始化<br>
prepareBeanFactory(beanFactory)<br><div>预处理 beanFactory,向容器中添加一些组件</div>
postProcessBeanFactory(beanFactory)<br>子类通过重写这个方法可以在 BeanFactory 创建并与准备完成以后做进一步的设置<br>Spring 容器无实现,但 Spring web 容器有实现
invokeBeanFactoryPostProcessors(beanFactory)<br>执行 BeanFactoryPostProcessor 处理器<br>
getBeanFactoryPostProcessors()<br>获取用户自定义的 BeanFactoryPostProcessor
invokeBeanFactoryPostProcessors()<div></div><div>执行 BeanFactory 后置处理器</div>
registerBeanPostProcessors(beanFactory)<div>向容器中注册 bean 后置处理器</div>
initMessageSource()<div><span style="font-size: inherit;">初始化 MessageSource 组件:国际化、消息绑定与解析</span></div>
<div>initApplicationEventMulticaster()</div><div>初始化事件派发器,在注册监听器时会用到</div>
onRefresh()<div>留给子容器,子类重写这个方法,在容器刷新的时候可以自定义逻辑,web 场景下会使用</div>
<div>registerListeners()</div><div>注册监听器,派发之前步骤产生的一些事件(可能没有)</div>
<div>finishBeanFactoryInitialization(beanFactory)</div><div>初始化所有的非单实例 bean</div>
<div>preInstantiateSingletons()</div><div>初始化剩下来的所有单实例 bean</div><div>在这里会循环所有的 beanNames,挨个调用 getBean() 方法创建对象<br></div>
<div>getBean(beanName)</div><div>根据 beanName 从工厂获取 bean,不存在会自动创建</div>
<div>afterSingletonsInstantiated()</div><div>如果 bean 是【SmartInitializingSingleton】类型,会回调这个方法</div>
<div>finishRefresh()</div><div>发布容器刷新完成事件</div>
<div>initLifecycleProcessor()</div><div>初始化和生命周期有关的后置处理器</div>
<div>getLifecycleProcessor().onRefresh()</div><div>拿到前面定义的生命周期处理器【LifecycleProcessor】回调 onRefresh() 方法</div>
<div>publishEvent(new ContextRefreshedEvent(this))</div><div>发布容器刷新完成事件</div>
0 条评论
下一页