Spring Boot底层原理实例分析

发布时间:2022-04-06 13:50:49 作者:iii
来源:亿速云 阅读:236

Spring Boot底层原理实例分析

目录

  1. 引言
  2. Spring Boot概述
  3. Spring Boot的启动过程
  4. Spring Boot的自动配置原理
  5. Spring Boot的依赖管理
  6. 服务器">Spring Boot的嵌入式Web服务器
  7. Spring Boot的配置文件
  8. Spring Boot的日志系统
  9. Spring Boot的监控与管理
  10. Spring Boot的测试
  11. Spring Boot的扩展与定制
  12. Spring Boot的常见问题与解决方案
  13. 总结

引言

Spring Boot 是 Spring 生态系统中的一个重要组成部分,它简化了 Spring 应用的开发、部署和管理。Spring Boot 通过自动配置、依赖管理和嵌入式服务器等特性,使得开发者能够快速构建独立运行的、生产级别的 Spring 应用。本文将深入探讨 Spring Boot 的底层原理,并通过实例分析其核心机制。

Spring Boot概述

2.1 Spring Boot的核心特性

Spring Boot 的核心特性包括:

2.2 Spring Boot的优势

Spring Boot 的优势主要体现在以下几个方面:

Spring Boot的启动过程

3.1 SpringApplication的初始化

Spring Boot 应用的启动过程始于 SpringApplication 类的初始化。SpringApplication 是 Spring Boot 的核心类,负责应用的启动和配置。

public static void main(String[] args) {
    SpringApplication.run(MyApplication.class, args);
}

在上述代码中,SpringApplication.run() 方法启动了 Spring Boot 应用。SpringApplication 的初始化过程包括以下几个步骤:

  1. 设置应用的主类SpringApplication 会根据传入的主类(MyApplication.class)来确定应用的入口。
  2. 推断应用类型SpringApplication 会根据类路径中的依赖推断应用的类型(如 Web 应用、非 Web 应用等)。
  3. 加载应用上下文初始化器SpringApplication 会加载并应用 ApplicationContextInitializer,这些初始化器可以在应用上下文创建之前对其进行配置。
  4. 加载应用监听器SpringApplication 会加载并应用 ApplicationListener,这些监听器可以在应用启动的不同阶段执行相应的操作。

3.2 SpringApplication的run方法

SpringApplicationrun 方法是应用启动的核心方法,它负责创建和配置应用上下文,并启动应用。

public ConfigurableApplicationContext run(String... args) {
    // 1. 创建并启动计时器
    StopWatch stopWatch = new StopWatch();
    stopWatch.start();

    // 2. 创建应用上下文
    ConfigurableApplicationContext context = null;
    configureHeadlessProperty();
    SpringApplicationRunListeners listeners = getRunListeners(args);
    listeners.starting();

    try {
        // 3. 准备环境
        ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
        ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments);
        configureIgnoreBeanInfo(environment);

        // 4. 打印 Banner
        Banner printedBanner = printBanner(environment);

        // 5. 创建应用上下文
        context = createApplicationContext();

        // 6. 准备应用上下文
        prepareContext(context, environment, listeners, applicationArguments, printedBanner);

        // 7. 刷新应用上下文
        refreshContext(context);

        // 8. 调用 ApplicationRunner 和 CommandLineRunner
        afterRefresh(context, applicationArguments);

        // 9. 停止计时器并发布应用启动完成事件
        stopWatch.stop();
        if (this.logStartupInfo) {
            new StartupInfoLogger(this.mainApplicationClass).logStarted(getApplicationLog(), stopWatch);
        }
        listeners.started(context);

        // 10. 调用 ApplicationRunner 和 CommandLineRunner
        callRunners(context, applicationArguments);
    } catch (Throwable ex) {
        handleRunFailure(context, ex, listeners);
        throw new IllegalStateException(ex);
    }

    try {
        listeners.running(context);
    } catch (Throwable ex) {
        handleRunFailure(context, ex, null);
        throw new IllegalStateException(ex);
    }

    return context;
}

