Skip to content

逐步拆解Spring Boot的依赖管理和自动配置

尼丝

1089字约4分钟

2024-11-26

Spring Boot的依赖管理和自动配置是其核心特性之一,极大地简化了Spring应用的开发过程。

可以说学习Spring Boot的第一步就是理解其 依赖管理 和 自动配置

依赖管理

dependency版本号管理

每一个Spring Boot工程的pom.xml中添加依赖时可以发现,有一些依赖不需要指定版本号:例如mysql-connector-j。原因是Spring Boot已经指定好了常用依赖的版本号,具体如下:

// Spring Boot项目pom.xml文件
<parent>
    <groupId>org.springframework.boot</groupId>  
    <artifactId>spring-boot-starter-parent</artifactId>  
    <version>x.x.x</version>  
    <relativePath/>
</parent>

Spring Boot工程的pom.xml(Maven)都会继承spring-boot-starter-parent,而spring-boot-starter-parent又继承spring-boot-dependencies。在其中使用properties定义了常用依赖的版本号。如下:

// spring-boot-dependencies pom.xml文件
<properties>  
  <activemq.version>6.1.3</activemq.version>  
  <angus-mail.version>2.0.3</angus-mail.version>  
  <artemis.version>2.33.0</artemis.version>  
  <aspectj.version>1.9.22.1</aspectj.version>  
  <assertj.version>3.25.3</assertj.version>  
  <awaitility.version>4.2.2</awaitility.version>  
  // 省略.....
</properties>

如果开发者没有指定某个依赖的版本号,Spring Boot会使用父项目中声明的默认版本号。这种方式称为自动版本仲裁,确保了依赖的兼容性和一致性。

spring-boot-starter-xxx 快速起步

Spring Boot提供了多种起步依赖(如spring-boot-starter-web),这些依赖包含了Web开发所需的所有底层依赖文件,并且自动管理这些依赖,简化了项目的引入过程。例如,引入spring-boot-starter-web后,Spring Boot会自动引入Tomcat、Spring MVC等必要的依赖

总结

Spring Boot通过spring-boot-starter-parent作为统一父项目来管理依赖版本号。在pom.xml文件中,通过<properties>标签统一管理常用技术框架的版本号,如MySQL、Tomcat等。

优点:

  • 避免手动指定版本号,简化了项目的依赖管理
  • 确保了不同子项目间版本的一致性
  • 减少依赖冲突

自动配置

使用Spring Boot做过web开发的小伙伴应该都知道,集成的Tomcat如果不做配置,默认端口为8080。还有DispatcherServletViewResolver等组件也都有默认配置。

这就是常说的"约定大于配置"

自动配置原理/流程

每一个spring-boot-starter-xxx都有spring-boot-starter,它是starter的核心之一。spring-boot-starter又有spring-boot-autoconfigure,包里面都是各种场景的AutoConfiguration自动配置类。

核心注解

  • @SpringBootApplication:这是Spring Boot项目的入口注解,它是一个组合注解,包含了@EnableAutoConfiguration@SpringBootConfiguration@ComponentScan三个注解。
  • @EnableAutoConfiguration:开启自动配置功能,是自动配置的核心注解。它通过@Import导入AutoConfigurationImportSelector类,该类负责加载spring.factories文件中的自动配置类。
  • @SpringBootConfiguration:类似于@Configuration注解,用于声明一个类为配置类。
  • @ComponentScan:用于扫描组件,自动扫描包路径下的所有Spring组件并注册到Spring容器中。
  • @ConditionalOnClass:仅当类路径下存在指定的类时才生效。
  • @ConditionalOnMissingBean:仅当Spring容器中不存在指定类型的Bean时才生效。
  • @ConditionalOnProperty:仅当指定的属性值满足条件时才生效。

工作流程

  1. 加载主配置类:Spring Boot启动时会加载带有@SpringBootApplication注解的主配置类。这个类通常作为项目的入口点。
  2. 启用自动配置:在加载主配置类时,@EnableAutoConfiguration注解被激活,它会尝试根据项目依赖和运行环境条件自动配置Spring Bean。
  3. 读取spring.factories文件:通过@Import(AutoConfigurationImportSelector.class)注解,Spring Boot会读取META-INF/spring.factories文件,从中获取所有符合条件的自动配置类。
  4. 条件判断与Bean注册:每个自动配置类都会使用条件注解(如@ConditionalOnClass@ConditionalOnMissingBean等)来判断是否需要注册相应的Bean。如果条件满足,则自动配置类中的Bean会被注册到Spring容器中。

总结

Spring Boot的自动配置机制通过一系列核心注解(如@SpringBootApplication@EnableAutoConfiguration等)和条件注解(如@ConditionalOnClass@ConditionalOnMissingBean等),实现了基于条件的自动配置。开发者可以通过自定义自动配置类进一步扩展Spring Boot的功能,从而简化应用的开发和部署过程。

优点:

  • 提高开发效率
  • 快速上手
  • 减少依赖冲突