1、说说你对Spring Boot的理解

从本质上来说,Spring Boot 就是 Spring,它做了那些没有它你自己也会去做的 Spring Bean 配置。Spring Boot使用“习惯优于配置”的理念让你的项目快速地运行起来,使用 Spring Boot 很容易创建一个能独立运行、准生产级别、基于 Spring 框架的项目,使用 Spring Boot 你可以不用或者只需要很少的 Spring 配置。
简而言之,Spring Boot本身并不提供Spring的核心功能,而是作为Spring的脚手架框架,以达到快速构建项目、预置三方配置、开箱即用的目的。Spring Boot有如下的优点

  • 可以快速构建项目;
  • 可以对主流开发框架的无配置集成;
  • 项目可独立运行,无需外部依赖Servlet容器;
  • 提供运行时的应用监控;
  • 可以极大地提高开发、部署效率;
  • 可以与云计算天然集成。

    2、Spring Boot Starter有什么用?

    Spring Boot通过提供众多起步依赖(Starter)降低项目依赖的复杂度。起步依赖本质上是一个Maven项目对象模型(Project Object Model, POM),定义了对其他库的传递依赖,这些东西加在一起即支持某项功能。很多起步依赖的命名都暗示了它们提供的某种或某类功能。
    举例来说,你打算把这个阅读列表应用程序做成一个Web应用程序。与其向项目的构建文件里添加一堆单独的库依赖,还不如声明这是一个Web应用程序来得简单。你只要添加Spring Boot的Web起步依赖就好了。

    3、介绍Spring Boot的启动流程

    首先,Spring Boot项目创建完成会默认生成一个名为 *Application 的入口类,我们是通过该类的 main 方法启动Spring Boot项目的。在main方法中,通过SpringApplication的静态方法,即run方法进行SpringApplication类的实例化操作,然后再针对实例化对象调用另外一个run方法来完成整个项目的初始化和启动。
    SpringApplication调用的run方法的大致流程,如下图:
    image.png
    当然,除了上述核心操作,run方法运行过程中还涉及启动时长统计、异常报告、启动日志、异常处理等辅助操作。比较完整的流程,可以参考如下源代码:

    1. public ConfigurableApplicationContext run(String... args) {
    2. // 创建StopWatch对象,用于统计run方法启动时长。
    3. StopWatch stopWatch = new StopWatch();
    4. // 启动统计
    5. stopWatch.start();
    6. ConfigurableApplicationContext context = null;
    7. Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList<>();
    8. // 配置Headless属性
    9. configureHeadlessProperty();
    10. // 获得SpringApplicationRunListener数组,
    11. // 该数组封装于SpringApplicationRunListeners对象的listeners中。
    12. SpringApplicationRunListeners listeners = getRunListeners(args);
    13. // 启动监听,遍历SpringApplicationRunListener数组每个元素,并执行。
    14. listeners.starting();
    15. try {
    16. // 创建ApplicationArguments对象
    17. ApplicationArguments applicationArguments =
    18. new DefaultApplicationArguments(args);
    19. // 加载属性配置,包括所有的配置属性。
    20. ConfigurableEnvironment environment =
    21. prepareEnvironment(listeners, applicationArguments);
    22. configureIgnoreBeanInfo(environment);
    23. // 打印Banner
    24. Banner printedBanner = printBanner(environment);
    25. // 创建容器
    26. context = createApplicationContext();
    27. // 异常报告器
    28. exceptionReporters = getSpringFactoriesInstances(
    29. SpringBootExceptionReporter.class,
    30. new Class[] { ConfigurableApplicationContext.class }, context);
    31. // 准备容器,组件对象之间进行关联。
    32. prepareContext(context, environment,
    33. listeners, applicationArguments, printedBanner);
    34. // 初始化容器
    35. refreshContext(context);
    36. // 初始化操作之后执行,默认实现为空。
    37. afterRefresh(context, applicationArguments);
    38. // 停止时长统计
    39. stopWatch.stop();
    40. // 打印启动日志
    41. if (this.logStartupInfo) {
    42. new StartupInfoLogger(this.mainApplicationClass)
    43. .logStarted(getApplicationLog(), stopWatch);
    44. }
    45. // 通知监听器:容器完成启动。
    46. listeners.started(context);
    47. // 调用ApplicationRunner和CommandLineRunner的运行方法。
    48. callRunners(context, applicationArguments);
    49. } catch (Throwable ex) {
    50. // 异常处理
    51. handleRunFailure(context, ex, exceptionReporters, listeners);
    52. throw new IllegalStateException(ex);
    53. }
    54. try {
    55. // 通知监听器:容器正在运行。
    56. listeners.running(context);
    57. } catch (Throwable ex) {
    58. // 异常处理
    59. handleRunFailure(context, ex, exceptionReporters, null);
    60. throw new IllegalStateException(ex);
    61. }
    62. return context;
    63. }

    4、Spring Boot项目是如何导入包的?

    通过Spring Boot Starter导入包。
    Spring Boot通过提供众多起步依赖(Starter)降低项目依赖的复杂度。起步依赖本质上是一个Maven项目对象模型(Project Object Model, POM),定义了对其他库的传递依赖,这些东西加在一起即支持某项功能。很多起步依赖的命名都暗示了它们提供的某种或某类功能。
    举例来说,你打算把这个阅读列表应用程序做成一个Web应用程序。与其向项目的构建文件里添加一堆单独的库依赖,还不如声明这是一个Web应用程序来得简单。你只要添加Spring Boot的Web起步依赖就好了。

    5、请描述Spring Boot自动装配的过程

    image.png
    整个自动装配的过程是

  1. Spring Boot 通过 @EnableAutoConfiguration 注解开启自动配置;
  2. 加载 spring.factories 中注册的各种 AutoConfiguration 类,当某个 AutoConfiguration 类满足其注解 @Conditional 指定的生效条件(Starters提供的依赖、配置或Spring容器中是否存在某个Bean等)时,实例化该 AutoConfiguration 类中定义的Bean(组件等),并注入Spring容器,就可以完成依赖框架的自动配置。

    6、说说你对Spring Boot注解的了解

    @SpringBootApplication注解:
    在Spring Boot入口类中,唯一的一个注解就是@SpringBootApplication。它是Spring Boot项目的核心注解,用于开启自动配置,准确说是通过该注解内组合的@EnableAutoConfiguration开启了自动配置。

@EnableAutoConfiguration注解:
@EnableAutoConfiguration 的主要功能是启动 Spring 应用程序上下文时进行自动配置,它会尝试猜测并配置项目可能需要的Bean。自动配置通常是基于项目 classpath 中引入的类和已定义的Bean来实现的。在此过程中,被自动配置的组件来自项目自身和项目依赖的 jar 包中。

@Import注解:
@EnableAutoConfiguration的关键功能是通过@Import注解导入的ImportSelector来完成的。从源代码得知@Import(AutoConfigurationImportSelector.class)是@EnableAutoConfiguration注解的组成部分,也是自动配置功能的核心实现者。
image.png