SpringBoot概述

SpringBoot概述

SpringBoot的特性

起步依赖(Starter POMs)

  • Spring Boot 提供了一系列的 Starter 依赖,这些依赖将常用的库和配置打包在一起,开发者只需引入一个 Starter 依赖,即可自动引入相关的库和默认配置。

  • Stater 通常用于管理项目的初始结构和依赖版本,提供一些基础配置和模板,帮助快速搭建项目框架。

  • 它主要包含项目的基础配置、依赖管理(如 Maven 或 Gradle 配置)和一些通用的代码模板。

  • Stater 本身不包含具体业务逻辑,更多是提供一种标准化的项目结构。

    • Autoconfig 是 Spring Boot 中的自动配置模块,负责根据项目依赖自动配置相应的 Bean 和组件。
    • 它包含实际的配置代码,根据条件(如类路径、配置文件等)决定如何配置应用。
  • 优点:
    • 简化依赖管理:无需手动添加多个依赖,Starter 依赖会自动引入相关的库。
    • 版本兼容性:Spring Boot 管理的依赖版本经过严格测试,确保兼容性。
    • 开箱即用:Starter 依赖通常包含默认配置,开发者可以直接使用。
  • 常见的 Starter 依赖:
    • Web 开发spring-boot-starter-web
      • 包含 Spring MVC、Tomcat、Jackson 等。
    • 数据访问spring-boot-starter-data-jpa
      • 包含 Spring Data JPA、Hibernate、数据源配置等。
    • 安全控制spring-boot-starter-security
      • 包含 Spring Security 相关依赖。
    • 测试spring-boot-starter-test
      • 包含 JUnit、Mockito、Spring Test 等测试框架。
  • 依赖版本管理

    • Spring Boot 通过 Bill of Materials (BOM) 机制管理依赖版本。在 spring-boot-starter-parentspring-boot-dependencies 中定义了所有依赖的版本号,开发者无需手动指定版本。

      • 优点

        • 版本一致性:所有依赖的版本由 Spring Boot 统一管理,避免版本冲突。
        • 简化配置:无需在 pom.xml 中为每个依赖指定版本号。
      • 继承 spring-boot-starter-parent

        • pom.xml 中继承 spring-boot-starter-parent,即可使用 Spring Boot 的依赖版本管理。

        • <parent>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-parent</artifactId>
              <version>3.1.0</version> <!-- 使用最新版本 -->
          </parent>
          
        • 自动继承 Spring Boot 的默认配置和插件配置。

        • 如果项目已经继承了其他父 POM,则无法使用此方式。

      • 引入 spring-boot-dependencies

        • 如果项目无法继承 spring-boot-starter-parent,可以通过 dependencyManagement 引入 spring-boot-dependencies

        • <dependencyManagement>
              <dependencies>
                  <dependency>
                      <groupId>org.springframework.boot</groupId>
                      <artifactId>spring-boot-dependencies</artifactId>
                      <version>3.1.0</version> <!-- 使用最新版本 -->
                      <type>pom</type>
                      <scope>import</scope>
                  </dependency>
              </dependencies>
          </dependencyManagement>
          
        • 灵活性高,适合需要自定义父 POM 的项目。

        • 可以与其他 BOM 文件一起使用。

    • 虽然 Spring Boot 提供了默认的依赖版本,但开发者可以根据需要覆盖这些版本。

      • 优点:
        • 灵活性:开发者可以自定义依赖版本,满足特定需求。
        • 覆盖版本时需确保新版本与 Spring Boot 的其他依赖兼容。
        • 建议优先使用 Spring Boot 管理的版本,除非有特殊需求。
    • Spring Boot 支持排除不需要的传递依赖,避免冲突或冗余。

      • 优点:
        • 减少冗余:排除不需要的依赖,减小项目体积。
        • 解决冲突:排除冲突的依赖版本,确保项目正常运行。

