SpringBoot 的依赖管理和自动配置特性

224 阅读4分钟

记得刚刚开始学 SpringBoot 那时,我觉得 SpringBoot 最出彩的就是它的自动配置和依赖管理这两个特点

咱先不扯那些 boot 提供生产级别的监控、健康检查及外部化配置等花里胡哨的特性。就依赖管理和自动配置都够初学那时的我吹半天! IMG_20220514_134357.jpg

因为这是刚刚走出 SSM 框架那会儿,清清楚楚的记得被 SSM 框架阶段的 xml 配置地狱所支配的恐惧

依赖管理

依赖管理是指:SpringBoot 将一些常用的框架,以及这些框架所需的别的依赖,统一打包成一个 starter,并管理好 SpringBoot 与依赖间的版本兼容问题。(也就是版本仲裁) 无需程序员自行导入依赖,无需自己配置版本,依赖标签的 version 属性可以省略,避免了很多恐怖的 jar 包冲突,有没有很刺激! 若需要更换某个 jar 的版本,当然也是没问题的,自行在相关依赖上添加 version 即可

SpringBoot 的依赖管理是通过 Maven 实现的

POM 文件的结构

每个 SpringBoot 工程的 POM 文件遵循这个结构:

我们自己创建的工程的父工程是 spring-boot-starter-parent

image.png

spring-boot-starter-parent的父工程是spring-boot-dependencies,是用来统一集中管理依赖和版本的地方

image.png

spring-boot-dependencies中我们能看到一大堆的 starter,和他们已经控制好的版本

image.png

控制好的版本在<properties>标签里,若要自定义版本,添加<version>和需要的版本就行了

image.png

关于 starter

Spring Boot 将日常企业应用研发中的各种场景都抽取出来,做成一个个的 starter(启动器),starter 中整合了该场景下各种可能用到的依赖,用户只需要在 Maven 中引入 starter 依赖,SpringBoot 就能自动扫描到要加载的信息并启动相应的默认配置。starter 提供了大量的自动配置,让用户摆脱了处理各种依赖和配置的困扰。所有这些 starter 都遵循着约定成俗的默认配置,并允许用户调整这些配置,即遵循“约定大于配置”的原则。

starter 在哪里找呢?

1、去spring-boot-dependencies文件中一个个翻找

2、去官网(推荐)

starter 的官网查询攻略

image.png

image.png

官网真是个好东西,学技术必登官网(滑稽.jpg)

自动配置

自动配置是指:无需在 xml 文件中配置一堆堆的 bean 并将其添加到 Spring 容器中。 (也就是 ssm 框架阶段的 xml 配置地狱) 框架的基本属性已经配置好,若需要自定义部分常用属性,只需要在 properties 文件或 yaml 文件快速配置即可

就拿我们熟悉的 web 开发最常用的 starter 来举例

image.png

spring-boot-starter-web中包含了我们开发的基本包,稍微举个例子,其他的就不再赘述

<dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
      <version>2.6.3</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-json</artifactId>
      <version>2.6.3</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-tomcat</artifactId>
      <version>2.6.3</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>5.3.15</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.3.15</version>
      <scope>compile</scope>
    </dependency>
  </dependencies>

在这里我们能看到,有 Tomcat、jackson、SpringMVC 相关……大部分全给我们打包好了,尽管用就行,个别的按需引入就行

默认的包结构(包扫描路径)

默认情况下,SpringBoot 工程能扫描到的注解在 ① 主启动类所在包、② 以及主启动类包下的所有子包

意思是默认情况下,将带有@Component@Service@Controller注解的类放在主启动类的父包上,是扫描不到的!扫描不到那么就不能添加到 Spring 容器中!

如果需要人为更改,可以设置主启动类上的@SpringBootApplication注解的相关参数属性

下面是@SpringBootApplication注解的源码定义,我们看到了包扫描注解@ComponentScan

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
        @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
    
}

通过调整@SpringBootApplication的 scanBasePackages 属性来修改默认的包扫描路径

@SpringBootApplication(scanBasePackages = "xxx.自定义路径.xxx")
public class ConsumerOrderMain80 {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerOrderMain80.class,args);
    }
}

自动配置的奥秘

自动配置让远离 “配置地狱” 的我觉得很神奇

SpringBoot 的自动配置的奥秘就在这个@SpringBootApplication注解中,以后出一篇来谈谈这个