Springboot Starter 是如何工作的?

简介: Springboot Starter 是 Springboot 项目的一部分,简化了依赖管理和自动配置,通过 Maven 或 Gradle 引入相关依赖并自动配置应用程序。其核心特性包括依赖管理、自动配置及条件注解。Starter 的设计思维体现了模块化、约定优于配置、依赖注入等原则,提高了开发效率,但也存在调试复杂、过度依赖等问题。

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文件中,添加如下依赖:

xml

代码解读

复制代码

<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

java

代码解读

复制代码

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 文件,并添加如下内容:

properties

代码解读

复制代码

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

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

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

css

代码解读

复制代码

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

xml

代码解读

复制代码

<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 通过简化依赖管理和自动配置,大大提高了开发效率,其中也包含了很多优秀的设计思维,但是,在日常开发中,我们也需要注意其潜在的缺点和局限性。


转载来源:https://juejin.cn/post/7410999714428059675

相关文章
|
2月前
|
设计模式 Java Maven
Springboot Starter 是如何工作的?
本文详细介绍Springboot Starter的实现原理、设计思想及其优缺点。Springboot Starter通过Maven或Gradle依赖管理引入相关依赖,并利用自动配置和条件注解简化开发流程。文章通过示例展示了如何创建自定义Starter,并分析了其模块化设计、约定优于配置、自动配置、依赖注入、开闭原则及单一职责原则等设计理念。尽管Starter带来诸多便利,但也存在黑盒操作、过度依赖及启动时间增加等问题。通过本文,你将全面了解Springboot Starter的工作机制与应用场景。
40 3
|
7月前
|
开发框架 Java Maven
SpringBoot-Starter 概念与实战
【4月更文挑战第30天】Spring Boot 是一个基于 Spring Framework 的开发框架,旨在简化 Spring 应用程序的搭建和开发。Spring Boot 提供了大量的 Starter(启动器)来简化项目的依赖管理和配置,其中最为常见的是 SpringBoot-Starter。
167 1
|
消息中间件 IDE Java
|
NoSQL Java Redis
SpringBoot入门到精通-SpringBoot自定义starter(六)
SpringBoot入门到精通-SpringBoot自定义starter
|
消息中间件 IDE Java
天天用SpringBoot写代码,结果连Starter是什么都不知道?
天天用SpringBoot写代码,结果连Starter是什么都不知道?
|
NoSQL Java 应用服务中间件
SpringBoot项目为什么需要引入大量的starter?如何自定义starter?
为什么我们在使用SpringBoot框架开发Java Web应用需要引入大量的starter?例如,我们引入Redis就在Maven中导入spring-boot-starter-data-redis。大家都知道SpringBoot的核心功能是自动装配,简化配置,我们通过starter实现SpringBoot自动装配的功能。那么我们如何去构建自己的starter呢?
301 0
|
NoSQL Java Redis
如何使用SpringBoot写一个属于自己的Starter
SpringBoot以其自动装配的能力被广泛应用,我们在写代码时肯定遇到过很多spring-boot-starter命名的依赖,比如spring-boot-starter-web,在pom文件中引入这些starter依赖后,SpringBoot就能通过自动装配的技术扫描到这些类并装载到Bean容器中。
|
Java 应用服务中间件 Spring
【SpringBoot 2】(三)SpringBoot相较于Spring的特点(二)
【SpringBoot 2】(三)SpringBoot相较于Spring的特点(二)
130 0
【SpringBoot 2】(三)SpringBoot相较于Spring的特点(二)
|
前端开发 Java 应用服务中间件
【SpringBoot 2】(三)SpringBoot相较于Spring的特点(一)
【SpringBoot 2】(三)SpringBoot相较于Spring的特点(一)
135 0
【SpringBoot 2】(三)SpringBoot相较于Spring的特点(一)
|
Java 容器
实战|如何自定义SpringBoot Starter?
SpringBoot 项目就是由一个一个 Starter 组成的,一个 Starter 代表该项目的 SpringBoot 起步依赖,除了官方已有的 Starter,如果你需要将自己的项目支持 SpringBoot,那么就需要把它制作成一个 Starter。
225 0
实战|如何自定义SpringBoot Starter?