自动配置(Auto-Configuration)

  • Spring Boot 的自动配置(Auto-Configuration)是其核心特性之一,旨在减少开发者的配置工作,通过智能推断和默认配置,快速启动和运行 Spring 应用。

  • Spring Boot 的自动配置基于以下原则:

    • 约定优于配置:提供合理的默认配置,开发者只需在需要时覆盖默认行为。
    • 条件化配置:根据项目的依赖和类路径中的类,动态决定是否启用某些配置。
    • 零 XML 配置:完全基于 Java 注解和条件化配置,无需编写 XML 文件。
  • 自动配置实现原理

    • 条件注解(Conditional Annotations)

      • Spring Boot 使用一系列条件注解来决定是否加载某个配置类或 Bean。常见的条件注解包括:

        • @ConditionalOnClass:当类路径中存在指定的类时,才加载配置。

        • @ConditionalOnMissingBean:当容器中不存在指定的 Bean 时,才加载配置。

        • @ConditionalOnProperty:当配置文件中存在指定的属性时,才加载配置。

        • @ConditionalOnWebApplication:当应用是 Web 应用时,才加载配置。

        • @Configuration
          @ConditionalOnClass(DataSource.class)
          @ConditionalOnMissingBean(DataSource.class)
          public class DataSourceAutoConfiguration {
              // 自动配置数据源
          }
          
        • 表示当类路径中存在 DataSource.class 且容器中没有 DataSource Bean 时,才会自动配置数据源(也就是导入了DataSource 相关jar包之后,该class文件会在项目的类路径下)

    • 自动配置类

      • @EnableAutoConfiguration 是 Spring Boot 自动装配的核心注解。它的作用是启用 Spring Boot 的自动配置机制。
        • @SpringBootApplication 注解中已经包含了 @EnableAutoConfiguration,因此大多数情况下不需要显式使用 @EnableAutoConfiguration
        • @EnableAutoConfiguration 会扫描类路径下的依赖,并根据条件自动配置 Spring 应用。
      • Spring Boot 的自动配置类通常位于 spring-boot-autoconfigure 模块中,命名规则为 XXXAutoConfiguration。例如:
        • DataSourceAutoConfiguration:自动配置数据源。
        • WebMvcAutoConfiguration:自动配置 Spring MVC。
        • JacksonAutoConfiguration:自动配置 JSON 序列化。
      • 这些类通过 @Configuration 注解标识,并通过条件注解控制是否生效。
    • spring.factories 文件

      • Spring Boot 通过 META-INF/spring.factories 文件加载自动配置类。该文件中列出了所有自动配置类的全限定名,

      • org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
        com.example.MyAutoConfiguration,\
        org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration
        
      • Spring Boot 在启动时会读取该文件,并根据条件注解决定是否加载这些配置类。

      • 在 Spring Boot 2.x 及更早版本中,META-INF/spring.factories 是自动配置的核心文件。

        • 特点
          • 每一行都是一个接口或注解的全限定名,后面跟着实现类或配置类的全限定名。
          • 多个类之间用逗号分隔。
        • 缺点:
          • 文件格式不够直观,容易出错。
          • 不支持模块化加载,所有配置类都集中在一个文件中。
      • 在 Spring Boot 3.0 中,Spring 团队引入了一种新的机制来替代 META-INF/spring.factories,即 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件。

        • 每一行都是一个自动配置类的全限定名。

        • com.example.MyAutoConfiguration
          com.example.AnotherAutoConfiguration
          
        • 文件路径固定为 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

    • 禁用自动配置

      • 如果不需要某些自动配置,可以使用 @EnableAutoConfigurationexclude 属性:

        • @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
          public class MyApplication {
              public static void main(String[] args) {
                  SpringApplication.run(MyApplication.class, args);
              }
          }
          
        • 或者在配置文件中禁用

        • spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
          
  • 自定义自动配置类

    • 创建自定义的 XXXAutoConfiguration 类。
    • 使用条件注解控制配置的加载。
    • spring.factories 文件中注册自动配置类。

独立运行(Standalone)

  • Spring Boot 的独立运行(Standalone)特性是其核心优势之一,允许开发者将应用打包成可执行的 JAR 或 WAR 文件,无需依赖外部应用服务器(如 Tomcat、Jetty 等)。
  • 独立运行的核心思想
    • Spring Boot 的独立运行基于以下原则:
      • 内嵌服务器:Spring Boot 应用内嵌了 Tomcat、Jetty 或 Undertow 服务器,无需额外部署。Spring Boot 会自动启动内嵌服务器。
        • Tomcat:默认内嵌服务器,适合大多数 Web 应用。
        • Jetty:轻量级服务器,适合资源受限的环境。
        • Undertow:高性能服务器,适合高并发场景。
      • 可执行 JAR/WAR:应用可以打包成包含所有依赖的可执行文件,直接通过 java -jar 命令运行。这些文件包含以下内容:
        • 应用代码:编译后的 Java 类文件。
        • 依赖库:所有第三方库和 Spring Boot 的依赖。
        • 内嵌服务器:Tomcat、Jetty 或 Undertow。
        • 启动脚本:用于启动应用的脚本。
      • 简化部署:减少对外部环境的依赖,适合云原生和容器化部署。

配置的优先级顺序

配置优先级如下,从高到底依次为:

  • 命令行参数
  • Java 系统属性System.getProperties())。
  • 操作系统环境变量
  • 外部配置文件(按以下顺序加载):
    • 当前目录的 /config 子目录。
    • 当前目录。
    • classpath 下的 /config 目录。
    • classpath 根目录。
  • Profile 特定的配置文件application-{profile}.propertiesapplication-{profile}.yml)。
  • 默认配置文件application.propertiesapplication.yml)。
  • @Configuration 类中的 @PropertySource
  • Spring Boot 默认属性

注意点:

  • 优先级越低的配置越会优先读取,后加载的配置会覆盖前面的配置

静态资源目录

Spring Boot 默认会在以下路径中查找静态资源:

  • classpath:/static/
  • classpath:/public/
  • classpath:/resources/
  • classpath:/META-INF/resources/

需要将静态资源放到对应目录下才能正确找到静态资源文件

Spring Boot 在加载静态资源时,会按照以下优先级查找:优先级从高到低依次为

  1. classpath:/META-INF/resources/
  2. classpath:/resources/
  3. classpath:/static/
  4. classpath:/public/

如果多个目录中存在同名文件,优先级高的目录中的文件会被加载。

posted @ 2025-03-18 15:34  QAQ001  阅读(34)  评论(0)    收藏  举报