Springboot项目构建时各种依赖详细介绍与依赖关系说明详解

本文主要是介绍Springboot项目构建时各种依赖详细介绍与依赖关系说明详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Springboot项目构建时各种依赖详细介绍与依赖关系说明详解》SpringBoot通过spring-boot-dependencies统一依赖版本管理,spring-boot-starter-w...

一、spring-boot-dependencies

1.简介

  spring-boot-dependencies 是一个特殊的POM(Project Object Model)文件,它由Spring Boot团队维护,其主要作用是为Spring Boot相关的依赖提供统一的版本管理。它定义了大量的依赖及其兼容版本,确保Spring Boot生态中的库能够协同工作。官方仓库地址:
https://repo1.maven.org/maven2/org/springframework/boot/spring-boot-dependencies/3.1.0/spring-boot-dependencies-3.1.0.pom(版本可依据具体项目要求更改)

2. 内容概览

spring-boot-dependencies中,主要包含以下内容:

  • 依赖管理(Dependency Management):定义了Spring Boot项目常用的第三方库的版本号(如Spring Framework、Jackson、Log4j2、Hibernate等)。
  • 插件管理(Plugin Management):定义了一些Maven插件的版本(如maven-compiler-plugin, maven-surefire-plugin等)。
  • 属性(Properties):在<properties>标签下定义了大量依赖的版本号,然后通过属性引用来统一版本。

3.核心内容结构

Springboot项目构建时各种依赖详细介绍与依赖关系说明详解

4. 依赖树结构

  spring-boot-dependencies本身并不引入任何依赖,它只是声明依赖版本。当我们在项目中引入一个starter(比如spring-boot-starter-web)时,Maven会根据spring-boot-dependencies中定义的版本去下载对应的依赖。

6. spring-boot-dependencies中的属性

  在spring-boot-dependencies的POM文件中,通过属性定义了各个依赖的版本。例如:

<properties>
<activemq.version>5.16.5</activemq.version>
<antlr2.version>2.7.7</antlr2.version>
<appengine-sdk.version>1.9.88</appengine-sdk.version>
<artemis.version>2.19.1</artemis.version>
<ASPectj.version>1.9.7</aspectj.version>
<assertj.version>3.19.0</assertj.version>
<atomikos.version>4.0.6</atomikos.version>
<awaitility.version>4.1.0</awaitility.version>
... 更多属性
</properties>

  然后在依赖管理中引用这些属性:

<dependencyManagement>
<dependencies>
...
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-amqp</artifactId>
<version>${activemq.version}</version>
</dependency>
...
</dependencies>
</dependencyManagement>

6. 如何查看完整的依赖树?

在Maven项目中,可以使用以下命令查看依赖树:

mvn dependency:tree

在Gradle项目中,可以使用:

gradle dependencies

7. 依赖冲突解决

  由于spring-boot-dependencies已经管理了版本,通常不会出现版本冲突。但如果需要覆盖某个依赖的版本,可以在项目的pom.XML中显式声明该依赖并指定版本(会覆盖spring-boot-dependencies中的版本)。例如:

<dependencies>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.php12.5</version>
</dependency>
</dependencies>

8.企业级实践建议

Springboot项目构建时各种依赖详细介绍与依赖关系说明详解

安全更新策略

版本锁定:在父 POM 中固定 Spring Boot 版本

<properties>
    <spring-boot.version>3.1.0</spring-boot.version>
</properties>

漏洞扫描:定期检查依赖漏洞

mvn org.owasp:dependency-check-maven:check

增量更新:使用版本范围谨慎升级

<spring-boot.version>[3.0.0,3.2.0)</spring-boot.version>

通过 spring-boot-dependencies,Spring Boot 团队为开发者提供了:

  • 经过严格测试的依赖兼容矩阵
  • 一站式的版本管理入口
  • 零配置的依赖冲突解决方案
  • 灵活的版本覆盖机制

9. 总结

  • spring-boot-dependencies是Spring Boot的版本管理POM,它统一管理了大量第三方依赖的版本。
  • 通过starter,我们可以轻松引入一组功能相关的依赖,并且这些依赖的版本都是经过测试兼容的。
  • 依赖树结构清晰,可以通过Maven或Gradle命令查看。
  • 在需要时,可以覆盖默认的依赖版本。

通过这种方式,Spring Boot极大地简化了依赖管理,让开发者可以专注于业务逻辑。

