Skip to content

🚀 开发你的第一个 Spring Boot 应用程序

本章节将指导您开发一个简单的"Hello World!"Web 应用程序,通过这个实例来体验 Spring Boot 的核心特性。您可以选择 Maven 或 Gradle 作为构建系统。

快速上手建议:您可以直接访问 [start.spring.io](https://start.spring.io) 并选择"Web"启动器来快速生成项目结构,这样就可以立即开始编码了!

📋 前置条件

在开始之前,我们需要确保开发环境已经准备就绪。

Java 环境检查

首先检查您的 Java 版本,确保已安装 Java 17 或更高版本:

bash
java -version

期望输出类似:

openjdk version "17.0.4.1" 2022-08-12 LTS
OpenJDK Runtime Environment (build 17.0.4.1+1-LTS)
OpenJDK 64-Bit Server VM (build 17.0.4.1+1-LTS, mixed mode, sharing)

本示例需要在独立的目录中创建。后续指令假设您已经创建了合适的目录并将其设为当前目录。

Maven 环境检查

如果您选择使用 Maven,请确保已安装 Maven:

bash
mvn -v

期望输出类似:

Apache Maven 3.8.5 (3599d3414f046de2324203b78ddcf9b5e4388aa0)
Maven home: usr/Users/developer/tools/maven/3.8.5
Java version: 17.0.4.1, vendor: BellSoft

Gradle 环境检查

如果您选择使用 Gradle,请确保已安装 Gradle:

bash
gradle --version

期望输出类似:

------------------------------------------------------------
Gradle 8.1.1
------------------------------------------------------------
Build time:   2023-04-21 12:31:26 UTC
Kotlin:       1.8.10
Groovy:       3.0.15
JVM:          17.0.7 (BellSoft 17.0.7+7-LTS)

🔧 项目构建配置

Maven 配置

创建 Maven 项目的核心是pom.xml文件,它是构建项目的配方。

xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
         https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>myproject</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.5.0</version>
    </parent>

    <!-- 其他配置将在这里添加... -->

</project>

您可以通过运行 `mvn package` 来测试构建是否正常工作(现在可以忽略"jar will be empty"的警告)。

Gradle 配置

创建 Gradle 项目需要build.gradle文件,它是构建脚本:

bash
plugins {
    id 'java'
    id 'org.springframework.boot' version '3.5.0'
}

apply plugin: 'io.spring.dependency-management'

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'

repositories {
    mavenCentral()
}

dependencies {
}

TIP

您可以通过运行 gradle classes 来测试构建是否正常工作。

📦 添加依赖项

Spring Boot 提供了多种启动器(Starters),让您可以轻松地向类路径添加所需的 jar 包。启动器为特定类型的应用程序开发提供了常用的依赖项。

Spring Boot Starters 概念图

Maven 依赖配置

由于我们要开发 Web 应用程序,需要添加spring-boot-starter-web依赖。

首先,让我们查看当前的依赖情况:

bash
mvn dependency:tree

输出:

[INFO] com.example:myproject:jar:0.0.1-SNAPSHOT

现在添加 Web 启动器依赖:

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

> `spring-boot-starter-parent`提供了依赖管理,所以您不需要指定"blessed"依赖项的版本标签。

Gradle 依赖配置

同样,对于 Gradle 项目,我们需要添加 Web 启动器:

bash
gradle dependencies

添加依赖项:

bash
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
}

添加依赖后,再次运行依赖命令,您会看到现在包含了许多额外的依赖项,包括 Tomcat Web 服务器和 Spring Boot 本身。

💻 编写代码

现在是时候编写实际的应用程序代码了!我们需要创建一个 Java 或 Kotlin 文件。

项目结构

src/
├── main/
│   ├── java/
│   │   └── com/
│   │       └── example/
│   │           └── MyApplication.java (或 MyApplication.kt)
│   └── resources/
└── test/
    └── java/

应用程序主类

kotlin
package com.example

import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController

@RestController
@SpringBootApplication
class MyApplication {

    @RequestMapping("/")
    fun home() = "Hello World!"

}

fun main(args: Array<String>) {
    runApplication<MyApplication>(*args)
}
java
package com.example;

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

@RestController
@SpringBootApplication
public class MyApplication {

    @RequestMapping("/")
    String home() {
        return "Hello World!";
    }

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

}

虽然代码不多,但包含了很多重要的概念。让我们逐一解析关键部分。

核心注解解析

@RestController 和 @RequestMapping

  • @RestController: 这是一个构造型注解,它为阅读代码的人和 Spring 框架提供提示,表明该类扮演特定角色。在这种情况下,我们的类是一个 Web 控制器。

  • @RequestMapping: 提供"路由"信息,告诉 Spring 任何带有/路径的 HTTP 请求都应该映射到home方法。

> `@RestController`注解告诉 Spring 将结果字符串直接渲染返回给调用者,这是构建 REST API 的常用方式。

@SpringBootApplication 注解

@SpringBootApplication是一个元注解,它组合了以下三个注解:

  • @SpringBootConfiguration: 标识配置类
  • @EnableAutoConfiguration: 启用自动配置
  • @ComponentScan: 启用组件扫描

