【Spring Boot 】详解

Spring Boot 详解

一、Spring Boot 概述

(一)产生背景

随着 Java 应用的日益复杂,传统 Spring 框架在项目搭建与配置方面愈发繁琐,大量的 XML 配置、依赖管理等工作耗费开发者诸多精力。为解决这些痛点,Spring Boot 应运而生,旨在简化 Spring应用的初始搭建以及开发过程,让开发者能更聚焦于业务逻辑实现。

(二)特点与核心优势

1. 自动配置

Spring Boot 的自动配置是其一大亮点。

其核心原理基于条件注解(如 @Conditional 及其衍生注解)以及大量的配置类。以下是部分关键源码展示:

java 复制代码
@Configuration
@ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class })
@EnableConfigurationProperties(DataSourceProperties.class)
@Import({ DataSourceAutoConfiguration.DataSourceInitializerConfiguration.class,
        DataSourceAutoConfiguration.DataSourceJmxConfiguration.class })
public class DataSourceAutoConfiguration {

    // 内部有诸多方法和逻辑用于根据条件判断是否要创建数据源相关的配置以及如何配置
    @Configuration
    @Conditional(EmbeddedDatabaseCondition.class)
    @ConditionalOnMissingBean({ DataSource.class, XADataSource.class })
    protected static class EmbeddedDatabaseConfiguration {
        // 比如这里根据是否存在嵌入式数据库相关类等条件,来决定是否创建嵌入式数据库的配置
        @Bean
        @ConfigurationProperties(prefix = "spring.datasource.embedded")
        public EmbeddedDatabaseFactoryBean embeddedDatabaseFactory(EmbeddedDatabaseType databaseType) {
            EmbeddedDatabaseFactoryBean factory = new EmbeddedDatabaseFactoryBean();
            factory.setDatabaseType(databaseType);
            return factory;
        }
    }
}
  • 从源码角度看,像 DataSourceAutoConfiguration 这样的自动配置类,会根据类路径下是否存在特定的类(通过 @ConditionalOnClass 判断)等诸多条件,来决定是否要进行数据源相关配置的创建以及初始化。Spring Boot 启动时会扫描所有的自动配置类,满足条件的配置就会生效,从而减少了开发者手动配置数据源等繁琐操作。
  • 在性能方面,自动配置在启动阶段虽需遍历大量的配置类并判断条件,但得益于条件缓存等机制,后续重复启动的性能损耗不大。应用场景上,适用于各种规模的 Spring 项目,尤其新项目快速搭建基础环境时,无需开发者深入了解每个组件的详细配置细节。
2. 起步依赖

Spring Boot 的起步依赖通过 spring-boot-starter 系列的依赖管理机制实现。

它将相关功能模块所需的依赖进行了整合打包,例如 spring-boot-starter-web 会包含 Spring Web 开发所需的 Spring、Servlet、Tomcat 等相关依赖。

在 spring-boot-dependencies 这个父项目的 pom.xml 文件中有核心的依赖管理配置,如下(简化示意):

xml 复制代码
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>${spring-boot.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!-- 众多其他起步依赖配置 -->
    </dependencies>
</dependencyManagement>

这样开发者只需引入对应的起步依赖,就能确保项目具备相应功能模块的完整依赖,避免了版本冲突等问题。性能上,减少了开发者查找和管理众多单个依赖版本的时间成本。应用场景广泛,无论是小型的 API 服务开发还是大型企业级应用构建,都能快速引入所需功能依赖。

(三)项目搭建流程

以使用 IDEA 为例,新建项目时选择 Spring Initializr 模板,填写项目基本信息(如项目名、包名等),然后在依赖选择界面勾选所需的起步依赖(如 Web 开发相关依赖),点击完成即可创建一个简单的 Spring Boot 项目,项目结构中会自动生成启动类等基础代码,方便后续开发。

二、Spring Boot 配置文件

(一)格式与作用

  • application.properties:是传统的键值对格式配置文件
    例如:properties:
yaml 复制代码
server:
  port: 8080
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test

配置文件用于定制项目的各类参数,涵盖服务器端口、数据库连接、日志级别等多方面,是调整项目运行行为的关键所在。

(二)常用配置项

服务器相关配置:
  • server.port:用于指定项目启动后监听的端口号,源码中在 ServerProperties 类里有对应的属性及 setter 方法(部分简化源码):
java 复制代码
@ConfigurationProperties(prefix = "server", ignoreUnknownFields = true)
public class ServerProperties {
    private int port = 8080;
    public void setPort(int port) {
        this.port = port;
    }
    // 还有诸多其他服务器相关属性及配置逻辑
}

当修改配置文件中的 server.port 值时,Spring Boot 在启动过程中会通过属性绑定机制将该值设置到 ServerProperties 类对应的 port 属性上,进而影响服务器启动监听的端口。性能方面,端口配置加载简单快速,几乎不产生额外性能开销。应用场景为不同环境(开发、测试、生产)下需要切换端口时使用。

  • 数据库连接配置:像 spring.datasource.url、spring.datasource.username、spring.datasource.password 等配置项用于连接数据库。在 DataSourceAutoConfiguration 等相关配置类中,会读取这些配置值来构建数据源对象,其性能影响取决于数据库驱动等底层实现,应用场景自然是所有需要与数据库交互的项目都需配置。

三、Spring Boot 中集成 Web 框架及内置服务器相关

(一)集成 Spring Web

Spring Boot 集成 Spring Web 时,引入 spring-boot-starter-web 起步依赖后,内部通过自动配置机制完成了诸多设置。在 WebMvcAutoConfiguration 这个关键的自动配置类中(部分源码展示):

java 复制代码
@Configuration
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class })
public class WebMvcAutoConfiguration {

