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