二、spring-boot-starter-parent

1.简介

  首先,spring-boot-starter-parent是一个父POM,它继承自spring-boot-dependencies,并且添加了默认的构建配置。

  下面详细说明其内容以及依赖树结构(注意:依赖树结构通常是指项目依赖的传递性依赖,但这里我们更关注的是父POM的继承结构和它带来的构建配置)。

2 .结构图

结构图:

项目POM -> 继承 spring-boot-starter-parent -> 继承 spring-boot-dependencies

项目POM -> spring-boot-starter-parent -> spring-boot-dependencies

构建配置的继承关系(非依赖树,而是POM继承关系)可以用下图表示:

Springboot项目构建时各种依赖详细介绍与依赖关系说明详解

具体内容:

  • 继承spring-boot-dependencies:因此获得了所有依赖版本管理。
  • 默认配置:包括资源过滤、插件配置(如maven-compiler-plugin, maven-jar-plugin, maven-war-plugin, maven-surefire-plugin等)、资源文件处理(application.properties和application.yml的过滤)、默认的Java版本和编码等。

3.主要内容

由于spring-boot-starter-parent本身是一个POM,我们可以查看其内容(以3.1.0版本为例):

官方地址:https://repo1.maven.org/maven2/org/springframework/boot/spring-boot-starter-parent/3.1.0/spring-boot-starter-parent-3.1.0.pom

该POM的主要部分如下

  1. 继承spring-boot-dependencies
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>3.1.0</version>
</parent>
  1. 定义属性(覆盖或新增)
<properties>
<java.version>17</java.version> <!-- 默认Java版本 -->
<resource.delimiter>@</resource.deliandroidmiter> <!-- 资源过滤占位符分隔符 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <!-- 编码 -->
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<!-- 其他属性 -->
</properties>
  1. 构建配置(build)
  • 资源过滤配置:对src/main/resources和src/test/resources目录进行过滤,使用上面的占位符分隔符。
  • 插件管理:配置了多个插件的默认行为。
  1. 插件配置
  • maven-compiler-plugin:设置源代码和目标的Java版本。
  • maven-failsafe-plugin:配置测试运行。
  • spring-boot-maven-plugin:用于打包可执行jar。
  1. 资源过滤(resources):

默认配置了资源过滤,使得在资源文件中可以使用占位符(如@variable@)进行替换。

注意:spring-boot-starter-parent本身不包含任何代码,也不直接添加任何依赖(除了构建插件),它的主要作用是提供构建配置和依赖版本管理。

当我们创建一个项目并继承spring-boot-starter-parent时,项目的POM结构如下:

项目POM:

<project>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.1.0</version>
</parent>
... 项目自己的定义 ...
</project>

具体构建配置的内容:

在spring-boot-starter-parent中,配置了以下插件:

  • maven-compiler-plugChina编程in:设置源代码和目标版本为${java.vpythonersion}。
  • maven-failsafe-plugin:默认使用JUnit,并配置了必要的参数。
  • spring-boot-maven-plugin:用于打包可执行的jar或war。
  • 其他插件:如maven-jar-plugin, maven-war-plugin等的基本配置。

另外,资源过滤配置如下:

<resources>
<resource>
<directory>${basedir}/src/main/resources</directory>
<filtering>true</filtering> <!-- 启用过滤 -->
<includes>
<include>**/application*.yml</include>
<include>**/application*.yaml</include>
<include>**/application*.properties</include>
</includes>
</resource>
<!-- 其他资源目录,不启用过滤 -->
<resource>
<directory>${basedir}/src/main/resources</directory>
<excludes>
<exclude>**/application*.yml</exclude>
<exclude>**/application*.yaml</exclude>
<exclude>**/application*.properties</exclude>
</excludes>
</resource>
</resources>

注意:在spring-boot-starter-parent中,资源过滤默认只针对application*.properties, application*.yml, application*.yaml文件。

4.总结:

spring-boot-starter-parent提供了:

  • 依赖管理(通过继承spring-boot-dependencies)。
  • 默认的构建配置(包括插件配置和资源过滤)。
  • 默认的属性配置(如Java版本、编码等)。

这使得开发者无需关心构建细节,只需关注业务代码。

示例:一个典型的Spring Boot项目的POM:

<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.1.0</version>
</parent>
<groupId>com.example</groupId>
<artifactId>myproject</artifactId>
<version>1.0.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>