> **@EnableAutoConfiguration**是最重要的注解,它告诉 Spring Boot 根据您添加的 jar 依赖项"猜测"您想要如何配置 Spring。由于我们添加了`spring-boot-starter-web`,自动配置会认为您正在开发 Web 应用程序并相应地设置 Spring。

INFO

启动器和自动配置自动配置设计为与启动器很好地配合工作,但这两个概念并不直接绑定。您可以自由选择启动器之外的 jar 依赖项,Spring Boot 仍会尽力自动配置您的应用程序。

main 方法

应用程序的最后一部分是main方法,这是遵循 Java 应用程序入口点约定的标准方法。

kotlin
fun main(args: Array<String>) {
    runApplication<MyApplication>(*args)
}

在 Kotlin 中,我们使用runApplication函数来启动 Spring Boot 应用程序。这个函数:

  1. 引导我们的应用程序
  2. 启动 Spring 框架
  3. 启动自动配置的 Tomcat Web 服务器
  4. 接收命令行参数

🚀 运行应用程序

Maven 运行方式

由于使用了spring-boot-starter-parent POM,您可以使用有用的run目标来启动应用程序:

bash
mvn spring-boot:run

您应该看到类似以下的输出:

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _' | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::  (v3.5.0)

........ Started MyApplication in 0.906 seconds

Gradle 运行方式

使用 Gradle 插件,您可以使用bootRun任务:

bash
gradle bootRun

访问应用程序

打开 Web 浏览器访问 http://localhost:8080,您应该看到:

Hello World!

要优雅地退出应用程序,请按 `Ctrl+C`。

📦 创建可执行 Jar 包

在实际业务场景中,我们通常需要将应用程序打包成可执行的 jar 文件以便在生产环境中运行。

可执行 Jar 的概念

可执行 jar(有时称为"uber jars"或"fat jars")是包含编译的类以及代码运行所需的所有 jar 依赖项的归档文件。

> **Java 的限制**: Java 没有提供加载嵌套 jar 文件的标准方法。Spring Boot 采用了不同的方法,允许您直接嵌套 jar 文件。

Maven 打包

要创建可执行 jar,需要将spring-boot-maven-plugin添加到pom.xml中:

xml
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

运行打包命令:

bash
mvn package

打包成功后的输出:

[INFO] Building jar: /Users/developer/example/spring-boot-example/target/myproject-0.0.1-SNAPSHOT.jar
[INFO] --- spring-boot-maven-plugin:3.5.0:repackage (default) @ myproject ---
[INFO] BUILD SUCCESS

您会在target目录中看到:

  • myproject-0.0.1-SNAPSHOT.jar (约 18MB) - 可执行 jar
  • myproject-0.0.1-SNAPSHOT.jar.original - Maven 创建的原始 jar

Gradle 打包

对于 Gradle 项目,运行:

bash
gradle bootJar

您会在build/libs目录中找到生成的 jar 文件。

运行可执行 Jar

使用以下命令运行应用程序:

bash
java -jar target/myproject-0.0.1-SNAPSHOT.jar
# 或者对于Gradle
java -jar build/libs/myproject-0.0.1-SNAPSHOT.jar

📚 实际业务场景应用

场景 1:企业级 REST API 服务

在实际企业开发中,这个简单的"Hello World"应用程序可以扩展为:

kotlin
@RestController
@RequestMapping("/api/v1")
class UserController {

    @GetMapping("/users")
    fun getAllUsers(): List<User> {
        // 返回用户列表
    }

    @PostMapping("/users")
    fun createUser(@RequestBody user: User): User {
        // 创建新用户
    }

    @GetMapping("/health")
    fun healthCheck() = mapOf("status" to "UP", "timestamp" to System.currentTimeMillis())
}

场景 2:微服务架构

在微服务架构中,每个服务都可以是一个独立的 Spring Boot 应用程序:

🎯 最佳实践和注意事项

> **端口冲突**: 默认情况下,Spring Boot 应用程序在 8080 端口运行。如果该端口被占用,您可以通过`application.properties`文件更改端口:

properties
server.port=8090

> **内存使用**: 可执行 jar 文件包含所有依赖项,因此文件大小较大。在生产环境中部署时要考虑内存和存储需求。

📖 总结

通过这个简单的"Hello World"示例,我们学习了:

  1. 环境准备: Java、Maven/Gradle 的安装和配置
  2. 项目配置: 理解pom.xmlbuild.gradle的作用
  3. 依赖管理: Spring Boot 启动器的概念和使用
  4. 核心注解: @SpringBootApplication@RestController@RequestMapping
  5. 应用程序运行: 开发期间和生产环境的不同运行方式
  6. 打包部署: 创建可执行 jar 文件的方法

这个基础示例为更复杂的 Spring Boot 应用程序开发奠定了坚实的基础。在后续的学习中,我们将在此基础上添加数据库集成、安全性、测试等更多功能。

> **下一步建议**: 尝试修改返回的消息,添加更多的端点,或者集成数据库来存储和检索数据。每一步的实践都会让您对 Spring Boot 有更深入的理解!