(window.webpackJsonp=window.webpackJsonp||[]).push([[404],{836:function(r,t,e){"use strict";e.r(t);var a=e(56),n=Object(a.a)({},(function(){var r=this,t=r.$createElement,e=r._self._c||t;return e("ContentSlotsDistributor",{attrs:{"slot-key":r.$parent.slotKey}},[e("h1",{attrs:{id:"开始"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#开始"}},[r._v("#")]),r._v(" 开始")]),r._v(" "),e("p",[r._v("如果你要开始使用 Spring boot,或者一般的“ Spring”,那么请阅读这一部分。它回答了基本的“什么?”、“怎么做?”和“为什么?”的问题。它包括对 Spring 启动的介绍,以及安装说明。然后,我们将带领你构建你的第一个 Spring 启动应用程序,并在此讨论一些核心原则。")]),r._v(" "),e("h2",{attrs:{id:"_1-引入-spring-引导"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#_1-引入-spring-引导"}},[r._v("#")]),r._v(" 1. 引入 Spring 引导")]),r._v(" "),e("p",[r._v("Spring 引导帮助你创建可以运行的独立的、基于生产级别 Spring 的应用程序。我们对 Spring 平台和第三方库持有一种固执己见的观点,这样你就可以在开始时尽量减少麻烦。大多数 Spring 启动应用程序只需要很少的 Spring 配置。")]),r._v(" "),e("p",[r._v("你可以使用 Spring boot 来创建 Java 应用程序,这些应用程序可以通过使用"),e("code",[r._v("java -jar")]),r._v("或更传统的 WAR 部署来启动。我们还提供了一个运行“ Spring 脚本”的命令行工具。")]),r._v(" "),e("p",[r._v("我们的主要目标是:")]),r._v(" "),e("ul",[e("li",[e("p",[r._v("为所有 Spring 开发提供一种从根本上更快且广泛获得的入门体验。")])]),r._v(" "),e("li",[e("p",[r._v("在需求开始偏离默认值时,不要拘泥于常规,但要尽快摆脱。")])]),r._v(" "),e("li",[e("p",[r._v("提供一系列非功能特性,这些特性是大型项目类所共有的(例如嵌入式服务器、安全性、度量、健康检查和外部化配置)。")])]),r._v(" "),e("li",[e("p",[r._v("绝对不需要代码生成,也不需要 XML 配置。")])])]),r._v(" "),e("h2",{attrs:{id:"_2-系统要求"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#_2-系统要求"}},[r._v("#")]),r._v(" 2. 系统要求")]),r._v(" "),e("p",[r._v("Spring Boot2.6.4 要求"),e("a",{attrs:{href:"https://www.java.com",target:"_blank",rel:"noopener noreferrer"}},[r._v("Java 8"),e("OutboundLink")],1),r._v("并且兼容到并包括 Java17。"),e("a",{attrs:{href:"https://docs.spring.io/spring-framework/docs/5.3.16/reference/html/",target:"_blank",rel:"noopener noreferrer"}},[r._v("Spring Framework 5.3.16"),e("OutboundLink")],1),r._v("或以上也是必需的。")]),r._v(" "),e("p",[r._v("为以下构建工具提供了明确的构建支持:")]),r._v(" "),e("table",[e("thead",[e("tr",[e("th",[r._v("Build Tool")]),r._v(" "),e("th",[r._v("版本")])])]),r._v(" "),e("tbody",[e("tr",[e("td",[r._v("Maven")]),r._v(" "),e("td",[r._v("3.5+")])]),r._v(" "),e("tr",[e("td",[r._v("Gradle")]),r._v(" "),e("td",[r._v("6.8.x、6.9.x 和 7.x")])])])]),r._v(" "),e("h3",{attrs:{id:"_2-1-servlet-集装箱"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#_2-1-servlet-集装箱"}},[r._v("#")]),r._v(" 2.1. Servlet 集装箱")]),r._v(" "),e("p",[r._v("Spring 启动支持以下嵌入式 Servlet 容器:")]),r._v(" "),e("table",[e("thead",[e("tr",[e("th",[r._v("Name")]),r._v(" "),e("th",[r._v("Servlet 版本")])])]),r._v(" "),e("tbody",[e("tr",[e("td",[r._v("Tomcat 9.0")]),r._v(" "),e("td",[r._v("4.0")])]),r._v(" "),e("tr",[e("td",[r._v("Jetty 9.4")]),r._v(" "),e("td",[r._v("3.1")])]),r._v(" "),e("tr",[e("td",[r._v("Jetty 10.0")]),r._v(" "),e("td",[r._v("4.0")])]),r._v(" "),e("tr",[e("td",[r._v("Undertow 2.0")]),r._v(" "),e("td",[r._v("4.0")])])])]),r._v(" "),e("p",[r._v("你还可以将 Spring 引导应用程序部署到任何 Servlet 3.1+ 兼容容器。")]),r._v(" "),e("h2",{attrs:{id:"_3-安装-spring-启动"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#_3-安装-spring-启动"}},[r._v("#")]),r._v(" 3. 安装 Spring 启动")]),r._v(" "),e("p",[r._v("Spring 启动可以与“经典”Java 开发工具一起使用,也可以作为命令行工具安装。无论哪种方式,你都需要"),e("a",{attrs:{href:"https://www.java.com",target:"_blank",rel:"noopener noreferrer"}},[r._v("Java SDK v1.8"),e("OutboundLink")],1),r._v("或更高的值。在开始之前,你应该使用以下命令检查当前的 Java 安装:")]),r._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[r._v("$ java -version\n")])])]),e("p",[r._v("如果你是 Java 开发的新手,或者你想要尝试 Spring 引导,那么你可能想要首先尝试"),e("a",{attrs:{href:"#getting-started.installing.cli"}},[r._v("Spring Boot CLI")]),r._v("(命令行接口)。否则,请继续阅读“经典”安装说明。")]),r._v(" "),e("h3",{attrs:{id:"_3-1-java-开发人员的安装说明"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#_3-1-java-开发人员的安装说明"}},[r._v("#")]),r._v(" 3.1.Java 开发人员的安装说明")]),r._v(" "),e("p",[r._v("你可以以与任何标准 Java 库相同的方式使用 Spring boot。要做到这一点,在你的 Classpath 中包含适当的"),e("code",[r._v("spring-boot-*.jar")]),r._v("文件。 Spring 启动不需要任何特殊的工具集成,因此可以使用任何 IDE 或文本编辑器。此外, Spring 引导应用程序没有什么特别之处,因此你可以像运行任何其他 Java 程序一样运行和调试 Spring 引导应用程序。")]),r._v(" "),e("p",[r._v("尽管你"),e("em",[r._v("Coul")]),r._v("复制了 Spring 引导 JAR,但我们通常建议你使用支持依赖管理的构建工具(例如 Maven 或 Gradle)。")]),r._v(" "),e("h4",{attrs:{id:"_3-1-1-maven-安装"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#_3-1-1-maven-安装"}},[r._v("#")]),r._v(" 3.1.1. Maven 安装")]),r._v(" "),e("p",[r._v("Spring 引导与 Apache Maven 3.3 或更高版本兼容。如果尚未安装 Maven,则可以按照"),e("a",{attrs:{href:"https://maven.apache.org",target:"_blank",rel:"noopener noreferrer"}},[r._v("maven.apache.org"),e("OutboundLink")],1),r._v("中的说明进行操作。")]),r._v(" "),e("table",[e("thead",[e("tr",[e("th"),r._v(" "),e("th",[r._v("在许多操作系统上, Maven 都可以安装一个包管理器。"),e("br"),r._v("如果你使用 OSX Homebrew,请尝试"),e("code",[r._v("brew install maven")]),r._v("。"),e("br"),r._v("Ubuntu 用户可以运行"),e("code",[r._v("sudo apt-get install maven")]),r._v("。"),e("br"),r._v("具有"),e("a",{attrs:{href:"https://chocolatey.org/",target:"_blank",rel:"noopener noreferrer"}},[r._v("Chocolatey"),e("OutboundLink")],1),r._v("的 Windows 用户可以从提升的(管理员)提示符中运行"),e("code",[r._v("choco install maven")]),r._v("。")])])]),r._v(" "),e("tbody")]),r._v(" "),e("p",[r._v("Spring 引导依赖项使用"),e("code",[r._v("org.springframework.boot``groupId")]),r._v("。通常,你的 Maven POM 文件从"),e("code",[r._v("spring-boot-starter-parent")]),r._v("项目继承,并声明一个或多个"),e("RouterLink",{attrs:{to:"/spring-boot/using.html#using.build-systems.starters"}},[r._v("“Starters”")]),r._v("的依赖关系。 Spring 引导还提供了一个可选的"),e("RouterLink",{attrs:{to:"/spring-boot/build-tool-plugins.html#build-tool-plugins.maven"}},[r._v("Maven plugin")]),r._v("来创建可执行 JAR。")],1),r._v(" "),e("p",[r._v("关于开始使用 Spring boot 和 Maven 的更多详细信息,可以在 Maven 插件的参考指南"),e("a",{attrs:{href:"https://docs.spring.io/spring-boot/docs/2.6.4/maven-plugin/reference/htmlsingle/#getting-started",target:"_blank",rel:"noopener noreferrer"}},[r._v("入门部分"),e("OutboundLink")],1),r._v("中找到。")]),r._v(" "),e("h4",{attrs:{id:"_3-1-2-gradle-安装"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#_3-1-2-gradle-安装"}},[r._v("#")]),r._v(" 3.1.2. Gradle 安装")]),r._v(" "),e("p",[r._v("Spring 引导与 Gradle 6.8、6.9 和 7.x 兼容。如果尚未安装 Gradle,则可以按照"),e("a",{attrs:{href:"https://gradle.org",target:"_blank",rel:"noopener noreferrer"}},[r._v("gradle.org"),e("OutboundLink")],1),r._v("中的说明进行操作。")]),r._v(" "),e("p",[r._v("Spring 启动依赖项可以通过使用"),e("code",[r._v("org.springframework.boot``group")]),r._v("来声明。通常,你的项目声明依赖于一个或多个"),e("RouterLink",{attrs:{to:"/spring-boot/using.html#using.build-systems.starters"}},[r._v("“Starters”")]),r._v("。 Spring Boot 提供了一个有用的"),e("RouterLink",{attrs:{to:"/spring-boot/build-tool-plugins.html#build-tool-plugins.gradle"}},[r._v("Gradle plugin")]),r._v(",可用于简化依赖项声明并创建可执行 JAR。")],1),r._v(" "),e("p",[r._v("Gradle 包装纸")]),r._v(" "),e("p",[r._v("当你需要构建一个项目时, Gradle 包装器提供了一种很好的“获取” Gradle 方式。它是一个小的脚本和库,你可以在代码旁边提交它来引导构建过程。详见"),e("a",{attrs:{href:"https://docs.gradle.org/current/userguide/gradle_wrapper.html",target:"_blank",rel:"noopener noreferrer"}},[r._v("docs.gradle.org/current/userguide/gradle_wrapper.html"),e("OutboundLink")],1),r._v("。")]),r._v(" "),e("p",[r._v("关于开始使用 Spring boot 和 Gradle 的更多详细信息,可以在 Gradle 插件的参考指南"),e("a",{attrs:{href:"https://docs.spring.io/spring-boot/docs/2.6.4/gradle-plugin/reference/htmlsingle/#getting-started",target:"_blank",rel:"noopener noreferrer"}},[r._v("入门部分"),e("OutboundLink")],1),r._v("中找到。")]),r._v(" "),e("h3",{attrs:{id:"_3-2-安装-spring-boot-cli"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#_3-2-安装-spring-boot-cli"}},[r._v("#")]),r._v(" 3.2.安装 Spring boot cli")]),r._v(" "),e("p",[r._v("Spring 引导 CLI(命令行界面)是一种命令行工具,你可以使用它来快速地使用 Spring 进行原型设计。它允许你运行"),e("a",{attrs:{href:"https://groovy-lang.org/",target:"_blank",rel:"noopener noreferrer"}},[r._v("Groovy"),e("OutboundLink")],1),r._v("脚本,这意味着你有一个熟悉的类似 Java 的语法,而不需要那么多样板代码。")]),r._v(" "),e("p",[r._v("你不需要使用 CLI 来处理 Spring 引导,但是这是一种在没有 IDE 的情况下使 Spring 应用程序脱离地面的快速方法。")]),r._v(" "),e("h4",{attrs:{id:"_3-2-1-手动安装"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#_3-2-1-手动安装"}},[r._v("#")]),r._v(" 3.2.1.手动安装")]),r._v(" "),e("p",[r._v("你可以从 Spring 软件库下载 Spring CLI 发行版:")]),r._v(" "),e("ul",[e("li",[e("p",[e("a",{attrs:{href:"https://repo.spring.io/release/org/springframework/boot/spring-boot-cli/2.6.4/spring-boot-cli-2.6.4-bin.zip",target:"_blank",rel:"noopener noreferrer"}},[r._v("spring-boot-cli-2.6.4-bin.zip"),e("OutboundLink")],1)])]),r._v(" "),e("li",[e("p",[e("a",{attrs:{href:"https://repo.spring.io/release/org/springframework/boot/spring-boot-cli/2.6.4/spring-boot-cli-2.6.4-bin.tar.gz",target:"_blank",rel:"noopener noreferrer"}},[r._v("spring-boot-cli-2.6.4-bin.tar.gz"),e("OutboundLink")],1)])])]),r._v(" "),e("p",[r._v("尖端"),e("a",{attrs:{href:"https://repo.spring.io/snapshot/org/springframework/boot/spring-boot-cli/",target:"_blank",rel:"noopener noreferrer"}},[r._v("快照分布"),e("OutboundLink")],1),r._v("也是可用的。")]),r._v(" "),e("p",[r._v("一旦下载,请按照解压缩归档文件中的"),e("a",{attrs:{href:"https://raw.githubusercontent.com/spring-projects/spring-boot/v2.6.4/spring-boot-project/spring-boot-cli/src/main/content/INSTALL.txt",target:"_blank",rel:"noopener noreferrer"}},[r._v("安装.TXT"),e("OutboundLink")],1),r._v("说明进行操作。总之,在"),e("code",[r._v(".zip")]),r._v("文件中的"),e("code",[r._v("bin/")]),r._v("目录中有一个"),e("code",[r._v("spring")]),r._v("脚本("),e("code",[r._v("spring.bat")]),r._v("用于 Windows)。或者,你可以在"),e("code",[r._v(".jar")]),r._v("文件中使用"),e("code",[r._v("java -jar")]),r._v("(该脚本可以帮助你确保 Classpath 设置正确)。")]),r._v(" "),e("h4",{attrs:{id:"_3-2-2-用-sdkman-安装"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#_3-2-2-用-sdkman-安装"}},[r._v("#")]),r._v(" 3.2.2.用 SDKMAN 安装!")]),r._v(" "),e("p",[r._v("SDKMAN!(软件开发工具包管理器)可以用于管理各种二进制 SDK 的多个版本,包括 Groovy 和 Spring Boot CLI。得到 SDKMAN!从"),e("a",{attrs:{href:"https://sdkman.io",target:"_blank",rel:"noopener noreferrer"}},[r._v("sdkman.io"),e("OutboundLink")],1),r._v("开始,使用以下命令安装 Spring boot:")]),r._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[r._v("$ sdk install springboot\n$ spring --version\nSpring CLI v2.6.4\n")])])]),e("p",[r._v("如果你为 CLI 开发了功能,并希望访问你构建的版本,请使用以下命令:")]),r._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[r._v("$ sdk install springboot dev /path/to/spring-boot/spring-boot-cli/target/spring-boot-cli-2.6.4-bin/spring-2.6.4/\n$ sdk default springboot dev\n$ spring --version\nSpring CLI v2.6.4\n")])])]),e("p",[r._v("前面的指令安装一个"),e("code",[r._v("spring")]),r._v("的本地实例,称为"),e("code",[r._v("dev")]),r._v("实例。它指向你的目标构建位置,因此每次重新生成 Spring 引导时,"),e("code",[r._v("spring")]),r._v("都是最新的。")]),r._v(" "),e("p",[r._v("你可以通过运行以下命令看到它:")]),r._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[r._v("$ sdk ls springboot\n\n================================================================================\nAvailable Springboot Versions\n================================================================================\n> + dev\n* 2.6.4\n\n================================================================================\n+ - local version\n* - installed\n> - currently in use\n================================================================================\n")])])]),e("h4",{attrs:{id:"_3-2-3-osx-homebrew-安装"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#_3-2-3-osx-homebrew-安装"}},[r._v("#")]),r._v(" 3.2.3.OSX Homebrew 安装")]),r._v(" "),e("p",[r._v("如果你在 Mac 上使用"),e("a",{attrs:{href:"https://brew.sh/",target:"_blank",rel:"noopener noreferrer"}},[r._v("Homebrew"),e("OutboundLink")],1),r._v(",则可以使用以下命令安装 Spring boot cli:")]),r._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[r._v("$ brew tap spring-io/tap\n$ brew install spring-boot\n")])])]),e("p",[r._v("Homebrew 将"),e("code",[r._v("spring")]),r._v("安装到"),e("code",[r._v("/usr/local/bin")]),r._v("。")]),r._v(" "),e("table",[e("thead",[e("tr",[e("th"),r._v(" "),e("th",[r._v("如果你没有看到公式,那么你安装的 BREW 可能已经过期。"),e("br"),r._v("在这种情况下,运行"),e("code",[r._v("brew update")]),r._v(",然后再试一次。")])])]),r._v(" "),e("tbody")]),r._v(" "),e("h4",{attrs:{id:"_3-2-4-macports-安装"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#_3-2-4-macports-安装"}},[r._v("#")]),r._v(" 3.2.4. MacPorts 安装")]),r._v(" "),e("p",[r._v("如果你在 Mac 上使用"),e("a",{attrs:{href:"https://www.macports.org/",target:"_blank",rel:"noopener noreferrer"}},[r._v("MacPorts"),e("OutboundLink")],1),r._v(",则可以使用以下命令安装 Spring boot cli:")]),r._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[r._v("$ sudo port install spring-boot-cli\n")])])]),e("h4",{attrs:{id:"_3-2-5-命令行完成"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#_3-2-5-命令行完成"}},[r._v("#")]),r._v(" 3.2.5.命令行完成")]),r._v(" "),e("p",[r._v("Spring 引导 CLI 包括为"),e("a",{attrs:{href:"https://en.wikipedia.org/wiki/Bash_%28Unix_shell%29",target:"_blank",rel:"noopener noreferrer"}},[r._v("BASH"),e("OutboundLink")],1),r._v("和"),e("a",{attrs:{href:"https://en.wikipedia.org/wiki/Z_shell",target:"_blank",rel:"noopener noreferrer"}},[r._v("zsh"),e("OutboundLink")],1),r._v("shell 提供命令完成的脚本。你可以在任何 shell 中"),e("code",[r._v("source")]),r._v("该脚本(也称为"),e("code",[r._v("spring")]),r._v("),或者将其放入你的个人或系统范围的 bash 完成初始化中。在 Debian 系统上,系统范围的脚本位于"),e("code",[r._v("/shell-completion/bash")]),r._v("中,当新的 shell 启动时,该目录中的所有脚本都会被执行。例如,如果你已经通过使用 SDKMAN!安装了脚本,要手动运行该脚本,请使用以下命令:")]),r._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[r._v("$ . ~/.sdkman/candidates/springboot/current/shell-completion/bash/spring\n$ spring \n grab help jar run test version\n")])])]),e("table",[e("thead",[e("tr",[e("th"),r._v(" "),e("th",[r._v("如果你使用 Homebrew 或 MacPorts 安装 Spring 启动 CLI,那么命令行完成脚本将自动注册到你的 shell 中。")])])]),r._v(" "),e("tbody")]),r._v(" "),e("h4",{attrs:{id:"_3-2-6-windows-scoop-安装"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#_3-2-6-windows-scoop-安装"}},[r._v("#")]),r._v(" 3.2.6.Windows Scoop 安装")]),r._v(" "),e("p",[r._v("如果你在 Windows 上并使用"),e("a",{attrs:{href:"https://scoop.sh/",target:"_blank",rel:"noopener noreferrer"}},[r._v("Scoop"),e("OutboundLink")],1),r._v(",则可以使用以下命令安装 Spring boot cli:")]),r._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[r._v("> scoop bucket add extras\n> scoop install springboot\n")])])]),e("p",[r._v("Scoop 将"),e("code",[r._v("spring")]),r._v("安装到"),e("code",[r._v("~/scoop/apps/springboot/current/bin")]),r._v("。")]),r._v(" "),e("table",[e("thead",[e("tr",[e("th"),r._v(" "),e("th",[r._v("如果你没有看到应用程序清单,那么你的 Scoop 安装可能已经过期。"),e("br"),r._v("在这种情况下,运行"),e("code",[r._v("scoop update")]),r._v(",然后再试一次。")])])]),r._v(" "),e("tbody")]),r._v(" "),e("h4",{attrs:{id:"_3-2-7-快速启动-spring-cli-示例"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#_3-2-7-快速启动-spring-cli-示例"}},[r._v("#")]),r._v(" 3.2.7.快速启动 Spring CLI 示例")]),r._v(" "),e("p",[r._v("你可以使用下面的 Web 应用程序来测试你的安装。首先,创建一个名为"),e("code",[r._v("app.groovy")]),r._v("的文件,如下所示:")]),r._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[r._v('@RestController\nclass ThisWillActuallyRun {\n\n @RequestMapping("/")\n String home() {\n "Hello World!"\n }\n\n}\n\n')])])]),e("p",[r._v("然后从一个 shell 中运行它,如下所示:")]),r._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[r._v("$ spring run app.groovy\n")])])]),e("table",[e("thead",[e("tr",[e("th"),r._v(" "),e("th",[r._v("应用程序的第一次运行很慢,因为依赖项是下载的。"),e("br"),r._v("后续运行要快得多。")])])]),r._v(" "),e("tbody")]),r._v(" "),e("p",[r._v("在你最喜欢的 Web 浏览器中打开"),e("code",[r._v("[localhost:8080](http://localhost:8080)")]),r._v("。你应该会看到以下输出:")]),r._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[r._v("Hello World!\n")])])]),e("h2",{attrs:{id:"_4-开发你的第一个-spring-启动应用程序"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#_4-开发你的第一个-spring-启动应用程序"}},[r._v("#")]),r._v(" 4. 开发你的第一个 Spring 启动应用程序")]),r._v(" "),e("p",[r._v("这一部分描述了如何开发一个小型的“Hello World!”Web 应用程序,该应用程序突出了 Spring Boot 的一些关键功能。我们使用 Maven 来构建这个项目,因为大多数 IDE 都支持它。")]),r._v(" "),e("table",[e("thead",[e("tr",[e("th"),r._v(" "),e("th",[e("a",{attrs:{href:"https://spring.io",target:"_blank",rel:"noopener noreferrer"}},[r._v("spring.io"),e("OutboundLink")],1),r._v("网站包含许多使用 Spring 引导的“入门”"),e("a",{attrs:{href:"https://spring.io/guides",target:"_blank",rel:"noopener noreferrer"}},[r._v("guides"),e("OutboundLink")],1),r._v(","),e("br"),r._v("如果你需要解决特定的问题,首先检查那里。"),e("br"),e("br"),r._v("你可以通过转到"),e("a",{attrs:{href:"https://start.spring.io",target:"_blank",rel:"noopener noreferrer"}},[r._v("start.spring.io"),e("OutboundLink")],1),r._v("并从依赖项搜索器中选择“web”启动器来快捷下面的步骤。"),e("br"),r._v("这样做会生成一个新的项目结构,这样你就可以"),e("a",{attrs:{href:"#getting-started.first-application.code"}},[r._v("立即开始编码")]),r._v("。"),e("br"),r._v("检查"),e("a",{attrs:{href:"https://github.com/spring-io/start.spring.io/blob/main/USING.adoc",target:"_blank",rel:"noopener noreferrer"}},[r._v("start.spring.io user guide"),e("OutboundLink")],1),r._v("以获取更多详细信息。")])])]),r._v(" "),e("tbody")]),r._v(" "),e("p",[r._v("在开始之前,打开一个终端并运行以下命令,以确保安装了有效的 Java 和 Maven 版本:")]),r._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[r._v('$ java -version\njava version "1.8.0_102"\nJava(TM) SE Runtime Environment (build 1.8.0_102-b14)\nJava HotSpot(TM) 64-Bit Server VM (build 25.102-b14, mixed mode)\n')])])]),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[r._v("$ mvn -v\nApache Maven 3.5.4 (1edded0938998edf8bf061f1ceb3cfdeccf443fe; 2018-06-17T14:33:14-04:00)\nMaven home: /usr/local/Cellar/maven/3.3.9/libexec\nJava version: 1.8.0_102, vendor: Oracle Corporation\n")])])]),e("table",[e("thead",[e("tr",[e("th"),r._v(" "),e("th",[r._v("这个示例需要在它自己的目录中创建。"),e("br"),r._v("后续的说明假设你已经创建了一个合适的目录,并且它是你当前的目录。")])])]),r._v(" "),e("tbody")]),r._v(" "),e("h3",{attrs:{id:"_4-1-创建-pom"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#_4-1-创建-pom"}},[r._v("#")]),r._v(" 4.1.创建 POM")]),r._v(" "),e("p",[r._v("我们需要从创建一个 Maven "),e("code",[r._v("pom.xml")]),r._v("文件开始。"),e("code",[r._v("pom.xml")]),r._v("是用于构建项目的配方。打开你最喜欢的文本编辑器,并添加以下内容:")]),r._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[r._v('\n\n 4.0.0\n\n com.example\n myproject\n 0.0.1-SNAPSHOT\n\n \n org.springframework.boot\n spring-boot-starter-parent\n 2.6.4\n \n\n \x3c!-- Additional lines to be added here... --\x3e\n\n\n')])])]),e("p",[r._v("前面的列表应该为你提供一个可工作的构建。你可以通过运行"),e("code",[r._v("mvn package")]),r._v("来测试它(目前,你可以忽略“ jar 将为空-没有内容被标记为包含!”警告)。")]),r._v(" "),e("table",[e("thead",[e("tr",[e("th"),r._v(" "),e("th",[r._v("此时,你可以将项目导入到 IDE 中(大多数现代 Java IDE 都包含对 Maven 的内置支持)。"),e("br"),r._v("为了简单起见,我们在这个示例中继续使用纯文本编辑器。")])])]),r._v(" "),e("tbody")]),r._v(" "),e("h3",{attrs:{id:"_4-2-添加-classpath-依赖项"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#_4-2-添加-classpath-依赖项"}},[r._v("#")]),r._v(" 4.2.添加 Classpath 依赖项")]),r._v(" "),e("p",[r._v("Spring Boot 提供了许多“启动器”,允许你将罐子添加到你的 Classpath。我们的烟雾测试应用程序使用 POM 中"),e("code",[r._v("parent")]),r._v("部分中的"),e("code",[r._v("spring-boot-starter-parent")]),r._v("。"),e("code",[r._v("spring-boot-starter-parent")]),r._v("是一种特殊的启动器,它提供了有用的 Maven 默认值。它还提供了一个["),e("code",[r._v("dependency-management")]),r._v("](使用.html#using.build-systems.dependency-management)部分,这样你就可以省略"),e("code",[r._v("version")]),r._v("标记来表示“有福的”依赖关系。")]),r._v(" "),e("p",[r._v("其他“启动器”提供了在开发特定类型的应用程序时可能需要的依赖关系。因为我们正在开发一个 Web 应用程序,所以我们添加了一个"),e("code",[r._v("spring-boot-starter-web")]),r._v("依赖项。在此之前,我们可以通过运行以下命令查看当前的内容:")]),r._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[r._v("$ mvn dependency:tree\n\n[INFO] com.example:myproject:jar:0.0.1-SNAPSHOT\n")])])]),e("p",[e("code",[r._v("mvn dependency:tree")]),r._v("命令打印项目依赖关系的树表示。你可以看到"),e("code",[r._v("spring-boot-starter-parent")]),r._v("本身不提供依赖关系。要添加必要的依赖项,请编辑"),e("code",[r._v("pom.xml")]),r._v(",并在"),e("code",[r._v("parent")]),r._v("部分下面添加"),e("code",[r._v("spring-boot-starter-web")]),r._v("依赖项:")]),r._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[r._v("\n \n org.springframework.boot\n spring-boot-starter-web\n \n\n")])])]),e("p",[r._v("如果再次运行"),e("code",[r._v("mvn dependency:tree")]),r._v(",你将看到现在有许多额外的依赖关系,包括 Tomcat Web 服务器和 Spring 引导本身。")]),r._v(" "),e("h3",{attrs:{id:"_4-3-编写代码"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#_4-3-编写代码"}},[r._v("#")]),r._v(" 4.3.编写代码")]),r._v(" "),e("p",[r._v("为了完成我们的应用程序,我们需要创建一个单独的 Java 文件。默认情况下, Maven 从"),e("code",[r._v("src/main/java")]),r._v("编译源代码,因此你需要创建该目录结构,然后添加一个名为"),e("code",[r._v("src/main/java/MyApplication.java")]),r._v("的文件,以包含以下代码:")]),r._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[r._v('import org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.EnableAutoConfiguration;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n@RestController\n@EnableAutoConfiguration\npublic class MyApplication {\n\n @RequestMapping("/")\n String home() {\n return "Hello World!";\n }\n\n public static void main(String[] args) {\n SpringApplication.run(MyApplication.class, args);\n }\n\n}\n\n')])])]),e("p",[r._v("虽然这里没有太多的代码,但发生了很多事情。在接下来的几节中,我们将介绍重要的部分。")]),r._v(" "),e("h4",{attrs:{id:"_4-3-1-restcontroller-和-requestmapping-注释"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#_4-3-1-restcontroller-和-requestmapping-注释"}},[r._v("#")]),r._v(" 4.3.1.restcontroller 和 @requestmapping 注释")]),r._v(" "),e("p",[r._v("我们的"),e("code",[r._v("MyApplication")]),r._v("类的第一个注释是"),e("code",[r._v("@RestController")]),r._v("。这被称为"),e("em",[r._v("刻板印象")]),r._v("注释。它为阅读代码的人提供了提示,并为 Spring 提供了类扮演特定角色的提示。在这种情况下,我们的类是一个 Web"),e("code",[r._v("@Controller")]),r._v(",因此 Spring 在处理传入的 Web 请求时考虑它。")]),r._v(" "),e("p",[e("code",[r._v("@RequestMapping")]),r._v("注释提供了“路由”信息。它告诉 Spring,任何带有"),e("code",[r._v("/")]),r._v("路径的 HTTP 请求都应该映射到"),e("code",[r._v("home")]),r._v("方法。"),e("code",[r._v("@RestController")]),r._v("注释告诉 Spring 将生成的字符串直接呈现给调用方。")]),r._v(" "),e("table",[e("thead",[e("tr",[e("th"),r._v(" "),e("th",[e("code",[r._v("@RestController")]),r._v("和"),e("code",[r._v("@RequestMapping")]),r._v("注释是 Spring MVC 注释(它们不特定于 Spring 引导)。"),e("br"),r._v("有关更多详细信息,请参见 Spring 参考文档中的"),e("a",{attrs:{href:"https://docs.spring.io/spring-framework/docs/5.3.16/reference/html/web.html#mvc",target:"_blank",rel:"noopener noreferrer"}},[r._v("MVC 部分"),e("OutboundLink")],1),r._v("。")])])]),r._v(" "),e("tbody")]),r._v(" "),e("h4",{attrs:{id:"_4-3-2-enableautoconfiguration-注释"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#_4-3-2-enableautoconfiguration-注释"}},[r._v("#")]),r._v(" 4.3.2.@enableAutoConfiguration 注释")]),r._v(" "),e("p",[r._v("第二个类级注释是"),e("code",[r._v("@EnableAutoConfiguration")]),r._v("。这个注释告诉 Spring 引导“猜测”你想要如何配置 Spring,基于你添加的 jar 依赖关系。由于"),e("code",[r._v("spring-boot-starter-web")]),r._v("添加了 Tomcat 和 Spring MVC,因此自动配置假定你正在开发一个 Web 应用程序,并相应地设置 Spring。")]),r._v(" "),e("p",[r._v("起动器和自动配置")]),r._v(" "),e("p",[r._v("自动配置的设计是为了与“启动器”很好地配合,但这两个概念并没有直接联系在一起。你可以自由地选择 jar 启动器之外的依赖项。 Spring 启动仍然会尽力自动配置你的应用程序。")]),r._v(" "),e("h4",{attrs:{id:"_4-3-3-主-法"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#_4-3-3-主-法"}},[r._v("#")]),r._v(" 4.3.3.“主”法")]),r._v(" "),e("p",[r._v("我们应用程序的最后一部分是"),e("code",[r._v("main")]),r._v("方法。对于应用程序入口点,这是一种遵循 Java 约定的标准方法。我们的主方法通过调用"),e("code",[r._v("run")]),r._v("来委托 Spring boot 的"),e("code",[r._v("SpringApplication")]),r._v("类。"),e("code",[r._v("SpringApplication")]),r._v("引导我们的应用程序,启动 Spring,然后启动自动配置的 Tomcat Web 服务器。我们需要将"),e("code",[r._v("MyApplication.class")]),r._v("作为参数传递给"),e("code",[r._v("run")]),r._v("方法,以告诉"),e("code",[r._v("SpringApplication")]),r._v("哪个是主要的 Spring 组件。还通过"),e("code",[r._v("args")]),r._v("数组公开任何命令行参数。")]),r._v(" "),e("h3",{attrs:{id:"_4-4-运行示例"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#_4-4-运行示例"}},[r._v("#")]),r._v(" 4.4.运行示例")]),r._v(" "),e("p",[r._v("在这一点上,你的应用程序应该可以工作。因为你使用了"),e("code",[r._v("spring-boot-starter-parent")]),r._v(" POM,所以你有了一个有用的"),e("code",[r._v("run")]),r._v("目标,你可以使用它来启动应用程序。从根项目目录中键入"),e("code",[r._v("mvn spring-boot:run")]),r._v("以启动应用程序。你应该会看到类似于以下内容的输出:")]),r._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[r._v("$ mvn spring-boot:run\n\n . ____ _ __ _ _\n /\\\\ / ___'_ __ _ _(_)_ __ __ _ \\ \\ \\ \\\n( ( )\\___ | '_ | '_| | '_ \\/ _` | \\ \\ \\ \\\n \\\\/ ___)| |_)| | | | | || (_| | ) ) ) )\n ' |____| .__|_| |_|_| |_\\__, | / / / /\n =========|_|==============|___/=/_/_/_/\n :: Spring Boot :: (v2.6.4)\n....... . . .\n....... . . . (log output here)\n....... . . .\n........ Started MyApplication in 2.222 seconds (JVM running for 6.514)\n")])])]),e("p",[r._v("如果将 Web 浏览器打开到"),e("code",[r._v("[localhost:8080](http://localhost:8080)")]),r._v(",应该会看到以下输出:")]),r._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[r._v("Hello World!\n")])])]),e("p",[r._v("要优雅地退出应用程序,请按"),e("code",[r._v("ctrl-c")]),r._v("。")]),r._v(" "),e("h3",{attrs:{id:"_4-5-创建可执行文件-jar"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#_4-5-创建可执行文件-jar"}},[r._v("#")]),r._v(" 4.5.创建可执行文件 jar")]),r._v(" "),e("p",[r._v("我们通过创建一个完全自包含的可执行文件 jar 来完成我们的示例,该文件可以在生产环境中运行。可执行 JAR(有时称为“FAT JAR”)是包含你的已编译类以及代码需要运行的所有 jar 依赖项的归档文件。")]),r._v(" "),e("p",[r._v("可执行 JAR 和 Java")]),r._v(" "),e("p",[r._v("Java 没有提供一种标准的方式来加载嵌套的 jar 文件( jar 文件本身包含在 jar 中)。如果你希望分发一个自包含的应用程序,这可能会有问题。")]),r._v(" "),e("p",[r._v("为了解决这个问题,许多开发人员使用“UBER”JAR。 jar UBER 将应用程序的所有依赖项中的所有类打包到一个单独的归档文件中。这种方法的问题在于,很难看到应用程序中有哪些库。如果在多个 JAR 中使用相同的文件名(但具有不同的内容),也可能会有问题。")]),r._v(" "),e("p",[r._v("Spring boot 需要"),e("RouterLink",{attrs:{to:"/spring-boot/executable-jar.html#appendix.executable-jar"}},[r._v("不同的方法")]),r._v(",并让你实际上直接嵌套罐子。")],1),r._v(" "),e("p",[r._v("要创建可执行文件 jar,我们需要将"),e("code",[r._v("spring-boot-maven-plugin")]),r._v("添加到我们的"),e("code",[r._v("pom.xml")]),r._v("中。要做到这一点,请在"),e("code",[r._v("dependencies")]),r._v("部分下方插入以下行:")]),r._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[r._v("\n \n \n org.springframework.boot\n spring-boot-maven-plugin\n \n \n\n")])])]),e("table",[e("thead",[e("tr",[e("th"),r._v(" "),e("th",[e("code",[r._v("spring-boot-starter-parent")]),r._v(" POM 包括"),e("code",[r._v("")]),r._v("配置,以绑定"),e("code",[r._v("repackage")]),r._v("目标。"),e("br"),r._v("如果不使用父 POM,则需要自己声明此配置。"),e("br"),r._v("有关详细信息,请参见"),e("a",{attrs:{href:"https://docs.spring.io/spring-boot/docs/2.6.4/maven-plugin/reference/htmlsingle/#getting-started",target:"_blank",rel:"noopener noreferrer"}},[r._v("插件文档"),e("OutboundLink")],1),r._v("。")])])]),r._v(" "),e("tbody")]),r._v(" "),e("p",[r._v("保存"),e("code",[r._v("pom.xml")]),r._v("并从命令行运行"),e("code",[r._v("mvn package")]),r._v(",如下所示:")]),r._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[r._v("$ mvn package\n\n[INFO] Scanning for projects...\n[INFO]\n[INFO] ------------------------------------------------------------------------\n[INFO] Building myproject 0.0.1-SNAPSHOT\n[INFO] ------------------------------------------------------------------------\n[INFO] .... ..\n[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ myproject ---\n[INFO] Building jar: /Users/developer/example/spring-boot-example/target/myproject-0.0.1-SNAPSHOT.jar\n[INFO]\n[INFO] --- spring-boot-maven-plugin:2.6.4:repackage (default) @ myproject ---\n[INFO] ------------------------------------------------------------------------\n[INFO] BUILD SUCCESS\n[INFO] ------------------------------------------------------------------------\n")])])]),e("p",[r._v("如果查看"),e("code",[r._v("target")]),r._v("目录,应该会看到"),e("code",[r._v("myproject-0.0.1-SNAPSHOT.jar")]),r._v("。该文件的大小应该在 10MB 左右。如果想要查看内部,可以使用"),e("code",[r._v("jar tvf")]),r._v(",如下所示:")]),r._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[r._v("$ jar tvf target/myproject-0.0.1-SNAPSHOT.jar\n")])])]),e("p",[r._v("你还应该在"),e("code",[r._v("target")]),r._v("目录中看到一个名为"),e("code",[r._v("myproject-0.0.1-SNAPSHOT.jar.original")]),r._v("的小得多的文件。这是在 Spring 引导重新打包之前 Maven 创建的原始 jar 文件。")]),r._v(" "),e("p",[r._v("要运行该应用程序,请使用"),e("code",[r._v("java -jar")]),r._v("命令,如下所示:")]),r._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[r._v("$ java -jar target/myproject-0.0.1-SNAPSHOT.jar\n\n . ____ _ __ _ _\n /\\\\ / ___'_ __ _ _(_)_ __ __ _ \\ \\ \\ \\\n( ( )\\___ | '_ | '_| | '_ \\/ _` | \\ \\ \\ \\\n \\\\/ ___)| |_)| | | | | || (_| | ) ) ) )\n ' |____| .__|_| |_|_| |_\\__, | / / / /\n =========|_|==============|___/=/_/_/_/\n :: Spring Boot :: (v2.6.4)\n....... . . .\n....... . . . (log output here)\n....... . . .\n........ Started MyApplication in 2.536 seconds (JVM running for 2.864)\n")])])]),e("p",[r._v("和前面一样,要退出应用程序,请按"),e("code",[r._v("ctrl-c")]),r._v("。")]),r._v(" "),e("h2",{attrs:{id:"_5-接下来要读什么"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#_5-接下来要读什么"}},[r._v("#")]),r._v(" 5. 接下来要读什么?")]),r._v(" "),e("p",[r._v("希望这一部分提供了一些 Spring 引导基础知识,并帮助你编写自己的应用程序。如果你是一位面向任务类型的开发人员,你可能希望跳到"),e("a",{attrs:{href:"https://spring.io",target:"_blank",rel:"noopener noreferrer"}},[r._v("spring.io"),e("OutboundLink")],1),r._v(",并遵循一些"),e("a",{attrs:{href:"https://spring.io/guides/",target:"_blank",rel:"noopener noreferrer"}},[r._v("开始"),e("OutboundLink")],1),r._v("指南,这些指南解决了特定的“如何使用 Spring?”问题。我们还有 Spring 特定于引导的“"),e("RouterLink",{attrs:{to:"/spring-boot/howto.html#howto"}},[r._v("How-to")]),r._v("”参考文档。")],1),r._v(" "),e("p",[r._v("否则,下一个逻辑步骤是读取 "),e("em",[e("RouterLink",{attrs:{to:"/spring-boot/using.html#using"}},[r._v("using.html")])],1),r._v("。如果你真的不耐烦了,你也可以跳到前面去读关于 "),e("em",[e("RouterLink",{attrs:{to:"/spring-boot/features.html#features"}},[r._v("Spring Boot features")])],1),r._v(" 的文章。")])])}),[],!1,null,null,null);t.default=n.exports}}]);