在北漂了几个月后,拿到了几个还行的offer,然后跑来了心心念念的杭州。讲实话,杭州各方面我还是比较有好感的,如果非要说一点不好的,那一定是“杭州太不尊重冬天了”(你品,你细品!!)

鄙人目前虽然是在摄像头大厂混吃混喝,但是面对她的主动邀请(同花顺在拉勾私信俺,相信很多人碰见过类似情况吧!这些公司简直是渣男行径啊,大面积撒网,小范围捕捞),出于尊重也就投递了简历约定了面试。先不说问了写啥吧,因为之前对她的情况了解一些,知道她的PHP是正式生的,Java的话是后娘养的。这个在跟面试官交流的时候也证实了,得知他们Java是刚成立的,有一个三年的Java做负责人,剩下的基本都是应届生了吧,所以我就呵呵了!!

这里主要有两个让我比较印象深的问题。一个自然是SpringBoot的启动过程,另一个是容器部署时需要配置哪些JVM参数,对JVM参数和优化了解多少。
在这里我们先聊一聊SpringBoot这个东东,另一个在下一篇分享。

我们知道SpringBoot是一个在使用,搭建优于SSM框架的流行框架。它的优势在于Spring starter解决bean之间的依赖和内置Tomcat。虽然用的是简便舒服,但是知其然,不知其所以然的感觉不是俺想要的哦!所以,下面从SpringBoot的@SpringBootApplication这个注解切入。首先我们来看看这个注解的作用是什么。

一 @SpringBootApplication的作用
@SpringBootApplication由以下三个注解组成:

  1. @SpringBootConfiguration
  2. EnableAutoConfiguration
  3. ComponentScan
  • @SpringBootConfiguration,让我们看看它里面有什么东东。

    原来@SpringBootConfiguration里面也就是个@Configuration,而@Configuration注解的作用是把一个Java类做成一个JavaConfig类,能够将其中的bean设置到IOC容器里面。@Configuration的用法如下:

    @Bean的作用是将方法的返回值作为实例注入到IOC容器里面,并在当前程序的上下文起作用,并且该实例的ID默认方法名。
    @SpringBootConfiguration的作用还有另外一个就是将当前启动类作为一个扩展类,当有额外配置时,直接@import即可。
  • @ComponentScan的作用是扫描@Component,@Service等组件,然后注入到IOC容器里。
  • @EnableAutoConfiguration是SpringBoot中最为重要的组件,其中重要之处在于AutoConfigurationImportSelector.class。

springboot 程序启动后马上结束 springboot启动做了什么_实例化


这里出现了Spring自带的工具:SpringFactoriesLoader,这个工具是去读“META-IN/spring.factories”下的文件,这个文件里都是配置类的全限定名。

springboot 程序启动后马上结束 springboot启动做了什么_spring boot_02


springboot 程序启动后马上结束 springboot启动做了什么_Java_03


springboot 程序启动后马上结束 springboot启动做了什么_实例化_04


在拿到类的全限定名之后通过反射的手段获取类的实例,然后注入到IOC容器中。

总结一下:@SpringBootApplication先通过@Configuration将启动类做成一个配置类,然后通过@EnableAutoConfiguration将spring.factories中的配置类注入到IOC容器中,再通过@Conponent扫描其他组件将其注入到IOC中。

二 SpringBoot的启动过程
SpringBoot启动后主要做的就是如下这些动作!

  • 当我们运行SpringBoot的main方法时,调用run()方法首先是实例化,实例化主要做三件事:
    (1)根据classpath判断是否启动一个webapplicationContext.
    (2)SpringFactoriesInstances加载classpath下所有可用的ApplicationContextInitializer.
    (3)SpringFactoriesInstances加载classpath下所有可用的ApplicationListener
  • springboot 程序启动后马上结束 springboot启动做了什么_面试_05


  • SpringApplication实例化完成后,调用run()方法,会调用SpringApplicationRunListeners,然后调用starting()方法,开启监听。
  • springboot 程序启动后马上结束 springboot启动做了什么_spring_06


  • 加载SpringBoot配置环境(ConfigurableEnvironment),如果是通过web容器发布,会加载StandardEnvironment,将配置环境加入到监听器对象中。
  • banner属性的设置

springboot 程序启动后马上结束 springboot启动做了什么_spring_07

  • ConfigurableApplicationContext应用配置上下文的创建,根据webEnvironment是否是web环境创建默认的contextclass,最后通过BeanUtils实例化上下文对象,并返回。

springboot 程序启动后马上结束 springboot启动做了什么_实例化_08

  • prepareContext()方法是将listeners,environment,applicationArguments,banner等组件与上下文关联。
  • springboot 程序启动后马上结束 springboot启动做了什么_面试_09


  • refreshContext()刷新上下文,IOC容器的最后一道工序。
  • springboot 程序启动后马上结束 springboot启动做了什么_spring_10

  • 最后还有一个是事件的发布,这就是最简单的启动流程了!