Spring Boot自动配置部分重点介绍了相关注解,关于main中调用的run方法并没有阐述过。run方法的作用是什么呢?只有注解没有main里的run方法Spring Boot工程就好比身体个方面机能都比较好除了大脑不工作的植物人;run方法指挥各项注解有序进行工作。

  下面分析Spring Boot中的run方法如何指挥工作:

SpringApplication() 构造方法

    

run的类型没有spring boot springboot的run方法执行了什么_run的类型没有spring boot

   2、run方法详解

    

run的类型没有spring boot springboot的run方法执行了什么_设计模式_02

  下面以Eureka服务启动为例,详述run方法每个关键动作都发挥了什么作用。调试Eureka服务端启动:

第一步:获取并启动监听器

       

run的类型没有spring boot springboot的run方法执行了什么_设计模式_03

EventPublishingRunListener监听器是Spring容器的启动监听器,listeners.starting()开启了监听事件。那么开启监听了哪类事件呢?通过源码具体可以分析出如下结果:    

run的类型没有spring boot springboot的run方法执行了什么_初始化_04

     多播ApplicationStartingEvent,同时使用Consumer函数式接口处理。

    第二步:构造应用上下文环境

    第三步:初始化应用上下文

      

run的类型没有spring boot springboot的run方法执行了什么_监听器_05

      根据应用类型创建一个AnnotationConfigServletWebServerApplicationContext容器:

      

run的类型没有spring boot springboot的run方法执行了什么_初始化_06

    第四步:刷新应用上下文前的准备阶段

      

run的类型没有spring boot springboot的run方法执行了什么_初始化_07

    第五步:刷新应用上下文

      

run的类型没有spring boot springboot的run方法执行了什么_监听器_08

      

run的类型没有spring boot springboot的run方法执行了什么_初始化_09

    其中

run的类型没有spring boot springboot的run方法执行了什么_初始化_10

,注解说明该onRefresh()的作用是在容器子类中初始化其他特别的bean,通过调试及控制台日志信息可以知道初始化了哪些特殊的bean:      

run的类型没有spring boot springboot的run方法执行了什么_初始化_11

    相关bean最终初始化在

run的类型没有spring boot springboot的run方法执行了什么_设计模式_12

完成。但此时Eureka服务并没有启动,refresh还差最后异步finishRefresh

    第六步:刷新应用上下文后的扩展接口

      

run的类型没有spring boot springboot的run方法执行了什么_设计模式_13

扩展接口,设计模式中的模板方法,默认为空实现。如果有自定义需求,可以重写该方法。比如打印一些启动结束log,或者一些其它后置处理。

 

run的类型没有spring boot springboot的run方法执行了什么_run的类型没有spring boot_14

 

 

 

 

未完,待续……