逐步拆解Spring Boot的依赖管理和自动配置
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。还有DispatcherServlet
,ViewResolver
等组件也都有默认配置。
这就是常说的"约定大于配置"
自动配置原理/流程
每一个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
:仅当指定的属性值满足条件时才生效。
工作流程
- 加载主配置类:Spring Boot启动时会加载带有
@SpringBootApplication
注解的主配置类。这个类通常作为项目的入口点。 - 启用自动配置:在加载主配置类时,
@EnableAutoConfiguration
注解被激活,它会尝试根据项目依赖和运行环境条件自动配置Spring Bean。 - 读取
spring.factories
文件:通过@Import(AutoConfigurationImportSelector.class)
注解,Spring Boot会读取META-INF/spring.factories
文件,从中获取所有符合条件的自动配置类。 - 条件判断与Bean注册:每个自动配置类都会使用条件注解(如
@ConditionalOnClass
、@ConditionalOnMissingBean
等)来判断是否需要注册相应的Bean。如果条件满足,则自动配置类中的Bean会被注册到Spring容器中。
总结
Spring Boot的自动配置机制通过一系列核心注解(如@SpringBootApplication
、@EnableAutoConfiguration
等)和条件注解(如@ConditionalOnClass
、@ConditionalOnMissingBean
等),实现了基于条件的自动配置。开发者可以通过自定义自动配置类进一步扩展Spring Boot的功能,从而简化应用的开发和部署过程。
优点:
- 提高开发效率
- 快速上手
- 减少依赖冲突