在上述代码中,run 方法的主要步骤包括:

  1. 创建并启动计时器:用于记录应用启动的时间。
  2. 创建应用上下文:根据应用类型创建相应的应用上下文(如 AnnotationConfigApplicationContextAnnotationConfigServletWebServerApplicationContext)。
  3. 准备环境:加载并配置应用的环境(如配置文件、系统属性等)。
  4. 打印 Banner:在控制台打印 Spring Boot 的启动 Banner。
  5. 创建应用上下文:根据应用类型创建相应的应用上下文。
  6. 准备应用上下文:配置应用上下文,包括设置环境、注册 Bean 等。
  7. 刷新应用上下文:刷新应用上下文,加载并初始化所有的 Bean。
  8. 调用 ApplicationRunner 和 CommandLineRunner:在应用启动完成后,调用所有的 ApplicationRunnerCommandLineRunner
  9. 停止计时器并发布应用启动完成事件:记录应用启动时间,并发布应用启动完成事件。
  10. 调用 ApplicationRunner 和 CommandLineRunner:在应用启动完成后,调用所有的 ApplicationRunnerCommandLineRunner

3.3 Spring Boot的自动配置

Spring Boot 的自动配置是其核心特性之一,它能够根据项目的依赖自动配置 Spring 应用。自动配置的实现依赖于条件注解和自动配置类。

Spring Boot的自动配置原理

4.1 条件注解

条件注解是 Spring Boot 自动配置的基础,它允许根据特定条件来决定是否加载某个配置类或 Bean。常见的条件注解包括:

4.2 自动配置类的加载

Spring Boot 的自动配置类通常位于 META-INF/spring.factories 文件中,该文件定义了所有需要自动加载的配置类。例如:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration

在上述配置中,WebMvcAutoConfigurationDataSourceAutoConfigurationHibernateJpaAutoConfiguration 是 Spring Boot 提供的自动配置类,它们会根据项目的依赖自动配置相应的功能。

4.3 自动配置的实现

自动配置类的实现通常包括以下几个步骤:

  1. 定义配置类:使用 @Configuration 注解定义配置类。
  2. 使用条件注解:在配置类中使用条件注解来控制配置的加载。
  3. 注册 Bean:在配置类中定义并注册 Bean。

例如,WebMvcAutoConfiguration 是 Spring Boot 提供的自动配置类,它负责配置 Spring MVC 的相关功能。以下是 WebMvcAutoConfiguration 的部分代码:

@Configuration(proxyBeanMethods = false)
@ConditionalOnWebApplication(type = Type.SERVLET)
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class,
        ValidationAutoConfiguration.class })
public class WebMvcAutoConfiguration {

    @Bean
    @ConditionalOnMissingBean
    public InternalResourceViewResolver defaultViewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix(this.mvcProperties.getView().getPrefix());
        resolver.setSuffix(this.mvcProperties.getView().getSuffix());
        return resolver;
    }

    @Bean
    @ConditionalOnMissingBean
    public RequestMappingHandlerMapping requestMappingHandlerMapping() {
        RequestMappingHandlerMapping mapping = new RequestMappingHandlerMapping();
        mapping.setOrder(0);
        mapping.setInterceptors(getInterceptors());
        return mapping;
    }
}

在上述代码中,WebMvcAutoConfiguration 使用了多个条件注解来控制配置的加载。例如,@ConditionalOnWebApplication 表示只有在 Web 应用中才会加载该配置类,@ConditionalOnClass 表示只有在类路径中存在 ServletDispatcherServletWebMvcConfigurer 时才会加载该配置类。

Spring Boot的依赖管理

5.1 Spring Boot Starter

Spring Boot Starter 是 Spring Boot 提供的一种依赖管理机制,它通过预定义的依赖集合简化了项目的依赖配置。常见的 Spring Boot Starter 包括:

5.2 依赖传递与版本管理

