Bootstrap

springboot 里 包含 starter的包 和不包含 starter的包有什么区别呢


前言

Spring Boot 中,starter 包和非 starter 包的区别主要在于使用方便性、配置简洁性和依赖管理的自动化。

一、区别

1. Starter 包

  • 定义: Spring Boot 提供了一系列 starter 包,它们是预先配置的依赖集合,旨在简化项目的设置。例如,spring-boot-starter-web 是一个用于构建 Web 应用程序的常用 starter,包含了构建 RESTful 服务所需的所有依赖,如 Spring MVC、Jackson、Tomcat 等。

  • 特性:

    • 简化依赖管理: starter 包将相关依赖打包成一个单一的依赖,开发者只需要在 pom.xmlbuild.gradle 中引用这个 starter,就可以自动拉取和配置一系列常用的库,而不需要手动逐一添加和配置。
    • 自动化配置: 使用 starter 包,Spring Boot 会自动配置一些默认的设置。例如,spring-boot-starter-data-jpa 包含 Hibernate 和 Spring Data JPA,并且默认配置了 JPA 属性。
  • 示例:

    <!-- 引入 Web 应用相关的 starter 包 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    

2. 非 Starter 包

  • 定义: 非 starter 包是标准的 Spring 库,通常只提供一个功能模块,而不会自动拉取相关的依赖。例如,spring-corespring-context 就是独立的 Spring 组件库,需要开发者根据需要手动添加依赖和配置。

  • 特性:

    • 灵活性更高: 使用非 starter 包,开发者可以完全控制依赖的版本和配置。对于特定项目需要精确控制依赖的场景,这种方式可能更合适。
    • 手动配置更多: 由于缺乏自动化配置,开发者需要手动编写大量的配置代码。
  • 示例:

    <!-- 手动添加 Spring MVC 依赖 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
    </dependency>
    

3. 主要区别

  1. 易用性: starter 包简化了开发过程,自动管理和配置相关依赖,而非 starter 包需要手动配置。
  2. 配置负担: 使用 starter 包,Spring Boot 提供了自动化配置(基于自动配置类),非 starter 包则需要手动定义 Bean 和属性。
  3. 灵活性: starter 包适合快速开发和原型设计,非 starter 包适合需要精确控制和定制化的场景。

二、含starter包的默认的初始化配置机制

Spring Boot 的 starter 包不仅自动引入相关依赖包,还会进行一些默认的初始化配置。

1. 具体细节

  1. 自动引入依赖: starter 包通过 Maven 或 Gradle 自动添加一系列常用的依赖。例如,spring-boot-starter-data-jpa 会引入 JPA、Hibernate、数据库连接池等所需的依赖。这极大地简化了项目配置,避免了开发者手动逐个添加依赖。

  2. 自动配置: 除了引入依赖,starter 包还会触发 Spring Boot 的自动配置机制(Auto Configuration)。自动配置会根据项目中存在的类或配置来推断出合理的默认配置。例如:

    • 如果引入 spring-boot-starter-web,Spring Boot 会自动配置嵌入式 Tomcat 服务器、Spring MVC 的相关组件等。
    • 使用 spring-boot-starter-data-jpa,Spring Boot 会自动配置 JPA 实体管理器,并提供数据源的默认配置(可以基于 application.properties 进行修改)。

2. 示例

  • Web Starter: 引入 spring-boot-starter-web,自动配置 Tomcat 作为嵌入式服务器、Spring MVC、JSON 解析器等,开发者不需要手动设置这些组件。
  • Data JPA Starter: 引入 spring-boot-starter-data-jpa,自动配置 Hibernate、数据源、事务管理等,简化了数据持久化的配置过程。

三、含starter包的默认配置的配置信息存在哪里

Spring Boot 的默认配置主要来自于其 自动配置机制,通过 spring-boot-autoconfigure 模块提供。具体来说,自动配置会根据应用上下文和类路径中的依赖,提供适当的默认配置。

配置来源

  1. @EnableAutoConfiguration 注解: Spring Boot 使用这个注解来自动配置 Spring 应用程序。它会扫描类路径,寻找所有可能的 @Configuration 类,并有选择性地进行加载。
  2. META-INF/spring.factories 文件: spring-boot-autoconfigure 模块中定义了一个关键文件 spring.factories,这个文件列举了可以进行自动配置的所有类。例如,当你使用 spring-boot-starter-web,会加载 Web 相关的自动配置类,如 WebMvcAutoConfigurationDispatcherServletAutoConfiguration
  3. 默认属性: Spring Boot 提供的默认配置属性存储在 application.propertiesapplication.yml 中,但这些值可以被你自己的配置覆盖。默认值定义在 SpringApplication 类及自动配置类中。例如,嵌入式 Tomcat 的默认端口是 8080,可以通过 server.port 属性更改。

具体例子

  • 数据库配置: 如果 spring-boot-starter-data-jpa 存在,Spring Boot 会自动配置 DataSource 和 JPA 相关设置。如果没有自定义 DataSource,Spring Boot 会尝试使用 H2 内存数据库。
  • Web 配置: 使用 spring-boot-starter-web 时,会自动配置嵌入式服务器(如 Tomcat)、Spring MVC 的视图解析器等。

你可以通过 spring-boot-actuator 模块中的 /actuator/configprops 端点查看应用程序加载的所有配置属性。

相关文档

如果需要深入查看 Spring Boot 的默认配置和自定义选项,可以参考 Spring Boot 官方文档

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;