• SpringBoot启动流程简介


    一、Application启动类中main方法启动

    1. @SpringBootApplication(scanBasePackages = {"com.springboot.lean"})
    2. public class Application {
    3. public static void main(String[] args) {
    4. SpringApplication.run(Application.class, args);
    5. }
    6. }

    1.1 @SpringBootApplication注解

    1.2 SpringApplication.run方法

    主要做两件事,首先根据默认设置和用户提供的参数创建一个新的SpringApplication实例

    1. private void initialize(Object[] sources) {
    2. if (sources != null && sources.length > 0) {
    3. this.sources.addAll(Arrays.asList(sources));
    4. }
    5. this.webEnvironment = deduceWebEnvironment();
    6. setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));
    7. setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
    8. this.mainApplicationClass = deduceMainApplicationClass();
    9. }

    然后调用真正的run方法,启动Spring application,并创建及刷新ApplicationContext

    1. public ConfigurableApplicationContext run(String... args) {
    2. //计数器,用于计算并打印容器启动时长
    3. StopWatch stopWatch = new StopWatch();
    4. stopWatch.start();
    5. ConfigurableApplicationContext context = null;
    6. FailureAnalyzers analyzers = null;
    7. //设置java.awt.headless属性,java.awt.headless是J2SE的一种模式,
    8. //用于在缺失显示屏、鼠标或者键盘时的系统配置。对于后端服务来讲,很多都是需要将这个属性设置为true的
    9. configureHeadlessProperty();
    10. //调用getSpringFactoriesInstances从META-INF/spring.factories方法中获取并创建所有的SpringApplicationRunListener,
    11. //底层实际会调用SpringFactoriesLoader.loadFactoryNames(type, classLoader)
    12. SpringApplicationRunListeners listeners = getRunListeners(args);
    13. //启动监听器,例如EventPublishingRunListener
    14. listeners.starting();
    15. try {
    16. //根据用户自定义参数构建应用参数
    17. ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
    18. //首先创建或配置一个ConfigurableEnvironment实例,然后将应用参数设置进环境对象中
    19. ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments);
    20. //打印启动图形,图形文件默认在META-INF下的banner.txt文件中,关键类为SpringApplicationBannerPrinter
    21. Banner printedBanner = printBanner(environment);
    22. //创建application上下文,根据webEnvironment判断是加载AnnotationConfigApplicationContext类实例还是
    23. //AnnotationConfigEmbeddedWebApplicationContext类实例,这两个对象都会注册所有相关的注解后处理器
    24. //例如@Configuration,@Autowired
    25. context = createApplicationContext();
    26. //创建失败分析器实例
    27. analyzers = new FailureAnalyzers(context);
    28. prepareContext(context, environment, listeners, applicationArguments, printedBanner);
    29. //调用AbstractApplicationContext.refresh方法,进入spring启动流程
    30. refreshContext(context);
    31. //在容器启动刷新后做些事情,模板方法,用于自定义扩展实现
    32. afterRefresh(context, applicationArguments);
    33. //监听器发布容器启动完成事件
    34. listeners.finished(context, null);
    35. stopWatch.stop();
    36. if (this.logStartupInfo) {
    37. //打印容器启动时长
    38. new StartupInfoLogger(this.mainApplicationClass).logStarted(getApplicationLog(), stopWatch);
    39. }
    40. return context;
    41. }
    42. catch (Throwable ex) {
    43. //解析容器加载失败信息,并打印堆栈错误日志
    44. handleRunFailure(context, listeners, analyzers, ex);
    45. throw new IllegalStateException(ex);
    46. }
    47. }
  • 相关阅读:
    boltdb 原理
    大数据分析(Python)学习笔记1(python基础快速过)
    Android JNI代码语法解释
    华为云云耀云服务器L实例评测|使用宝塔10分钟部署一个围猫猫小游戏
    Flutter macOS开发教程之 界面布局与UI组件源码(教程含源码)
    DID的使用指南,原理
    零拷贝技术:减少数据复制和上下文切换,提高网络传输效率(下)
    未来会是一个编程普及的时代吗?
    基于centos7安装多实例mysql8.0完整版(超级详细)
    【3. MySQL日志】
  • 原文地址:https://blog.csdn.net/weixin_42189550/article/details/134252802