Spring Boot 通过 spring-boot-dependencies 项目统一管理所有依赖的版本,开发者无需手动指定依赖的版本号。例如,在 pom.xml 中引入 spring-boot-starter-web 时,Spring Boot 会自动引入相关的依赖,并确保它们的版本兼容。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

在上述配置中,spring-boot-starter-web 会自动引入 spring-webspring-webmvctomcat-embed-core 等依赖,并且它们的版本由 Spring Boot 统一管理。

Spring Boot的嵌入式Web服务器

6.1 Tomcat

Tomcat 是 Spring Boot 默认的嵌入式 Web 服务器,它能够处理 HTTP 请求并返回响应。Spring Boot 通过 spring-boot-starter-web 自动引入 Tomcat 依赖,并配置相应的 Web 服务器。

6.2 Jetty

Jetty 是另一种常用的嵌入式 Web 服务器,它比 Tomcat 更轻量级,适合资源受限的环境。开发者可以通过排除 Tomcat 依赖并引入 Jetty 依赖来使用 Jetty 作为 Web 服务器。

<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>

6.3 Undertow

Undertow 是另一种高性能的嵌入式 Web 服务器,它支持异步 I/O 和非阻塞处理,适合高并发的场景。开发者可以通过排除 Tomcat 依赖并引入 Undertow 依赖来使用 Undertow 作为 Web 服务器。

<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-undertow</artifactId>
</dependency>

Spring Boot的配置文件

7.1 配置文件格式

Spring Boot 支持多种配置文件格式,包括 propertiesyamlproperties 文件是传统的键值对格式,而 yaml 文件则更加简洁和易读。

server.port=8080
server.servlet.context-path=/myapp
server:
  port: 8080
  servlet:
    context-path: /myapp

7.2 配置文件的加载顺序

Spring Boot 会按照以下顺序加载配置文件:

  1. 命令行参数:通过命令行传递的参数优先级最高。
  2. 系统属性:通过 System.getProperties() 获取的系统属性。
  3. 环境变量:通过 System.getenv() 获取的环境变量。
  4. 配置文件application.propertiesapplication.yml 文件。
  5. 默认配置:Spring Boot 提供的默认配置。

7.3 配置文件的优先级

Spring Boot 会按照以下优先级加载配置文件:

  1. application-{profile}.propertiesapplication-{profile}.yml:根据激活的 Profile 加载相应的配置文件。
  2. application.propertiesapplication.yml:加载通用的配置文件。
  3. 默认配置:Spring Boot 提供的默认配置。

Spring Boot的日志系统

8.1 日志框架的选择

Spring Boot 支持多种日志框架,包括 Logback、Log4j2 和 Java Util Logging。默认情况下,Spring Boot 使用 Logback 作为日志框架。

8.2 日志配置

Spring Boot 的日志配置可以通过 application.propertiesapplication.yml 文件进行配置。例如:

logging.level.root=INFO
logging.level.org.springframework.web=DEBUG
logging.file.name=myapp.log
logging.file.path=/var/logs
logging:
  level:
    root: INFO
    org.springframework.web: DEBUG
  file:
    name: myapp.log
    path: /var/logs

8.3 日志级别

Spring Boot 支持多种日志级别,包括 TRACEDEBUGINFOWARNERRORFATAL。开发者可以根据需要调整日志级别,以便更好地监控应用的运行状态。

Spring Boot的监控与管理

9.1 Actuator

Spring Boot Actuator 是 Spring Boot 提供的监控和管理工具,它能够暴露应用的运行状态和指标信息。通过 Actuator,开发者可以监控应用的健康状况、内存使用情况、线程状态等。

9.2 健康检查

Spring Boot Actuator 提供了健康检查功能,开发者可以通过 /actuator/health 端点查看应用的健康状况。例如:

”`json { “status”: “UP”, “components”: { “diskSpace”: { “status”: “UP”, “details”: { “total”: 500107862016, “free”: 400107862016

推荐阅读:
  1. spring底层原理解析
  2. spring boot的运行原理

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

spring boot

上一篇:C语言怎么实现合式公式的判断

下一篇:Java集合框架的数据结构是什么

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》