Springboot Starter 是如何工作的?

你好,我是猿java。

Springboot Starter 是 Springboot 项目的一部分,它提供了一种便捷的方式来引入一组相关的依赖和自动配置,以简化 Spring 应用程序的开发。这篇文章,我们将详细分析 Springboot Starter 的实现原理、优秀的设计思想以及其优缺点。

实现原理

1. 依赖管理

Springboot Starter 是通过 Maven 或 Gradle 的依赖管理来实现的。一个 Starter 通常是一个 Maven 依赖(或 Gradle 依赖),它本身并不包含功能代码,而是引入了一组相关的依赖。

例如,spring-boot-starter-web 会引入 Spring MVC、Tomcat 等必要的依赖。

2. 自动配置

Springboot 的核心特性之一是自动配置(Auto-Configuration)。通过使用 @EnableAutoConfiguration 注解,Springboot 可以根据类路径中的依赖、Java Bean 定义和其他属性来自动配置 Spring 应用程序。具体的自动配置逻辑是通过一系列 spring.factories 文件来定义的,这些文件位于各个 jar 包的 META-INF 目录下,列出了自动配置类。

3. 条件注解

自动配置类通常使用一系列的条件注解(如@ConditionalOnClass,@ConditionalOnMissingBean,@ConditionalOnProperty等)来控制配置逻辑是否生效。这些条件注解确保只有在满足特定条件时,相关的配置才会应用。

为了更好的说明 starter机制,我们通过一个示例来展示它是如何工作的。

1. 引入依赖

这里以 Maven 项目为例,在pom.xml文件中,添加如下依赖:

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

spring.factories 文件是 Springboot 用于实现自动配置(Auto-Configuration)的一种机制。它位于每个 jar 包的 META-INF 目录下,并且遵循特定的格式来声明各种自动配置类和其他组件。以下是如何配置 spring.factories 文件的详细说明。

2. 创建配置类

首先,创建一个自动配置类。例如,MyAutoConfiguration

1
2
3
4
5
6
7
8
9
10
11
12
13
package com.example.autoconfig;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyAutoConfiguration {

@Bean
public MyService myService() {
return new MyService();
}
}

3. 配置 spring.factories

src/main/resources/META-INF 目录下创建 spring.factories 文件,并添加如下内容:

1
2
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.autoconfig.MyAutoConfiguration

spring.factories 文件是一个简单的键值对文件,使用 = 号分隔键和值,多个值用逗号分隔。通常使用 org.springframework.boot.autoconfigure.EnableAutoConfiguration 作为键来指定自动配置类。

以下是一个完整示例,包括项目结构和文件内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
my-spring-boot-starter
├── src
│ ├── main
│ │ ├── java
│ │ │ └── com
│ │ │ └── example
│ │ │ └── autoconfig
│ │ │ ├── MyAutoConfiguration.java
│ │ │ └── MyService.java
│ │ └── resources
│ │ └── META-INF
│ │ └── spring.factories
├── pom.xml

4. 使用自定义 Starter

在另一个 Springboot 应用中引入这个自定义 Starter:

pom.xml

1
2
3
4
5
<dependency>
<groupId>com.example</groupId>
<artifactId>my-spring-boot-starter</artifactId>
<version>1.0.0</version>
</dependency>

优缺点

优点

1. 简化依赖管理
使用 Starter 可以一行代码引入一组相关的依赖,避免了手动管理复杂的依赖关系。

2. 自动配置

自动配置减少了大量的样板代码,使开发者可以专注于业务逻辑。

3. 快速启动

通过引入 Starter 和自动配置,可以快速启动一个功能齐全的 Spring 应用。

4. 模块化

Springboot Starters 是模块化的,可以根据需要选择引入不同的 Starter,灵活组合。

缺点

1. 黑盒操作

自动配置的过程对开发者来说有点像“黑盒”,如果出现问题,调试可能会比较复杂。

2. 过度依赖

过度依赖自动配置可能导致对底层细节的理解不足,从而影响应用的可维护性和性能优化。

3. 启动时间

对于大型应用,自动配置可能会增加启动时间,因为需要扫描和配置大量的组件。

Springboot Starter 的设计思维体现了多种软件工程和设计模式的原则,主要包括以下几个方面:

Springboot starter 的设计思维?

Springboot starter 主要体现了下面 6 种设计思维:

1. 模块化设计

Springboot Starters 将复杂的功能模块化,提供了一组预定义的依赖和配置。这种模块化设计使得开发者可以根据需求选择和组合不同的 Starters,从而简化了项目的依赖管理。

2. 约定优于配置

Springboot 推崇“约定优于配置(Convention over Configuration)”的原则,即通过合理的默认配置减少开发者的配置工作。Starters 通过提供合理的默认依赖和自动配置,大大减少了开发者手动配置的工作量。

3. 自动配置

自动配置(Auto-Configuration)是 Springboot 的核心特性之一。它基于条件注解(如 @ConditionalOnClass, @ConditionalOnMissingBean, @ConditionalOnProperty 等)实现,根据类路径中的依赖、Java Bean 定义和其他属性自动配置 Spring 应用程序。这种设计减少了样板代码,提升了开发效率。

4. 依赖注入

Spring 框架的核心特性之一是依赖注入(Dependency Injection,DI)。Starters 和自动配置类通过 DI 来管理和注入依赖对象,使得组件之间的耦合度更低,增强了代码的可测试性和可维护性。

5. 开闭原则

开闭原则(Open/Closed Principle)是面向对象设计的五大原则之一,指的是软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。Springboot 通过提供一系列可扩展的自动配置类,允许开发者在不修改框架本身的情况下进行扩展和自定义。

6. 单一职责原则

每个 Starter 都专注于提供一种特定的功能或一组相关的功能。例如,spring-boot-starter-web 专注于 Web 应用的开发,而 spring-boot-starter-data-jpa 专注于 JPA 数据访问。这种设计符合单一职责原则,使得每个模块的职责更加明确。

总结

总结来说,Springboot Starter 通过简化依赖管理和自动配置,大大提高了开发效率,其中也包含了很多优秀的设计思维,但是,在日常开发中,我们也需要注意其潜在的缺点和局限性。

学习交流

如果你觉得文章有帮助,请帮忙转发给更多的好友,或关注公众号:猿java,持续输出硬核文章。

drawing