Spring Boot核心运行原理神秘的面纱!

前言

你上次在超市或商场自己推开门是什么时候?大多数大型商店都安装了带感应功能的自动门,虽然所有门都能让你进入,但自动门不需要你动手推拉。与之类似,很多公共场所的卫生间里都装有自动感应水龙头。虽然没有超市自动门这么普及,但这些设施同样对你没有太多要求,可以很方便地出水。我想这时候你脑海中也浮现出了无数的例子,证明设备让现代生活更加自动化和便捷,而不是复杂和增加障碍。

Spring Boot 基于“约定优于配置”的原则,将Spring开发的自动化程度提升到了一个新的高度。那么Spring Boot是如何约定,又是如何实现自动配置功能的呢?

Spring Boot应用

Spring Boot初始化

我们使用IntelliJ IDEA通过Maven初始化一个Spring Boot项目,创建完成后,你会看到一个类似下图的应用目录结构。
Spring Boot核心运行原理神秘的面纱!_第1张图片

主要应用程序代码位于src/main/java目录里,资源都在src/main/resources目录里。

  • pom.xml:Maven构建说明文件。
  • FsBaseApplication.java:应用程序的启动引导类(bootstrap class),也是主要的Spring配置类。
  • application.yml:用于配置应用程序和Spring Boot的属性。

Spring Boot启动类

我们在上篇文章讲述了4种初始化Spring Boot易用的方式,然而,不管用那种方式总会生成一个XXXApplication类,如下所示:

package com.fs;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

//开启组件扫描和自动配置
@SpringBootApplication
public class FsBaseApplication {
    //负责启动引导应用程序
    public static void main(String[] args) { SpringApplication.run(FsBaseApplication.class, args); }
}

@SpringBootApplication开启了Spring的组件扫描和Spring Boot的自动配置功能。实际上,@SpringBootApplication将三个有用的注解组合在了一起。

  • Spring的@Configuration:标明该类使用Spring基于Java的配置。
  • Spring的@ComponentScan:启用组件扫描,这样你写的Web控制器类和其他组件才能被自动发现并注册为Spring应用程序上下文里的Bean。本章稍后会写一个简单的Spring MVC控制器,使用@Controller进行注解,这样组件扫描才能找到它。
  • Spring Boot 的 @EnableAutoConfiguration :这个不起眼的小注解也可以称为@Abracadabra,就是这一行配置开启了Spring Boot自动配置的魔力,让你不用再写成篇的配置了。

在Spring Boot的早期版本中,你需要在FsBaseApplication类上同时标上这三个注解,但从Spring Boot 1.2.0开始,有@SpringBootApplication就行了。下图展示了@SpringBootApplication注解组合结构关系。

Spring Boot核心运行原理神秘的面纱!_第2张图片

自动配置的神秘面纱

Spring Boot的自动配置是一个运行时(更准确地说,是应用程序启动时)的过程,考虑了众多因素,才决定Spring配置应该用哪个,不该用哪个。Spring Boot自动配置功能运行过程中涉及到的几个核心功能是:@EnableAutoConfiguration、spring factories、AutoConfiguration类、@Conditional及各种Starters。我们用一句话来描述整个过程:Spring Boot通过@EnableAutoConfiguration注解开启自动配置,加载spring.factories中注册的各种AutoConfiguration类,当某个AutoConfiguration类满足其注解@Conditional指定的生效条件(Starters提供的依赖、配置或Spring容器中是否存在某个Bean等)时,实例化该AutoConfiguration类中定义的Bean(组件等),并注入Spring容器,就可以完成依赖框架的自动配置。如下图所示:

Spring Boot核心运行原理神秘的面纱!_第3张图片

  • @EnableAutoConfiguration:该注解由组合注解@SpringBootApplication引入,完成自动配置开启,扫描各个jar包下的spring.factories文件,并加载文件中注册的AutoConfiguration类等。
  • ·spring.factories:配置文件,位于jar包的META-INF目录下,按照指定格式注册了自动配置的AutoConfiguration类。spring.factories也可以包含其他类型待注册的类。该配置文件不仅存在于Spring Boot项目中,也可以存在于自定义的自动配置(或Starter)项目中。
  • ·AutoConfiguration类:自动配置类,代表了Spring Boot中一类以XXAutoConfiguration命名的自动配置类。其中定义了三方组件集成Spring所需初始化的Bean和条件。
  • ·@Conditional:条件注解及其衍生注解,在AutoConfiguration类上使用,当满足该条件注解时才会实例化AutoConfiguration类。
  • ·Starters:三方组件的依赖及配置,Spring Boot已经预置的组件。Spring Boot默认的Starters项目往往只包含了一个pom依赖的项目。如果是自定义的starter,该项目还需包含spring.factories文件、AutoConfiguration类和其他配置类。

总结

本文从初始化一个Spring Boot应用开始,一步一步走进Spring Boot的核心功能,带大家从总体上了解Spring Boot自动配置的原理以及自动配置核心组件的运作过程。只有掌握了这些基础的组建内容及其功能,我们在后续集成其他三方类库的自动配置时,才能够更加清晰地了解它们都运用了自动配置的哪些功能。虽然自动配置很方便,但在开发Spring应用程序时其中的一些用法也有点武断。要是你在配置Spring时希望或者需要有所不同,该怎么办?后续文章将会看到如何覆盖Spring Boot自动配置,借此达成应用程序的一些目标,还有如何运用类似的技术来配置自己的应用程序组件。

最后的最后

为初学者提供学习指南,为从业者提供参考价值。我坚信码农也具有产生洞见的能力。扫描下图二维码关注,学习和交流!

你可能感兴趣的:(Spring Boot核心运行原理神秘的面纱!)