开头导语由Chatgpt完成
当今互联网行业中,Java后端开发岗位的竞争异常激烈,对于面试者来说,掌握一些技巧和知识点将有助于脱颖而出。而对于SpringBoot框架的使用和运行机制,更是Java后端开发岗位中不可或缺的技能点之一。在SpringBoot中,主启动类是整个应用程序的入口,其run方法的启动流程是每个面试官都会问到的问题。本文将为大家介绍SpringBoot中主启动类的run方法启动流程,帮助读者在面试中掌握这一必杀技——泰山陨石坠。
其中run方法中一共有六个子方法
- 😄1.获取监听器
- 😆2.构建应用上下文环境
- 😊3.初始化应用上下文
- 😃4.交给spring前的准备工作
- 我来鹅城只做两件事
- 😏5.将应用上下文交给spring,使其初始化bean
- 😍6.刷新应用上下文之后的操作
😄1.获取监听器
事件机制在Spring是很重要的一部分内容,通过事件机制我们可以监听Spring容器中正在发生的一些事件,同样也可以自定义监听事件。Spring的事件为Bean和Bean之间的消息传递提供支持。当一个对处理完某种任务后,通过另外的对象进行某些处理,常用的场景有进行某些操作后发送通知,消息、邮件等情况。
拿到spring.factories文件中key为org.springframework.boot.SpringApplicationRunListener
的value值
例如:org.springframework.boot.context.event.EventPublishingRunListener
反射拿到实例对象
启动监听器
😆2.构建应用上下文环境
这一步的目的就是将系统所有的变量值加入到环境中方便springboot之后调用
其中有jvm的值
有电脑的环境变量
有配置文件里面的值
😊3.初始化应用上下文
这一步创建了应用上下文也创建了ioc容器org.springframework.beans.factory.support.DefaultListableBeanFactory
😃4.交给spring前的准备工作
我来鹅城只做两件事
第一件事,完成属性的赋值,将环境变量赋值给应用上下文
第二件事,完成启动类bean的创建
可以看到执行prepareContext方法之后启动类已经在ioc容器中了
😏5.将应用上下文交给spring,使其初始化bean
到这里就是spring要完成的事情了
这个方法就是springboot能完成自动装配的核心方法,能够使得启动类上面的注解生效。
invokeBeanFactoryPostProcessors()方法就是这里面最重要的一个方法
postProcessBeanDefinitionRegistry()方法
processConfigBeanDefinitions()方法
处理@Configuration注解的相关逻辑
parse()方法
doProcessConfigurationClass方法
这里就是使得启动类注解生效的地方!
解析@ComponentScan
又进入parse方法
注意,这里就是springboot为什么会扫描启动类所在包目录下所有的bean的核心方法
因为我们的启动类注解没有配置basepackages
所以获取的值为空
所有默认为启动类所在包目录!
doscan方法将testcontroller注册到ioc中
解析@Import
org.springframework.context.annotation.ConfigurationClassParser#processImports
getimport获取import值
拿到了这两个类下面我们要去调用这两个类里面的方法
在this.deferredImportSelectorHandler.process()
中去执行这两个类(自动配置入口)
processGroupImports方法
getImports方法
会执行内部类里面的process方法
getAutoConfigurationEntry方法
又回到了springboot自动装配的地方,建议结合上一篇内容查看
【SpringBoot】面试组合技-天羽屠龙舞,SpringBootApplication注解的作用是什么?SpringBoot怎么实现自动装配的?
org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader#loadBeanDefinitions
真正注册到ioc中还是this.reader.loadBeanDefinitions(configClasses)方法
这个时候我们看ioc中只有8个对象
执行完成就变成了125个对象了
这个时候已经初始化完成了,invokeBeanFactoryPostProcessors方法使命完成
接下来就等finishBeanFactoryInitialization方法实例化bean对象到一级缓存当中去,建议配合上一篇博客spring源码观看
面试组合技-月色血风暴,什么是Spring中的循环依赖?怎么解决循环依赖?
😍6.刷新应用上下文之后的操作
空实现,模板方法,供我们自己重写
chatgpt完成总结语
在这篇博客中,我们详细介绍了SpringBoot中主启动类的run方法启动流程,通过对整个启动过程的深入分析,读者可以更加清晰地了解SpringBoot的工作原理和应用场景。帮助读者更好地掌握这一必杀技,以应对日益激烈的Java后端开发岗位竞争。
总的来说,SpringBoot是一个非常强大的框架,它为Java后端开发带来了许多便利和效率提升。学习SpringBoot的过程可能会有一些困难和挑战,但只要我们勇于面对和克服,就一定能够在这个领域中获得成功。希望这篇博客对读者有所帮助,让你在学习SpringBoot的路上更加顺畅和愉快!