乐趣区

关于后端:Spring-Boot核心运行原理神秘的面纱

前言

你上次在超市或商场本人推开门是什么时候?大多数大型商店都装置了带感应性能的自动门,尽管所有门都能让你进入,但自动门不须要你入手推拉。与之相似,很多公共场所的卫生间里都装有主动感应水龙头。尽管没有超市自动门这么遍及,但这些设施同样对你没有太多要求,能够很不便地出水。我想这时候你脑海中也浮现出了有数的例子,证实设施让古代生存更加自动化和便捷,而不是简单和减少阻碍。

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

Spring Boot 利用

Spring Boot 初始化

咱们应用 IntelliJ IDEA 通过 Maven 初始化一个 Spring Boot 我的项目,创立实现后,你会看到一个相似下图的利用目录构造。

次要利用程序代码位于 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 的主动配置是一个运行时(更精确地说,是应用程序启动时)的过程,思考了泛滥因素,才决定 Spring 配置应该用哪个,不该用哪个。Spring Boot 主动配置性能运行过程中波及到的几个外围性能是:@EnableAutoConfiguration、spring factories、AutoConfiguration 类、@Conditional 及各种 Starters。咱们用一句话来形容整个过程:Spring Boot 通过 @EnableAutoConfiguration 注解开启主动配置,加载 spring.factories 中注册的各种 AutoConfiguration 类,当某个 AutoConfiguration 类满足其注解 @Conditional 指定的失效条件(Starters 提供的依赖、配置或 Spring 容器中是否存在某个 Bean 等)时,实例化该 AutoConfiguration 类中定义的 Bean(组件等),并注入 Spring 容器,就能够实现依赖框架的主动配置。如下图所示:

  • @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 主动配置,借此达成应用程序的一些指标,还有如何使用相似的技术来配置本人的应用程序组件。

最初的最初

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

退出移动版