在这个项目中,我们不需要指定依赖的版本,因为父POM已经管理了。同时,构建时使用的Java版本、编码、资源过滤等都已经配置好。

注意:如果项目需要自定义父POM,则不能直接继承spring-boot-starter-parent,这时可以采用之前介绍的方式,通过dependencyManagement导入spring-boot-dependencies,并手动配置插件和资源过滤。

三、spring-boot-starter-web

1.简介

  spring-boot-starter-web是 Spring Boot 的核心 Starter 之一,用于快速构建 Web 应用程序。它提供了完整的 Spring MVC 框架支持和内嵌 Servlet 容器,让开发者能立即创建 RESTful 服务或传统 Web 应用。

2.结构图

Springboot项目构建时各种依赖详细介绍与依赖关系说明详解

Springboot项目构建时各种依赖详细介绍与依赖关系说明详解

3.使用

自动配置行为
当检测到 spring-boot-starter-web 在类路径中时,自动触发以下配置:

1. Servlet 容器配置

java
@AutoConfiguration
@ConditionalOnWebApplication
@EnableConfigurationProperties(ServerProperties.class)
public class ServletWebServerFactoryAutoConfiguration {
    // 自动配置内嵌Tomcat
    @Bean
    public TomcatServletWebServerFactory tomcatServletWebServerFactory() {
        return new TomcatServletWebServerFactory();
    }
}

2. Spring MVC 配置

@Configuration
@ConditionalOnClass(DispatcherServlet.class)
@AutoConfigureAfter(ServletWebServerFactoryAutoConfiguration.class)
public class WebMvcAutoConfiguration {
    // 配置视图解析器
    @Bean
    @ConditionalOnMissingBean
    public InternalResourceViewResolver defaultViewResolver() {
        // ...
    }
    // 配置消息转换器
    @Bean
    public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
        // ...
    }
}

3. 默认行为

  • 端口:8080
  • 上下文路径:/
  • 静态资源目录:
    /static
    /public
    /resources
    /META-INF/resources
  • 错误页面:/error 自动映射
  • jsON 支持:自动配置 Jackson

替换tomcat:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jetty</artifactId>
</dependency>

3.http处理流程

客户端 Tomcat 容器 DispatcherServlet @RestController HTTP 请求 请求分发 映射到处理方法 返回结果 响应处理 HTTP 响应 客户端 Tomcat 容器 DispatcherServlet @RestController

4.应用示例

1. 基本配置

server:
  port: 8081
  servlet:
    context-path: /api
  tomcat:
    max-threads: 200

