参考文章

一、什么是SpringBoot?

SpringBoot提供了一种快速使用Spring的方式,基于约定优于配置的思想,可以让开发人员不必在配置与逻辑业务之间进行思维的切换,全身心的投入到逻辑业务的代码编写中,从而大大提高了开发的效率。

二、SpringBoot有哪些功能?

1) 自动配置

Spring Boot的自动配置是一个运行时(更准确地说,是应用程序启动时)的过程,考虑了众多因素,才决定Spring配置应该用哪个,不该用哪个。该过程是SpringBoot自动完成的。

2) 起步依赖

起步依赖本质上是一个Maven项目对象模型(Project Object Model,POM),定义了对其他库的传递依赖,这些东西加在一起即支持某项功能。

简单的说,起步依赖就是将具备某种功能的坐标打包到一起,并提供一些默认的功能。

3) 辅助功能

提供了一些大型项目中常见的非功能性特性,如嵌入式服务器、安全、指标,健康检测、外部配置等。

注意:Spring Boot 并不是对 Spring 功能上的增强,而是提供了一种快速使用 Spring 的方式。

三、SpringBoot起步依赖原理?

springboot中添加的依赖不需要版本(版本的控制)

我们的工程继承了parent工程。parent的父工程spring-boot-dependencies,在这个工程中,定义了所有springboot使用的依赖的版本。

springboot不用自己添加依赖

基于maven的依赖传递,当前模块添加的依赖如果也有依赖,会自动的添加到当前模块。

在spring-boot-starter-parent中定义了各种技术的版本信息,组合了一套最优搭配的技术版本。
在各种starter中,定义了完成该功能需要的坐标合集,其中大部分版本信息来自于父工程。
我们的工程继承parent,引入starter后,通过依赖传递,就可以简单方便获得需要的jar包,并且不会存在版本冲突等问题。

四、SpringBoot自动配置的原理?

面试: springboot自动配置的原理

  1. 什么是自动配置?

    手动配置: 扫描,读取属性文件,定义bean

    自动配置:SpringBoot自动完成 包扫描,读取属性文件,定义bean

  2. springboot自动配置的原理

    能够自动配置,原因是我们在启动类上加了 @SpringBootApplication

    1. 自动扫描

      @ComponentScan: 包扫描

      spring boot应用,自动的扫描启动类所在的包,及其子包。

    2. 配置类

      读取属性文件,默认位置的配置文件。application.yml

      启动类自身就是一个默认的配置类。@SpringBootConfiguration

    3. spring boot怎么帮我们创建对象。【重点】扫描到系统模块中的配置类

      1. 如何知道自带的配置类在哪里?

        Import注解读取自动配置jar MATE-INF/spring.factories 文件中,配置的所有spring boot支持的自动配置类。

      2. 框架如何知道哪些对象该创建,哪些不该创建。

        Condition条件注解。只要在满足当前对象创建的条件下,才会自动创建。

      3. 框架自动创建对象的时候,如何得到我们配置的信息。DataSource

        添加依赖:

    SpringBoot常问面试题_监听器
    MATE-INF/spring.factories 中的配置类:
    SpringBoot常问面试题_监听器_02
    4. 在自动配置类中,加载属性文件的同名Properties配置类
    SpringBoot常问面试题_监听器_03
    5. 进入配置类

    SpringBoot常问面试题_初始化_04
    其实默认的配置一般就是最优的配置,基本上除了连接信息,不做修改。

自动化配置总结

1、@SpringBootApplication组合注解,包含三个注解

SpringBoot常问面试题_监听器_05

  • @SpringBootConfiguration是组合的注解是对@Configuration封装,也就是理解引导类其实也是一个配置类。

  • @ComponentScan是Spring注解作用是扫描包, 规则是 当前包及其子包所有的注解

2、@EnableAutoConfiguration 是实现SpringBoot自动化配置的注解,给我们内置了大量的约定配置。比如:Tomcat 端口8080, Redis localhost:6379

  • @AutoConfigurationPackage是自动化配置的包

  • @Import(AutoConfigurationImportSelector.class):初始化Bean并且存储到IOC容器中,但是并不是所有的Bean对象都会被实例化。我们需要根据@ConditionalOnXXX来去初始化。

    通过AutoConfigurationImportSelector 的getAutoConfigurationEntry 获取所有的自动化配置的全类名存到List集合中,等待被初始化。

SpringBoot常问面试题_监听器_06

3、以XXXAutoConfiigureation为例
SpringBoot常问面试题_初始化_07

  • 判断当前类是否生效,如果生效就开始实例化bean,找 @EnableConfigurationProperties(XXXProperties.class)里面的默认的配置数据。 获取成功之后就会去使用这些默认信息初始化Bean对象,存到IOC容器中。

五、spring boot应用启动的流程?执行的步骤,流程? 运行main方法之后,框架做了什么事?

  1. 初始化。创建SpringApplication对象。

    1. 判断当前的主类,main方法的类,并设置主类。
    2. 判断当前的应用是否是web应用。
    3. 获取初始化类、监听器类
      1. 读取配置文件 MATE-INF,classpath
      2. 获取初始化类,List集合
      3. 获取监听器类,List集合
  2. run方法。运行。

    1. 启动计时器

    2. 执行监听器(后续各个阶段,根据监听器的时机进行执行) 【重点】

    3. 准备环境 (加载我们自定义的属性配置,配置文件application.yml,虚拟机参数,命令行参数,profile)【重点】

    4. 打印spring boot图标。resource下粘贴自定义的banner.txt

    5. 创建context对象,并且通过自动配置实例化出所有的对象。【重点】

    6. 关闭计时器

    7. 执行runner,监听器