六游的博客小站
SpringBoot自动配置与依赖详解
发布于: 2019-04-14 更新于: 2019-04-14 阅读次数: 

第一次使用SpringBoot,便为塔强大的自动配置而惊叹,开箱即用这样的特性对入门者实在是太友好了,通过官方的启动器生成的maven工程,pom文件中只有寥寥几行,这样用起来的确是比传统的Spring要轻松不少,但是每每通过项目的主入口类来启动整个项目的时候,心里面总不免产生这样的疑问:如此多的配置与依赖,SpringBoot是怎么样做到帮我们自动配置的呢?

一、SpringBoot的依赖管理

1.父项目

进入到一个SpringBoot的项目的pom文件里,首先会看到的就是一对标签,这表明开头引入了一个父项目

1
2
3
4
5
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
</parent>

我们点进这个父项目,会发现该项目的开头又有一个名为spring-boot-dependencies父项目,我们再点进去,会发现,在这个父项目中定义了大量的版本。因此我们明白了,这里就是SpringBoot的版本仲裁中心,我们在引入一些比较常见的依赖时,并不需要关心版本与兼容的问题,因为SringBoot官方已经帮我们定义好了所有常用依赖的版本号。

1.png

2.场景启动器

在pom文件中在往下看,我们又会发现这么一个依赖

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

这里之所以会出现这个依赖,是因为我们在官方的SpringBoos项目生成器里面,勾选了web这个选项,spring-boot-starter-web就是一个web项目的场景启动器,这个启动器中帮我们导入了web模块正常运行所需要的组件。

SpringBoot将所有的场景都抽取出来,做成了一个个的starter(启动器),当我们需要用什么功能的时候,只需要将该功能相关的场景启动器导入就可以了。

二、SpringBoot的自动配置

要想了解SpringBoot的自动配置,我们首先需要关注的是,SpringBoot的主入口类,因为项目都是靠这个类来启动的。

1
2
3
4
5
6
7
8
@SpringBootApplication
public class MyApplication {

public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}

}

这个主入口类仅有这么寥寥几行,却帮我们完成了如此复杂的自动配置,我们眼睛一扫,发现了一个陌生的注解SpringBootApplication,而且其中还包含了SpringBoot这个单词,八成就是它了。没错 ,就是它帮我们完成的自动配置,我们点进这个注解会发现这其实是一个混合注解,我们主要关注 @EnableAutoConfiguration 这个注解,从字面意思上理解就是启用自动配置的意思。点进这个注解,发现里面有AutoConfigurationPackage与Import这两个注解

  1. AutoConfigurationPackage这个注解帮我做的是,获取主入口类所在的包的路径,并将该包下以及所有子包下的所有组件扫描进容器
  1. Import这个注解帮我们做的是,找到Spring下的一个spring.factories文件,这个文件中记录了所有配置类的全类名,然后从中挑选出我们需要用到的配置类的累名,并根据类名将相应的配置类导入到我们的容器中去。其中,我们提到的配置类,其实是Spring官方提前帮我们写好的一些默认的我们都习惯用的配置,他们用了习惯大于配置的思想,帮我们实现了完全零配置启动一个Spring项目的功能。
--- 本文结束 The End ---