2. 静态资源配置

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/custom/**")
                .addResourceLocations("classpath:/custom-static/");
    }
}

3. 拦截器配置

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LogInterceptor())
                .addPathPatterns("/api/**");
    }
}

4.RESTful服务开发

@RestController
@RequestMapping("/api/users")
public class UserController {
    @GetMapping
    public ResponseEntity<List<User>> getUsers() {
        // 返回200 OK + JSON列表
    }
    @PostMapping
    @ResponseStatus(HttpStatus.CREATED)
    public User createUser(@Valid @RequestBody User user) {
        // 参数自动验证
    }
}

5.全局异常处理

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(UserNotFoundException.class)
    public ResponseEntity<ErrorResponse> handleUserNotFound(
        UserNotFoundException ex) {
        return ResponseEntity.status(HttpStatus.NOT_FOUND)
                .body(new ErrorResponse(ex.getMessage()));
    }
}

6. 性能优化配置

spring:
  mvc:
    async:
      request-timeout: 5000 # 异步超时时间
  servlet:
    multipart:
      max-file-size: 10MB
      max-request-size: 20MB
server:
  compression:
    enabled: true
    mime-types: text/html,text/css,application/json

与其他 Starter 的协作

Springboot项目构建时各种依赖详细介绍与依赖关系说明详解

@SpringBootApplication
@EnableJpaRepositories //android 启用JPA
@EnableWebSecurity // 启用安全
public class FullStackApp {
    public static void main(String[] args) {
        SpringApplication.run(FullStackApp.class, args);
    }
}

7.总结

性能特性

场景默认配置优化建议
线程池Tomcat 200线程根据CPU核心数调整
连接超时无限制设置server.tomcat.connection-timeout
响应压缩关闭开启server.compression.enabled=true
静态资源缓存关闭添加Cache-Control头
JSON序列化全字段序列化使用@JsonView控制字段

通过 spring-boot-starter-web,开发者能够:

  • 在 30 秒内创建可运行的 Web 应用
  • 获得生产就绪的 HTTP 服务能力
  • 自动处理 90% 的 Web 开发通用配置
  • 灵活扩展 MVC 功能
  • 无缝整合 Spring 生态系统组件

此 Starter 将传统 Spring MVC 应用的配置工作量减少 80%,同时保持完整的灵活性,是构建现代 Java Web 应用的基石。

到此这篇关于Springboot项目构建时各种依赖详细介绍与依赖关系说明的文章就介绍到这了,更多相关Springboot依赖内容请搜索编程China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!

这篇关于Springboot项目构建时各种依赖详细介绍与依赖关系说明详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1155755

相关文章

C++ move 的作用详解及陷阱最佳实践

《C++move的作用详解及陷阱最佳实践》文章详细介绍了C++中的`std::move`函数的作用,包括为什么需要它、它的本质、典型使用场景、以及一些常见陷阱和最佳实践,感兴趣的朋友跟随小编一起看... 目录C++ move 的作用详解一、一句话总结二、为什么需要 move?C++98/03 的痛点⚡C++

Java方法重载与重写之同名方法的双面魔法(最新整理)

《Java方法重载与重写之同名方法的双面魔法(最新整理)》文章介绍了Java中的方法重载Overloading和方法重写Overriding的区别联系,方法重载是指在同一个类中,允许存在多个方法名相同... 目录Java方法重载与重写:同名方法的双面魔法方法重载(Overloading):同门师兄弟的不同绝

MySQL中between and的基本用法、范围查询示例详解

《MySQL中betweenand的基本用法、范围查询示例详解》BETWEENAND操作符在MySQL中用于选择在两个值之间的数据,包括边界值,它支持数值和日期类型,示例展示了如何使用BETWEEN... 目录一、between and语法二、使用示例2.1、betwphpeen and数值查询2.2、be

python中的flask_sqlalchemy的使用及示例详解

《python中的flask_sqlalchemy的使用及示例详解》文章主要介绍了在使用SQLAlchemy创建模型实例时,通过元类动态创建实例的方式,并说明了如何在实例化时执行__init__方法,... 目录@orm.reconstructorSQLAlchemy的回滚关联其他模型数据库基本操作将数据添

Spring配置扩展之JavaConfig的使用小结

《Spring配置扩展之JavaConfig的使用小结》JavaConfig是Spring框架中基于纯Java代码的配置方式,用于替代传统的XML配置,通过注解(如@Bean)定义Spring容器的组... 目录JavaConfig 的概念什么是JavaConfig?为什么使用 JavaConfig?Jav

Java数组动态扩容的实现示例

《Java数组动态扩容的实现示例》本文主要介绍了Java数组动态扩容的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1 问题2 方法3 结语1 问题实现动态的给数组添加元素效果,实现对数组扩容,原始数组使用静态分配

Java中ArrayList与顺序表示例详解

《Java中ArrayList与顺序表示例详解》顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构,:本文主要介绍Java中ArrayList与... 目录前言一、Java集合框架核心接口与分类ArrayList二、顺序表数据结构中的顺序表三、常用代码手动

JAVA项目swing转javafx语法规则以及示例代码

《JAVA项目swing转javafx语法规则以及示例代码》:本文主要介绍JAVA项目swing转javafx语法规则以及示例代码的相关资料,文中详细讲解了主类继承、窗口创建、布局管理、控件替换、... 目录最常用的“一行换一行”速查表(直接全局替换)实际转换示例(JFramejs → JavaFX)迁移建

Spring Boot Interceptor的原理、配置、顺序控制及与Filter的关键区别对比分析

《SpringBootInterceptor的原理、配置、顺序控制及与Filter的关键区别对比分析》本文主要介绍了SpringBoot中的拦截器(Interceptor)及其与过滤器(Filt... 目录前言一、核心功能二、拦截器的实现2.1 定义自定义拦截器2.2 注册拦截器三、多拦截器的执行顺序四、过

JAVA线程的周期及调度机制详解

《JAVA线程的周期及调度机制详解》Java线程的生命周期包括NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED,线程调度依赖操作系统,采用抢占... 目录Java线程的生命周期线程状态转换示例代码JAVA线程调度机制优先级设置示例注意事项JAVA线程