Springboot Starter 是如何工作的?

简介: 本文详细介绍Springboot Starter的实现原理、设计思想及其优缺点。Springboot Starter通过Maven或Gradle依赖管理引入相关依赖,并利用自动配置和条件注解简化开发流程。文章通过示例展示了如何创建自定义Starter,并分析了其模块化设计、约定优于配置、自动配置、依赖注入、开闭原则及单一职责原则等设计理念。尽管Starter带来诸多便利,但也存在黑盒操作、过度依赖及启动时间增加等问题。通过本文,你将全面了解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文件中,添加如下依赖:

<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

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

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

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

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

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

<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,持续输出硬核文章。

目录
相关文章
|
Java 数据库连接 Spring
如何在Spring Boot中使用`@Retryable`注解来实现重试机制?
如何在Spring Boot中使用`@Retryable`注解来实现重试机制?
1563 0
如何在Spring Boot中使用`@Retryable`注解来实现重试机制?
|
SQL 安全 Java
一篇文章彻底理解 HIVE 常见的三种 AUTHENTICATION 认证机制的配置与使用
一篇文章彻底理解 HIVE 常见的三种 AUTHENTICATION 认证机制的配置与使用
|
消息中间件 Java Maven
深入理解Spring Boot Starter:概念、特点、场景、原理及自定义starter
深入理解Spring Boot Starter:概念、特点、场景、原理及自定义starter
|
11月前
|
Prometheus 监控 Cloud Native
高频面题: 你们线上 QPS 多少?你 怎么知道的?
本文由45岁资深架构师尼恩撰写,针对高级开发和架构师面试中的高频问题提供详细解答。文章涵盖了QPS、TPS、RT等性能指标的定义及计算方法,详解了如何配置Prometheus与Grafana监控系统QPS,并提供了应对高并发场景(如双十一抢购)的系统部署策略。此外,还分享了多个大厂面试真题及解决方案,帮助读者在面试中充分展示技术实力,提升求职竞争力。建议收藏并深入学习,为面试做好充分准备。更多内容可参考《尼恩Java面试宝典》及相关技术圣经系列PDF。
|
XML Java 程序员
保姆级教程,手把手教你实现SpringBoot自定义starter
保姆级教程,手把手教你实现SpringBoot自定义starter
13731 2
保姆级教程,手把手教你实现SpringBoot自定义starter
|
SQL Java 数据库连接
Mybatis架构原理和机制,图文详解版,超详细!
MyBatis 是 Java 生态中非常著名的一款 ORM 框架,在一线互联网大厂中应用广泛,Mybatis已经成为了一个必会框架。本文详细解析了MyBatis的架构原理与机制,帮助读者全面提升对MyBatis的理解和应用能力。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
Mybatis架构原理和机制,图文详解版,超详细!
|
缓存 监控 安全
Spring AOP 详细深入讲解+代码示例
Spring AOP(Aspect-Oriented Programming)是Spring框架提供的一种面向切面编程的技术。它通过将横切关注点(例如日志记录、事务管理、安全性检查等)从主业务逻辑代码中分离出来,以模块化的方式实现对这些关注点的管理和重用。 在Spring AOP中,切面(Aspect)是一个模块化的关注点,它可以跨越多个对象,例如日志记录、事务管理等。切面通过定义切点(Pointcut)和增强(Advice)来介入目标对象的方法执行过程。 切点是一个表达式,用于匹配目标对象的一组方法,在这些方法执行时切面会被触发。增强则定义了切面在目标对象方法执行前、执行后或抛出异常时所
17276 4
|
Java
Java 中 notify() 和 notifyAll() 的区别
【8月更文挑战第22天】
374 4
|
Java 开发者 微服务
深入解析@SpringBootApplication注解:简化Spring Boot应用的配置
在现代的Java开发中,Spring Boot框架成为了构建微服务和快速开发应用的首选。Spring Boot的成功部分归功于其简化的配置和约定大于配置的理念。而`@SpringBootApplication`注解则是Spring Boot应用的入口,负责自动配置和启动Spring Boot应用。本文将深入探讨`@SpringBootApplication`注解的作用、用法,以及在Spring Boot应用中的应用场景。
1846 1
|
NoSQL Java 调度
在Spring Boot中实现分布式任务调度
在Spring Boot中实现分布式任务调度