第2章:Spring Boot 入门

2.1 Spring Boot 简介与特性

文字讲解

Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。它并非要取代Spring框架,而是作为Spring的“脚手架”,通过“约定优于配置”的理念,让开发者能够快速地创建出独立的、生产级的、基于Spring的应用程序。

核心特性:

  • 创建独立的Spring应用:可以打包成可执行的JAR文件,通过java -jar命令直接运行。
  • 内嵌Web服务器:内嵌Tomcat、Jetty或Undertow等服务器,无需部署WAR文件。
  • 提供“Starter”依赖:简化构建配置,自动管理依赖版本,避免版本冲突。
  • 自动配置Spring和第三方库:根据类路径下的JAR包和Bean定义,自动配置应用程序,大大减少了XML配置。
  • 提供生产就绪的功能:如指标、健康检查和外部化配置等。

2.2 快速创建第一个Spring Boot应用

文字讲解

创建Spring Boot应用最快捷的方式是使用Spring Initializr (https://start.spring.io/)。这是一个Web工具,可以帮助我们生成一个基本的项目结构。

步骤:

  1. 访问 start.spring.io
  2. 选择项目类型(Maven/Gradle)、语言(Java/Kotlin/Groovy)和Spring Boot版本。
  3. 填写项目元数据(Group, Artifact)。
  4. 在“Dependencies”部分,添加Spring Web依赖。
  5. 点击“Generate”,下载项目压缩包并解压。
代码示例

使用IDE打开项目后,您会看到一个主应用程序类:

DemoApplication.java

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class DemoApplication {

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

    @GetMapping("/")
    public String hello() {
        return "Hello, Spring Boot!";
    }
}

代码解释:

  • @SpringBootApplication:这是一个复合注解,包含了@Configuration@EnableAutoConfiguration@ComponentScan。它是Spring Boot应用的入口点。
  • @RestController:一个方便的注解,结合了@Controller@ResponseBody,表示这个类中的所有方法返回的都是JSON或文本数据,而不是视图。
  • @GetMapping("/"):将HTTP GET请求映射到hello()方法上。

运行main方法,应用将在内嵌的Tomcat服务器上启动(默认端口8080)。访问http://localhost:8080,您将看到“Hello, Spring Boot!”。


2.3 Spring Boot 启动原理分析

文字讲解

Spring Boot的启动过程核心在于SpringApplication.run()方法。这个方法执行了以下关键步骤:

  1. 创建SpringApplication实例:根据类路径推断应用类型(如SERVLET、REACTIVE)。
  2. 获取所有ApplicationContextInitializer:用于在ApplicationContext刷新之前进行初始化。
  3. 获取所有ApplicationListener:用于监听SpringApplication生命周期中的各种事件。
  4. 推断主应用程序类:找到定义main方法的类。
  5. 运行run方法
    • 启动一个计时器。
    • 准备环境(Environment),加载外部化配置。
    • 创建ApplicationContext(应用上下文)。
    • 执行ApplicationContext的刷新(refresh),这是Spring容器启动的核心,包括Bean的实例化和依赖注入。
    • 调用ApplicationRunnerCommandLineRunner
流程图:Spring Boot启动流程
用户 main()方法 SpringApplication ApplicationContext 运行main方法 调用SpringApplication.run() 1. 创建实例,准备环境 2. 创建ApplicationContext 3. 加载Bean定义,执行自动配置 4. 刷新上下文,实例化Bean 5. 调用Runners 应用启动完成 用户 main()方法 SpringApplication ApplicationContext

2.4 自动配置机制详解

文字讲解

自动配置是Spring Boot的“魔法”所在。其核心是@EnableAutoConfiguration注解。

  1. @EnableAutoConfiguration:这个注解通过@Import(AutoConfigurationImportSelector.class)导入了一个选择器。
  2. AutoConfigurationImportSelector:这个类会扫描所有JAR包中的META-INF/spring.factories文件。
  3. spring.factories:这个文件定义了大量的自动配置类(...AutoConfiguration)。这些配置类本身是@Configuration注解的类。
  4. 条件注解(@ConditionalOn...:每个自动配置类都使用了一系列的条件注解,如@ConditionalOnClass(当类路径下存在某个类时生效)、@ConditionalOnBean(当容器中存在某个Bean时生效)等。只有当所有条件都满足时,该配置类才会生效。

例如,DataSourceAutoConfiguration会检查类路径下是否存在DataSource.class,如果存在,它就会尝试配置一个数据源Bean。


2.5 Spring Boot 配置文件详解

文字讲解

Spring Boot允许使用application.propertiesapplication.yml文件来外部化配置。

  • application.properties:使用键值对格式。

    server.port=8081
    spring.application.name=my-app
    
  • application.yml:使用YAML格式,更具层次感。

    server:
      port: 8081
    spring:
      application:
        name: my-app
    

Spring Boot的配置加载有优先级顺序,常见的优先级从高到低:

  1. 命令行参数 (--server.port=9000)
  2. Java系统属性 (-Dserver.port=9001)
  3. 操作系统环境变量
  4. 项目根目录下的/config子目录中的配置文件
  5. 项目根目录下的配置文件
  6. 类路径下的/config子目录中的配置文件
  7. 类路径下的配置文件

这种优先级机制使得我们可以在不同环境中用更高优先级的配置覆盖默认值。


本章总结

本章我们迈出了使用Spring Boot的第一步。我们学会了如何快速创建一个Web应用,并理解了其背后的启动原理和自动配置机制。自动配置通过条件注解智能地装配Bean,而外部化配置文件则为我们提供了极大的灵活性。掌握了这些基础,我们就为后续深入学习Web开发、数据访问等功能打下了坚实的基础。

你可能感兴趣的:(第2章:Spring Boot 入门)