    // 配置了默认的 DispatcherServlet,它是 Spring Web 中处理请求分发等核心逻辑的组件
    @Bean
    public DispatcherServlet dispatcherServlet() {
        return new DispatcherServlet();
    }

    // 还有配置视图解析器、静态资源处理等诸多与 Web 开发紧密相关的逻辑和组件配置
    @Configuration
    @Import(EnableWebMvcConfiguration.class)
    public static class WebMvcAutoConfigurationAdapter extends WebMvcConfigurerAdapter {
        // 比如添加拦截器的配置逻辑等
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            // 具体的添加逻辑示例,可自定义拦截器添加在此处
        }
    }
}

从源码可知,它会根据条件判断项目是否是基于 Servlet 的 Web 应用等情况,自动创建 DispatcherServlet 等核心组件,并配置相关的拦截器、视图解析器等,方便开发者快速开展 Web 开发。性能上,由于自动配置了常用的高效处理逻辑,在处理常规 Web 请求时性能表现良好,适合各类 Web 应用开发场景,从小型的网站后端到大型的企业级 Web 服务都适用。

(二)集成 Spring WebFlux

对于 Spring WebFlux,在引入 spring-boot-starter-webflux 起步依赖后,同样有对应的自动配置类发挥作用,基于响应式编程模型构建非阻塞式的 Web 应用。例如 WebFluxAutoConfiguration 类(部分源码示意):

java 复制代码
@Configuration
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.REACTIVE)
@ConditionalOnClass({ WebFluxConfigurer.class, ReactiveWebServerFactory.class })
@ConditionalOnMissingBean(WebFluxConfigurationSupport.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter({ ReactiveWebServerFactoryAutoConfiguration.class })
public class WebFluxAutoConfiguration {

    // 配置响应式的 Web 服务器工厂等核心组件,用于创建响应式的服务器实例
    @Bean
    public ReactiveWebServerFactory reactiveWebServerFactory() {
        // 根据具体条件,比如配置选择创建不同类型(如 Netty、Tomcat 等支持的响应式模式)的服务器工厂
        return new DefaultReactiveWebServerFactory();
    }

    // 配置路由等响应式 Web 相关逻辑,使得请求能正确路由到对应的处理器方法
    @Configuration
    @Import(EnableWebFluxConfiguration.class)
    public static class WebFluxAutoConfigurationAdapter extends WebFluxConfigurerAdapter {
        @Override
        public void configureRoutes(RouterFunctionRegistration registration) {
            // 自定义路由配置逻辑示例,可将请求映射到具体的响应式处理器函数上
        }
    }
}

其性能优势在于应对高并发场景时,基于非阻塞的 I/O 模型,能更高效地利用系统资源,减少线程阻塞等待时间。应用场景多集中在需要处理大量并发请求且对响应及时性要求高的场景,比如实时数据推送、大规模 API 网关等项目。

(三)内置服务器的切换及配置方法

Spring Boot 内置了 Tomcat、Jetty、Undertow 等服务器。以切换服务器为例,在 pom.xml 文件中排除默认的服务器依赖(如排除 Tomcat 依赖),再引入想要使用的服务器依赖即可实现切换。

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-core</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-server</artifactId>
    <version>9.4.46.v20220331</version>
</dependency>

在源码层面,ServletWebServerFactoryAutoConfiguration 等配置类会根据项目依赖情况创建对应的服务器实例(如 TomcatServletWebServerFactory 创建 Tomcat 服务器实例),切换依赖就改变了实例化的服务器类型。不同服务器在性能上各有优劣,Tomcat 通用性强、应用广泛;Jetty 启动快,在轻量级应用中有优势;Undertow 在高并发下性能出色。应用场景可根据项目对性能、资源占用等方面的需求来选择切换使用。

Spring Boot 通过其强大的自动配置、方便的配置文件以及灵活的 Web 框架集成与内置服务器管理等功能,极大地简化了 Spring

应用开发过程,在众多 Java 项目开发场景中都有着广泛且重要的应用。

相关推荐
Seven978 分钟前
了解GC吗?什么是GC?
java
雷渊9 分钟前
微服务中为什么要设计不同的服务和不同的数据对象,体现了一个什么样的设计思想?
后端
Edingbrugh.南空22 分钟前
Flink ClickHouse 连接器维表源码深度解析
java·clickhouse·flink
无奈何杨37 分钟前
CoolGuard风控中新增移动距离和移动速度指标
前端·后端
掘金-我是哪吒42 分钟前
分布式微服务系统架构第157集:JavaPlus技术文档平台日更-Java多线程编程技巧
java·分布式·微服务·云原生·架构
飞翔的佩奇1 小时前
Java项目:基于SSM框架实现的忘忧小区物业管理系统【ssm+B/S架构+源码+数据库+毕业论文+开题报告】
java·数据库·mysql·vue·毕业设计·ssm框架·小区物业管理系统
程序员爱钓鱼1 小时前
Go语言泛型-泛型约束与实践
前端·后端·go
寻月隐君1 小时前
保姆级教程:Zsh + Oh My Zsh 终极配置,让你的 Ubuntu 终端效率倍增
linux·后端·命令行
程序员爱钓鱼1 小时前
Go语言泛型-泛型对代码结构的优化
后端·google·go
这里有鱼汤1 小时前
“对象”?对象你个头!——Python世界观彻底崩塌的一天
后端·python