1.5.2.RELEASE
版权所有©2012-2017
本文档的副本可以为您自己使用并分发给其他人,前提是您不收取这些副本的任何费用,并进一步规定每份副本均包含此版权声明,无论是以印刷版还是电子版分发。
目录
本节简要介绍Spring Boot参考文档。将其视为文档其余部分的映射。您可以以线性方式阅读本参考指南,或者如果您不感兴趣,可以跳过部分内容。
Spring Boot参考指南有html, pdf 和epub文档。最新的副本位于docs.spring.io/spring-boot/docs/current/reference。
本文档的副本可以为您自己使用并分发给其他人,前提是您不收取这些副本的任何费用,并进一步规定每份副本均包含此版权声明,无论是以印刷版还是电子版分发。
在Spring Boot遇到问题,我们希望能提供帮助!
spring-boot
。所有的Spring Boot都是开源的,包括文档!如果您发现文档有问题,或者如果你只是想改善他们,请参与。 |
如果你刚刚开始使用Spring Boot,或者一般来说就是 “Spring”,那么 这就是开始的地方!
准备好真正开始使用Spring Boot?我们已经涵盖了你。
需要更多关于Spring Boot核心功能的细节? 这是给你的!
当您准备将Spring Boot应用程序推向生产时,我们有 一些您可能会喜欢的技巧!
最后,我们针对更高级的用户有几个主题。
如果你刚开始使用Spring Boot,或者一般来说就是“Spring”,那么这是你的一部分!这里我们回答基本的“什么”,“怎么做”和“为什么”的问题。你会发现一个温柔的介绍,以及安装说明的Spring Boot。然后,我们将构建我们的第一个Spring Boot应用程序,并讨论一些核心原则。
Spring Boot使您可以轻松创建独立的生产级基于Spring的应用程序,您可以“运行”。我们对Spring平台和第三方库有自己的看法,所以你可以从最小的麻烦开始。大多数Spring Boot应用程序只需要很少的Spring配置。
您可以使用Spring Boot来创建可以使用java -jar
或更传统的战争部署来启动的Java应用程序。我们还提供了一个运行“春天脚本”的命令行工具。
我们的主要目标是:
默认情况下,Spring Boot 1.5.2.RELEASE需要Java 7和Spring Framework 4.3.7.RELEASE或更高版本。您可以使用带有Java 6的Spring Boot以及其他一些配置。有关更多详细信息,请参见第84.11节“如何使用Java 6”。为Maven(3.2+)和Gradle 2(2.9或更高版本)和3提供了明确的构建支持。
虽然可以使用Java 6或7的Spring Boot,但是我们通常推荐使用Java 8。 |
开箱即用支持以下嵌入式servlet容器:
名称 | Servlet版本 | Java版本 |
---|---|---|
雄猫8 |
3.1 |
Java 7+ |
雄猫7 |
3.0 |
Java 6+ |
码头9.3 |
3.1 |
Java 8+ |
码头9.2 |
3.1 |
Java 7+ |
码头8 |
3.0 |
Java 6+ |
Undertow 1.3 |
3.1 |
Java 7+ |
您也可以将Spring Boot应用程序部署到任何与Servlet 3.0+兼容的容器。
Spring Boot可以与“经典”Java开发工具一起使用,也可以作为命令行工具安装。无论如何,您将需要Java SDK v1.6或更高版本。在开始之前,您应该检查您当前的Java安装:
$ java -version
如果您对Java开发不熟悉,或者您只是想尝试Spring Boot,则可能需要先尝试Spring Boot CLI,否则请阅读“经典”安装说明。
尽管Spring Boot与Java 1.6兼容,但如果可能的话,应该考虑使用最新版本的Java。 |
您可以像使用任何标准Java库一样使用Spring Boot。只需spring-boot-*.jar
在您的类路径中包含相应的文件即可。Spring Boot不需要任何特殊的工具集成,所以你可以使用任何IDE或文本编辑器; Spring Boot应用程序没有什么特别之处,所以您可以像运行其他任何Java程序一样运行和调试。
尽管您可以复制Spring Boot jar,但我们通常建议您使用支持依赖管理的构建工具(如Maven或Gradle)。
Spring Boot与Apache Maven 3.2或更高版本兼容。如果您还没有安装Maven,您可以按照maven.apache.org上的说明进行操作。
在许多操作系统上,Maven可以通过包管理器来安装。如果您是OSX Homebrew用户,请尝试 |
Spring Boot的依赖使用了org.springframework.boot
groupId
。通常,您的Maven POM文件将从spring-boot-starter-parent
项目中继承,并将依赖项声明为一个或多个“Starter”。Spring Boot还提供了一个可选的 Maven插件来创建可执行的jar文件。
这是一个典型的pom.xml
文件:
<?xml version =“1.0”encoding =“UTF-8”?>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 http://maven.apache.org/xsd/maven-4.0.0.xsd“ > 4.0.0 modelVersion> com.example groupId> myproject artifactId> 0.0.1-SNAPSHOT version> <! - 从Spring Boot继承默认值 - > org.springframework.boot groupId> spring-boot-starter-parent artifactId> 1.5.2.RELEASE < / version> parent> <! - 添加Web应用程序的典型依赖关系 - > org.springframework.boot groupId> spring-boot-starter-web artifactId> dependency> 依赖> <! - Package as a executable jar - > org.springframework.boot groupId> spring-boot-maven-plugin artifactId> plugin > plugins> build> 项目>
这 |
Spring Boot与Gradle 2(2.9或更高版本)和Gradle 3兼容。如果您尚未安装Gradle,则可以按照www.gradle.org/上的说明进行操作。
Spring引导依赖可以使用org.springframework.boot
group
。通常,您的项目将声明依赖关系到一个或多个 “Starter”。Spring Boot提供了一个有用的Gradle插件 ,可以用来简化依赖声明和创建可执行的jar。
这是一个典型的build.gradle
文件:
插件{ ID 'org.springframework.boot'版本'1.5.2.RELEASE' ID '的Java' } 罐子{ baseName = 'myproject'version = '0.0.1-SNAPSHOT' } 储存库{ jcenter() } 依赖{ 编译(“org.springframework.boot:spring-boot-starter-web”) testCompile(“org.springframework.boot:spring-boot-starter-test”) }
Spring Boot CLI是一个命令行工具,如果你想用Spring来快速创建原型,可以使用它。它允许你运行Groovy脚本,这意味着你有一个熟悉的类Java语法,没有太多的样板代码。
您不需要使用CLI来使用Spring Boot,但它绝对是使Spring应用程序停飞的最快捷方式。
您可以从Spring软件存储库下载Spring CLI发行版:
最前沿的快照分布 也是可用的。
下载之后,请按照 解压缩归档中的INSTALL.txt说明进行操作。总结:在文件目录中有一个spring
脚本(spring.bat
用于Windows),或者也可以与该文件一起使用(该脚本可帮助您确保类路径设置正确)。bin/
.zip
java -jar
.jar
SDKMAN!(软件开发工具包管理器)可用于管理各种二进制SDK的多个版本,包括Groovy和Spring Boot CLI。获取SDKMAN!从sdkman.io安装Spring Boot
$ sdk安装springboot $ spring --version Spring Boot v1.5.2.RELEASE
如果您正在开发CLI的功能并希望轻松访问您刚刚构建的版本,请按照这些额外的说明进行操作。
$ sdk install springboot dev /path/to/spring-boot/spring-boot-cli/target/spring-boot-cli-1.5.2.RELEASE-bin/spring-1.5.2.RELEASE/ $ sdk默认springboot dev $ spring --version Spring CLI v1.5.2.RELEASE
这将安装一个spring
称为dev
实例的本地实例。它指向你的目标构建位置,所以每次重建Spring Boot时,spring
都会是最新的。
你可以看到这样做:
$ sdk ls springboot ================================================== ============================== 可用的Springboot版本 ================================================== ============================== > + dev * 1.5.2.RELEASE ================================================== ============================== + - 本地版本 * - 已安装 > - 目前正在使用 ================================================== ==============================
如果您在Mac上并使用Homebrew,则只需安装Spring Boot CLI即可:
$ brew tap pivotal / tap $ brew安装springboot
家酿将安装spring
到/usr/local/bin
。
如果您没有看到该公式,那么您的brew的安装可能会过期。只要执行, |
如果您在Mac上并使用MacPorts,则只需安装Spring Boot CLI即可:
$ sudo port install spring-boot-cli
Spring Boot CLI提供了为BASH和 zsh shell 提供命令完成的脚本 。你可以source
把脚本(也叫做 spring
)放在任何shell中,或者把它放在你的个人或者系统范围的bash中完成初始化。在Debian系统上,系统范围内的脚本将在/shell-completion/bash
新的shell启动时执行该目录中的所有脚本。要手动运行脚本,例如,如果您已经使用SDKMAN安装!
$。〜/ .sdkman /候选人/ springboot /电流/壳完成/庆典/弹簧 $ spring抓住帮助jar运行测试版本
如果您使用Homebrew或MacPorts安装Spring Boot CLI,则命令行完成脚本会自动在您的shell中注册。 |
这是一个非常简单的Web应用程序,您可以使用它来测试您的安装。创建一个名为app.groovy
:
@RestController 类 ThisWillActuallyRun { @RequestMapping( “/”) String home(){ “你好,世界!” } }
然后简单地从一个shell运行它:
$ spring run app.groovy
首次运行应用程序需要一段时间,因为依赖关系被下载。后续运行将会更快。 |
在你喜欢的网页浏览器中打开localhost:8080,你应该看到下面的输出:
你好,世界!
如果您是从早期版本的Spring Boot进行升级,请查看项目wiki上托管的“发行说明” 。您会发现升级说明以及每个版本的“新功能”和“值得注意”功能列表。
要升级现有的CLI安装,请使用相应的软件包管理器命令(例如brew upgrade
),或者如果您手动安装了CLI,请按照 标准说明记住要更新PATH
环境变量以删除所有旧的引用。
我们用Java开发一个简单的“Hello World!”Web应用程序,重点介绍Spring Boot的一些关键特性。我们将使用Maven来构建这个项目,因为大多数IDE都支持它。
该spring.io网站包含使用Spring的引导许多“入门”指南。如果你想解决一个特定的问题,先在那里检查。 您可以通过转到start.spring.io并 |
在开始之前,请打开一个终端,检查是否安装了Java和Maven的有效版本。
$ java -version java版本“1.7.0_51” Java(TM)SE运行时环境(build 1.7.0_51-b13) Java HotSpot(TM)64位服务器虚拟机(构建24.51-b03,混合模式)
$ mvn -v Apache Maven 3.2.3(33f8c3e1027c3ddde99d3cdebad2656a31e8fdf4; 2014-08-11T13:58:10-07:00) Maven主页:/Users/user/tools/apache-maven-3.1.1 Java版本:1.7.0_51,供应商:甲骨文公司
此示例需要在其自己的文件夹中创建。后续的说明假定你已经创建了一个合适的文件夹,并且它是你的“当前目录”。 |
我们需要从创建一个Maven pom.xml
文件开始。这pom.xml
是将用于建立您的项目的配方。打开你最喜欢的文本编辑器并添加以下内容:
<?xml version =“1.0”encoding =“UTF-8”?>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 http://maven.apache.org/xsd/maven-4.0.0.xsd“ > 4.0.0 modelVersion> com.example groupId> myproject artifactId> 0.0.1-SNAPSHOT version> org.springframework.boot groupId> spring-boot-starter-parent artifactId> 1.5.2.RELEASE version> parent> <! - 在这里添加的其他行... - > 项目>
这应该给你一个工作的构建,你可以通过运行测试mvn package
(你可以忽略“jar将是空的 - 没有内容被标记为包含!”警告现在)。
此时,您可以将项目导入IDE(大多数现代Java IDE包含对Maven的内置支持)。为了简单起见,我们将继续在这个例子中使用纯文本编辑器。 |
Spring Boot提供了许多“入门”,可以方便地将jar添加到你的classpath中。我们的示例应用程序已经spring-boot-starter-parent
在parent
POM 的 部分中使用。这spring-boot-starter-parent
是一个提供有用Maven默认设置的特别启动器。它还提供了一个 dependency-management
部分,以便您可以省略version
“祝福”依赖项的标签。
其他“入门者”只是提供开发特定类型的应用程序时可能需要的依赖关系。由于我们正在开发一个Web应用程序,我们将添加一个spring-boot-starter-web
依赖项 - 但在此之前,让我们看看我们目前有什么。
$ mvn依赖:树 [INFO] com.example:myproject:jar:0.0.1-SNAPSHOT
该mvn dependency:tree
命令打印您的项目依赖项的树形表示。你可以看到,spring-boot-starter-parent
它本身不提供依赖关系。让我们编辑我们的,pom.xml
并添加spring-boot-starter-web
该parent
部分正下方的依赖关系:
org.springframework.boot groupId> spring-boot-starter-web artifactId> dependency> dependencies>
如果mvn dependency:tree
再次运行,您将会看到现在还有一些其他的依赖项,包括Tomcat Web服务器和Spring Boot本身。
为了完成我们的应用程序,我们需要创建一个Java文件。Maven将src/main/java
默认编译源代码,因此您需要创建该文件夹结构,然后添加一个名为src/main/java/Example.java
:
import org.springframework.boot。*; import org.springframework.boot.autoconfigure。*; import org.springframework.stereotype。*; import org.springframework.web.bind.annotation。*; @RestController @EnableAutoConfiguration public class Example { @RequestMapping( “/”) String home(){ 返回 “Hello World!” ; } 公共 静态 无效的主要(字符串[]参数)抛出异常{ SpringApplication.run(实施例类,参数); } }
虽然这里没有太多的代码,但还是有很多。我们来看看重要的部分。
我们Example
班的第一个注释是@RestController
。这被称为 刻板印记。它为阅读代码提供了线索,对于Spring来说,这个类扮演着特定的角色。在这种情况下,我们的类是一个Web,@Controller
所以Spring在处理传入的Web请求时会考虑它。
该@RequestMapping
注释提供“路由”的信息。它告诉Spring,任何具有路径“/”的HTTP请求都应映射到该home
方法。该 @RestController
注解告诉Spring使得到的字符串直接返回给调用者。
在 |
第二个级别的注释是@EnableAutoConfiguration
。这个注解告诉Spring Boot根据你添加的jar依赖来“猜测”你将如何配置Spring。自从spring-boot-starter-web
添加了Tomcat和Spring MVC之后,自动配置将假定您正在开发一个Web应用程序并相应地设置Spring。
我们的应用程序的最后一部分是main
方法。这只是一个遵循Java约定的应用程序入口点的标准方法。我们的主要方法是SpringApplication
通过调用委托给Spring Boot的类run
。SpringApplication
将启动我们的应用程序,启动Spring,然后启动自动配置的Tomcat Web服务器。我们需要传递Example.class
一个参数run
来告诉SpringApplication
哪个是主要的Spring组件。该args
数组也被传递以暴露任何命令行参数。
在这一点上我们的应用程序应该工作 由于我们已经使用了 spring-boot-starter-parent
POM,我们有一个有用的run
目标,我们可以用它来启动应用程序。mvn spring-boot:run
从根项目目录中键入以启动应用程序:
$ mvn spring-boot:运行 。____ _ __ _ _ / \\ / _____ __ _ _(_)_ __ __ _ \ \ \ \ (()\ ___ |'_ |'_ | |'_ \ / _` | \ \ \ \ \\ / ___)| | _)| | | | | || (_ | |)))) '| ____ | .__ | _ | | _ | _ | | _ \ __,| / / / / ========= | _ | ============== | ___ / = / _ / _ / _ / :: Spring Boot ::(v1.5.2.RELEASE) ....... 。。 ....... 。。(在这里输出日志) ....... 。。 ........启动例2.222秒(JVM运行6.514)
如果你打开一个web浏览器到localhost:8080,你应该看到如下输出:
你好,世界!
优雅地退出应用程序命中ctrl-c
。
让我们通过创建一个完全独立的可执行jar文件来完成我们的例子,我们可以在生产环境中运行它。可执行jar(有时也称为“fat jars”)是包含您编译的类以及您的代码需要运行的所有jar依赖项的归档文件。
要创建一个可执行的jar我们需要添加spring-boot-maven-plugin
到我们的 pom.xml
。在dependencies
部分下方插入以下几行:
org.springframework.boot groupId> spring-boot-maven-plugin artifactId> plugin> plugins> build>
所述 |
保存pom.xml
并从命令行运行mvn package
:
$ mvn包 [INFO]扫描项目... [信息] [INFO] ----------------------------------------------- ------------------------- [INFO]构建myproject 0.0.1-SNAPSHOT [INFO] ----------------------------------------------- ------------------------- [信息] .... [INFO] --- maven-jar-plugin:2.4:jar(默认jar)@ myproject --- [INFO]构建jar:/Users/developer/example/spring-boot-example/target/myproject-0.0.1-SNAPSHOT.jar [信息] [INFO] --- spring-boot-maven-plugin:1.5.2.RELEASE:重新包装(默认)@ myproject --- [INFO] ----------------------------------------------- ------------------------- [信息]建立成功 [INFO] ----------------------------------------------- -------------------------
如果你看看target
你应该看到的目录myproject-0.0.1-SNAPSHOT.jar
。该文件大小应该在10 MB左右。如果你想偷看,你可以使用jar tvf
:
$ jar tvf target / myproject-0.0.1-SNAPSHOT.jar
你还应该看到myproject-0.0.1-SNAPSHOT.jar.original
在target
目录中命名的小得多的文件。这是Maven在被Spring Boot重新包装之前创建的原始jar文件。
要运行该应用程序,请使用以下java -jar
命令:
$ java -jar target / myproject-0.0.1-SNAPSHOT.jar 。____ _ __ _ _ / \\ / _____ __ _ _(_)_ __ __ _ \ \ \ \ (()\ ___ |'_ |'_ | |'_ \ / _` | \ \ \ \ \\ / ___)| | _)| | | | | || (_ | |)))) '| ____ | .__ | _ | | _ | _ | | _ \ __,| / / / / ========= | _ | ============== | ___ / = / _ / _ / _ / :: Spring Boot ::(v1.5.2.RELEASE) ....... 。。 ....... 。。(在这里输出日志) ....... 。。 ........在2.536秒内启动例子(运行2.864的JVM)
像以前一样,优雅地退出应用程序命中ctrl-c
。
希望本节为您提供了一些Spring Boot基础知识,并帮助您编写自己的应用程序。如果您是面向任务的开发人员,则可能需要跳至spring.io,并查看一些 入门指南,以解决具体的“如何使用Spring”问题; 我们也有Spring Boot特定 的操作指南文档。
在春季启动库也有 一堆样品可以运行。样本独立于代码的其余部分(也就是说,您不需要构建其余的代码来运行或使用样本)。
否则,下一个逻辑步骤是阅读第三部分“使用Spring Boot”。如果你真的不耐烦,也可以跳过来阅读 Spring Boot的特性。
本节将更详细地介绍如何使用Spring Boot。它涵盖了构建系统,自动配置以及如何运行应用程序等主题。我们还介绍了一些Spring Boot的最佳实践。尽管Spring Boot没有什么特别的地方(它只是你可以使用的另一个库),但是有一些建议,如果遵循这些建议,将使开发过程变得更容易一些。
如果您刚刚开始使用Spring Boot,则可能需要先阅读 入门指南,然后再深入本节。
强烈建议您选择支持依赖管理的构建系统 ,并且可以使用发布到“Maven Central”存储库的工件。我们建议您选择Maven或Gradle。Spring Boot可以与其他构建系统(例如Ant)一起工作,但是它们不会得到特别好的支持。
Spring Boot的每个发行版都提供了一个支持的依赖列表。在实践中,您不需要为构建配置中的任何这些依赖项提供一个版本,因为Spring Boot正在为您进行管理。当您升级Spring Boot本身时,这些依赖关系也将以一致的方式升级。
如果您觉得有必要,您仍然可以指定一个版本并覆盖Spring Boot的建议。 |
策划的列表包含您可以使用Spring Boot的所有弹簧模块以及第三方库的精炼列表。该列表可以作为标准 物料清单(spring-boot-dependencies
) 以及Maven和 Gradle的其他专用支持。
Spring Boot的每个版本都与Spring Framework的基础版本相关联,因此我们强烈建议您不要自行指定其版本。 |
Maven用户可以从spring-boot-starter-parent
项目中继承以获得合理的默认值。父项目提供以下功能:
了公共依赖标签,从继承的 spring-boot-dependencies
POM。application.properties
和application.yml
包括配置文件特定的文件(例如application-foo.properties
和application-foo.yml
)最后一点:由于默认配置文件接受Spring样式占位符(${…}
),Maven过滤被改为使用@..@
占位符(您可以用Maven属性覆盖 resource.delimiter
)。
要配置你的项目从spring-boot-starter-parent
简单的设置继承parent
:
<! - 从Spring Boot继承默认值 - >org.springframework.boot groupId> spring-boot-starter-parent artifactId> 1.5.2.RELEASE < / version> parent>
您应该只需要在此依赖项上指定Spring Boot版本号。如果您导入更多的启动器,则可以安全地省略版本号。 |
通过该设置,您还可以通过在自己的项目中重写属性来覆盖各个依赖项。例如,要升级到另一个Spring Data发行版,您需要将以下内容添加到您的pom.xml
。
releasetrain.version> Fowler-SR2 properties>
检查 |
不是每个人都喜欢从spring-boot-starter-parent
POM 继承。你可能有你自己的企业标准的父母,你需要使用,或者你可能只是喜欢显式声明所有的Maven配置。
如果你不想使用它spring-boot-starter-parent
,你仍然可以通过使用一个scope=import
依赖来保持依赖管理(而不是插件管理)的好处:
<依赖性> <相关性> <! -从春天启动的进口依存度管理- > <的groupId> org.springframework.boot 的groupId> 弹簧引导依赖 artifactId的> <版本> 1.5 .2.RELEASE version> pom type> import scope> dependency> dependencies> dependencyManagement>
如上所述,该设置不允许您使用属性覆盖单个依赖项。要达到相同的结果,您需要在输入之前在dependencyManagement
项目中添加一个 条目。例如,要升级到另一个Spring Data发行版,您需要将以下内容添加到您的。spring-boot-dependencies
pom.xml
<依赖性> <! -覆盖由弹簧引导提供弹簧数据释放列车- > <依赖性> <的groupId> org.springframework.data 的groupId> 弹簧数据releasetrain artifactId的> <版本> Fowler-SR2 version> import scope> pom type> dependency> org.springframework.boot groupId> spring-boot -dependencies artifactId> 1.5.2.RELEASE version> pom type> import scope> dependency> dependencies> dependencyManagement>
在上面的例子中,我们指定了一个BOM,但是任何依赖类型都可以被覆盖。 |
该spring-boot-starter-parent
选相当保守的Java兼容性。如果您想遵循我们的建议并使用较新的Java版本,则可以添加一个 java.version
属性:
1.8 properties>
Spring Boot包含一个Maven插件 ,可以将项目打包为可执行的jar文件。
如果你想使用它,将插件添加到你的部分:
org.springframework.boot groupId> spring-boot-maven-plugin artifactId> plugin> plugins> build>
如果你使用Spring Boot的启动父POM,你只需要添加插件,除非你想改变在父代中定义的设置,否则不需要进行配置。 |
Gradle用户可以在他们的dependencies
部分直接导入“初学者” 。与Maven不同的是,没有“超级父母”可以导入来共享某些配置。
储存库{ jcenter() } 依赖{ 编译(“org.springframework.boot:spring-boot-starter-web:1.5.2.RELEASE”) }
这spring-boot-gradle-plugin
也是可用的,并提供了创建可执行的jar和从源项目运行项目的任务。它还提供 依赖性管理,除其他功能外,还允许您省略由Spring Boot管理的任何依赖项的版本号:
插件{ ID 'org.springframework.boot'版本'1.5.2.RELEASE' ID '的Java' } 储存库{ jcenter() } 依赖{ 编译(“org.springframework.boot:spring-boot-starter-web”) testCompile(“org.springframework.boot:spring-boot-starter-test”) }
可以使用Apache Ant + Ivy构建Spring Boot项目。该 spring-boot-antlib
“的antlib”模块还可以帮助蚂蚁创建可执行的JAR文件。
要声明依赖关系,典型的ivy.xml
文件将如下所示:
version = “2.0” >
organization = “org.springframework.boot” module = “spring-boot-sample-ant” />
name = “compile” description = “编译该模块” />
名称 = ‘运行时’ 延伸 = ‘编译’ 描述 = ‘一切来运行该模块需要’ />
配置>
<依赖性>
<依赖 org =“org.springframework.boot” name = “spring-boot-starter”
rev = “$ {spring-boot.version}” conf = “compile” />
dependencies>
ivy-module>
一个典型的build.xml
将如下所示:
xmlns:ivy = “antlib:org.apache.ivy.ant”
xmlns:spring-boot = “antlib:org.springframework.boot.ant”
name = “myapp” default = “build” >
name = “spring-boot.version” value = “1.3.0.BUILD-SNAPSHOT” />
<目标 名称 = “解析” 描述 = “ - >检索与常春藤依赖性” >
<常春藤:检索 模式 = “LIB / [CONF] / [工件] - [式] - [修改] [EXT]” />
目标>
name = “classpaths” depends = “resolve” >
id = “compile.classpath” >
dir = “lib / compile” includes = “* .jar” />
path>
target>
name = “init” depends = “classpaths” >
dir = “build / classes” />
target>
name = “compile” depends = “init” description = “compile” >
srcdir = “src / main / java” destdir = “build / classes” classpathref = “compile.classpath” />
target>
<目标 名称 = “构建” 取决于 = “编译” >
<弹簧引导:exejar destfile = “建立/ myapp.jar” 类 = “建立/类” >
<弹簧引导:LIB>
<文件集 DIR = “LIB /运行时“ />
spring-boot:lib>
spring-boot:exejar>
target>
project>
如果您不想使用模块,请参见第84.10节“从Ant构建可执行文件,而不使用spring-boot-antlib” |
启动器是一套方便的依赖描述符,可以包含在应用程序中。您可以获得所需的所有Spring及相关技术的一站式服务,无需搜索示例代码,也不需要粘贴依赖关系描述符。例如,如果您想开始使用Spring和JPA进行数据库访问,只需将spring-boot-starter-data-jpa
依赖项包含在您的项目中,那么您就可以开始使用了。
初学者包含很多依赖项,您需要快速启动并运行一个项目,并使用一组支持的传递依赖项。
以下应用程序启动程序由Spring Boot提供 org.springframework.boot
:
表13.1。Spring Boot应用程序启动器
名称 | 描述 | 双响炮 |
---|---|---|
|
使用Thymeleaf视图构建MVC Web应用程序的入门者 |
双响炮 |
|
初级用于使用Couchbase面向文档的数据库和Spring Data Couchbase |
双响炮 |
|
使用Apache Artemis启动JMS消息传递 |
双响炮 |
|
使用Spring Web服务的入门者 |
双响炮 |
|
Starter使用Java Mail和Spring Framework的电子邮件发送支持 |
双响炮 |
|
使用Spring Data Redis和Jedis客户端使用Redis键值数据存储的入门者 |
双响炮 |
|
用于构建Web的入门者,包括使用Spring MVC的RESTful应用程序。使用Tomcat作为默认的嵌入容器 |
双响炮 |
|
初学者使用GemFire分布式数据存储和Spring Data GemFire |
双响炮 |
|
使用Apache ActiveMQ启动JMS消息传递 |
双响炮 |
|
入门使用Elasticsearch搜索和分析引擎和Spring Data Elasticsearch |
双响炮 |
|
初学者使用Spring集成 |
双响炮 |
|
Starter用于测试包含JUnit,Hamcrest和Mockito等库的Spring Boot应用程序 |
双响炮 |
|
将JDBC与Tomcat JDBC连接池配合使用的初学者 |
双响炮 |
|
使用Spring Mobile构建Web应用程序的入门者 |
双响炮 |
|
通过Hibernate Validator使用Java Bean验证的入门者 |
双响炮 |
|
使用Spring MVC和Spring HATEOAS构建基于超媒体的RESTful Web应用程序的入门者 |
双响炮 |
|
使用JAX-RS和Jersey构建RESTful Web应用程序的入门者。替代方案 |
双响炮 |
|
初学者使用Neo4j图形数据库和Spring Data Neo4j |
双响炮 |
|
初学者使用Spring Data LDAP |
双响炮 |
|
使用Spring Framework的WebSocket支持构建WebSocket应用程序的入门者 |
双响炮 |
|
使用Spring AOP和AspectJ进行面向方面编程的入门者 |
双响炮 |
|
使用Spring AMQP和Rabbit MQ的入门者 |
双响炮 |
|
入门使用Cassandra分布式数据库和Spring Data Cassandra |
双响炮 |
|
首先使用Spring社交Facebook |
双响炮 |
|
使用Atomikos启动JTA交易 |
双响炮 |
|
Starter使用Spring Security |
双响炮 |
|
使用Mustache视图构建MVC Web应用程序的入门者 |
双响炮 |
|
使用Spring数据JPA与Hibernate的入门 |
双响炮 |
|
核心启动器,包括自动配置支持,日志记录和YAML |
双响炮 |
|
使用Groovy模板视图构建MVC Web应用程序的入门者 |
双响炮 |
|
使用FreeMarker视图构建MVC Web应用程序的入门者 |
双响炮 |
|
使用Spring Batch的入门者 |
双响炮 |
|
使用Spring社交LinkedIn的站点 |
双响炮 |
|
初学者使用Spring框架的缓存支持 |
双响炮 |
|
启动Spring Data Solr使用Apache Solr搜索平台 |
双响炮 |
|
入门使用MongoDB面向文档的数据库和Spring Data MongoDB |
双响炮 |
|
使用jOOQ访问SQL数据库的入门者。 |
双响炮 |
|
春天启动Narayana JTA起动器 |
双响炮 |
|
使用Spring Cloud连接器的入门,可简化Cloud Foundry和Heroku等云平台中的服务连接 |
双响炮 |
|
使用Bitronix启动JTA事务 |
双响炮 |
|
使用Spring社交Twitter的入门者 |
双响炮 |
|
使用Spring Data REST通过REST公开Spring数据存储库的初学者 |
双响炮 |
除了应用程序启动器之外,还可以使用以下启动器来添加 生产准备功能:
表13.2。Spring Boot生产启动器
名称 | 描述 | 双响炮 |
---|---|---|
|
使用Spring Boot的执行器提供生产准备功能,帮助您监控和管理您的应用程序 |
双响炮 |
|
Starter使用CRaSH远程shell通过SSH监视和管理您的应用程序。自1.5以来已弃用 |
双响炮 |
最后,Spring Boot还包括一些可以用来排除或交换特定技术方面的新手:
表13.3。Spring Boot技术首发
名称 | 描述 | 双响炮 |
---|---|---|
|
使用Undertow作为嵌入式servlet容器的初学者。替代方案 |
双响炮 |
|
使用Jetty作为嵌入式servlet容器的入门。替代方案 |
双响炮 |
|
Starter使用Logback进行日志记录。默认日志启动器 |
双响炮 |
|
使用Tomcat作为嵌入式servlet容器的入门。默认的servlet容器启动器使用 |
双响炮 |
|
使用Log4j2进行日志记录的入门者。替代方案 |
双响炮 |
有关其他社区的列表贡献首先,看 README文件中 |
Spring Boot不需要任何特定的代码布局,但是,有一些最佳实践可以提供帮助。
当一个类不包含package
声明时,它被认为是在“默认包”中。通常不鼓励使用“默认软件包”,应该避免使用“默认软件包”。这可能会导致使用Spring的启动应用程序的特殊问题@ComponentScan
,@EntityScan
或@SpringBootApplication
注解,因为从每一个罐子每一个类,将被读取。
我们建议您遵循Java推荐的软件包命名约定,并使用颠倒的域名(例如 |
我们通常建议您将主应用程序类放在其他类的根包中。该@EnableAutoConfiguration
注解往往放在你的主类,它隐含地定义为某些项目一基地“搜索包”。例如,如果您正在编写JPA应用程序,@EnableAutoConfiguration
则将使用带注释的类的包 来搜索@Entity
项目。
使用根包也允许使用@ComponentScan
注释而不需要指定basePackage
属性。@SpringBootApplication
如果您的主类位于根包中,也可以使用 注释。
这是一个典型的布局:
COM + - 例子 + - 我的项目 + - Application.java | + - 域 | + - Customer.java | + - CustomerRepository.java | + - 服务 | + - CustomerService.java | + - 网络 + - CustomerController.java
该Application.java
文件将声明的main
方法,以及基本 @Configuration
。
包 com.example.myproject; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @Configuration @EnableAutoConfiguration @ComponentScan public class Application { public static void main(String [] args){ SpringApplication.run(应用类,参数); } }
Spring Boot支持基于Java的配置。虽然可以SpringApplication.run()
使用XML来源进行调用 ,但我们通常建议您的主要来源是一个@Configuration
类。通常,定义main
方法的类也是一个很好的候选者@Configuration
。
在互联网上已经发布了许多使用XML配置的Spring配置示例。如果可能,请始终尝试使用基于Java的等效配置。搜索 |
你不需要把所有的@Configuration
东西都放到一个班上。所述@Import
注释可以用于导入额外的配置类。或者,您可以使用@ComponentScan
自动获取所有Spring组件,包括 @Configuration
类。
如果您绝对必须使用基于XML的配置,我们建议您仍然从一个@Configuration
类开始。然后您可以使用额外的@ImportResource
注释来加载XML配置文件。
Spring Boot自动配置会尝试根据您添加的jar依赖项自动配置您的Spring应用程序。例如,If HSQLDB
在您的类路径中,并且您没有手动配置任何数据库连接Bean,那么我们将自动配置一个内存数据库。
您需要选择加入@EnableAutoConfiguration
或 @SpringBootApplication
注释到您的一个@Configuration
类自动配置。
你只能添加一个 |
自动配置是非侵入式的,您可以随时开始定义自己的配置来替换自动配置的特定部分。例如,如果添加自己的DataSource
Bean,则默认的嵌入式数据库支持将退出。
如果您需要了解当前正在应用的自动配置,以及为什么使用--debug
交换机启动您的应用程序。这将启用选择核心记录器的调试日志,并将自动配置报告记录到控制台。
如果您发现正在应用您不需要的特定自动配置类,则可以使用exclude属性@EnableAutoConfiguration
来禁用它们。
import org.springframework.boot.autoconfigure。*; import org.springframework.boot.autoconfigure.jdbc。*; import org.springframework.context.annotation。*; @Configuration @EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class}) public class MyConfiguration { }
如果类不在类路径上,则可以使用excludeName
注释的属性并指定完全限定的名称。最后,还可以通过spring.autoconfigure.exclude
属性控制自动配置类的列表 。
您可以在注释级别和使用属性中定义排除。 |
您可以自由使用任何标准的Spring框架技术来定义您的bean及其注入的依赖关系。为了简单起见,我们经常发现使用@ComponentScan
查找bean,与@Autowired
构造函数注入结合使用效果很好。
如果按照上面的建议构建代码(在根包中查找应用程序类),则可以添加@ComponentScan
任何参数。您的所有应用程序组件(的@Component
,@Service
,@Repository
,@Controller
等)将自动注册为春豆。
这是一个@Service
使用构造函数注入来获取所需RiskAssessor
bean 的示例Bean 。
包 com.example.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service 公共 类 DatabaseAccountService实现 AccountService { 私人 最终 RiskAssessssor风险评估师; @Autowired public DatabaseAccountService(RiskAssessor riskAssessor){ this .riskAssessor = riskAssessor; } // ... }
如果一个bean有一个构造函数,你可以省略@Autowired
。
@Service 公共 类 DatabaseAccountService实现 AccountService { 私人 最终 RiskAssessssor风险评估师; public DatabaseAccountService(RiskAssessor riskAssessor){ this .riskAssessor = riskAssessssor; } // ... }
请注意如何使用构造函数注入允许该 |
许多春季引导开发者总是有其主类注解为@Configuration
, @EnableAutoConfiguration
和@ComponentScan
。由于这些注释经常一起使用(特别是如果您遵循 以上最佳实践),Spring Boot提供了一个方便的@SpringBootApplication
选择。
该@SpringBootApplication
注解相当于使用@Configuration
, @EnableAutoConfiguration
并@ComponentScan
与他们的默认属性:
包 com.example.myproject; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication //与@Configuration相同@EnableAutoConfiguration @ComponentScan public class Application { public static void main(String [] args){ SpringApplication.run(应用类,参数); } }
|
将应用程序打包为jar并使用嵌入式HTTP服务器的最大优点之一是,您可以像运行其他应用程序一样运行应用程序。调试Spring Boot应用程序也很容易; 你不需要任何特殊的IDE插件或扩展。
本节仅介绍基于jar的打包。如果您选择将应用程序打包为war文件,则应参考您的服务器和IDE文档。 |
您可以从IDE运行Spring Boot应用程序作为简单的Java应用程序,但是,首先您需要导入项目。导入步骤取决于您的IDE和构建系统。大多数IDE可以直接导入Maven项目,例如Eclipse用户可以从菜单中选择Import…
→ 。Existing Maven Projects
File
如果不能直接将项目导入IDE,则可以使用构建插件生成IDE元数据。Maven包含Eclipse和 IDEA的插件 ; Gradle为各种IDE提供插件。
如果您不小心运行了两次Web应用程序,则会看到“端口已被使用”错误。STS用户可以使用该 |
如果您使用Spring Boot Maven或Gradle插件来创建可执行的jar文件,您可以使用它来运行您的应用程序java -jar
。例如:
$ java -jar target / myproject-0.0.1-SNAPSHOT.jar
也可以运行打包的应用程序并启用远程调试支持。这使您可以将调试器附加到打包的应用程序中:
$ java -Xdebug -Xrunjdwp:server = y,transport = dt_socket,address = 8000,suspend = n \ -jar target / myproject-0.0.1-SNAPSHOT.jar
Spring Boot Maven插件包含一个run
可用于快速编译和运行应用程序的目标。应用程序以分解形式运行,就像在IDE中一样。
$ mvn spring-boot:运行
您可能还想使用有用的操作系统环境变量:
$ export MAVEN_OPTS = -Xmx1024m -XX:MaxPermSize = 128M
Spring Boot Gradle插件还包含一个bootRun
可用于以分解形式运行应用程序的任务。该bootRun
每当你导入的任务添加spring-boot-gradle-plugin
:
$ gradle bootRun
您可能也想使用这个有用的操作系统环境变量:
$ export JAVA_OPTS = -Xmx1024m -XX:MaxPermSize = 128M
由于Spring Boot应用程序只是普通的Java应用程序,所以JVM热插拔应该是开箱即用的。JVM热交换在某种程度上受限于它可以替换的字节码,为了获得更完整的解决方案, 可以使用JRebel或 Spring Loaded项目。该 spring-boot-devtools
模块还包括支持快速重新启动应用程序。
有关详细信息,请参阅下面的第20章开发人员工具部分和 热插拔“操作方法”。
Spring Boot包含一组额外的工具,可以使应用程序开发体验更愉快。该spring-boot-devtools
模块可以包含在任何项目中以提供额外的开发时间功能。要包含devtools支持,只需将模块依赖关系添加到您的版本:
Maven的。
org.springframework.boot groupId> spring-boot-devtools artifactId> true optional> dependency> dependencies>
摇篮。
依赖{ 编译(“org.springframework.boot:spring-boot-devtools”) }
运行完整打包的应用程序时,开发人员工具会自动禁用 如果您的应用程序是使用 |
重新打包的档案在默认情况下不包含devtools。如果你想使用 某些远程devtools功能,你需要禁用 |
Spring Boot支持的一些库使用缓存来提高性能。例如,模板引擎 将缓存已编译的模板,以避免重复解析模板文件。此外,Spring MVC可以在服务静态资源时将HTTP缓存头添加到响应中。
虽然缓存在生产中非常有益,但在开发过程中可能会产生反作用,使您无法看到您在应用程序中所做的更改。由于这个原因,spring-boot-devtools默认会禁用这些缓存选项。
缓存选项通常由application.properties
文件中的设置进行配置。例如,Thymeleaf提供的spring.thymeleaf.cache
财产。不需要手动设置这些属性,spring-boot-devtools
模块将自动应用合理的开发时间配置。
有关应用的属性的完整列表,请参阅 DevToolsPropertyDefaultsPostProcessor。 |
spring-boot-devtools
当类路径上的文件改变时,使用的应用程序将自动重启。在IDE中工作时,这是一个非常有用的功能,因为它为代码更改提供了一个非常快速的反馈循环。默认情况下,将监视指向文件夹的类路径中的任何条目以进行更改。请注意,某些资源(如静态资产和视图模板)不需要重新启动应用程序。
您也可以通过受支持的构建插件(即Maven和Gradle)启动您的应用程序,只要启用了分叉功能,因为DevTools需要隔离的应用程序类加载器才能正常运行。当Gradle和Maven在类路径中检测到DevTools时,默认会这样做。 |
与LiveReload一起使用时,自动重新启动的效果非常好。 详情请参阅下文。如果使用JRebel,自动重新启动将被禁用,以支持动态类重新加载。其他devtools功能(如LiveReload和属性覆盖)仍然可以使用。 |
DevTools依靠应用程序上下文的关闭挂钩在重新启动期间关闭它。如果您禁用了关闭挂钩( |
当决定是否在类路径中的条目应该触发重新启动时,它的变化,DevTools自动忽略命名的项目 |
某些资源不一定需要在更改时触发重新启动。例如,Thymeleaf模板可以就地编辑。默认情况下,改变资源/META-INF/maven
,/META-INF/resources
,/resources
,/static
,/public
或 /templates
不会触发重新启动,但会引发 现场重装。如果你想自定义这些排除,你可以使用该spring.devtools.restart.exclude
属性。例如,要仅排除 /static
,/public
您将设置以下内容:
spring.devtools.restart.exclude =静态/ **,公共/ **
如果您想保留这些默认值并添加额外的排除项,请改用该 |
您可能希望在更改不在类路径中的文件时重新启动或重新加载应用程序。为此,请使用该 spring.devtools.restart.additional-paths
属性来配置其他路径以查看更改。您可以使用spring.devtools.restart.exclude
属性 上述控制的其他路径下的变化是否会引发全面重启或只是一个 活的重载。
如果您不想使用重新启动功能,则可以使用该spring.devtools.restart.enabled
属性将其禁用 。在大多数情况下,你可以在你的设置application.properties
(这将仍然初始化重启类加载器,但它不会监视文件的变化)。
如果您需要完全禁用重新启动支持,例如,因为它不适用于特定的库,则需要System
在调用之前设置属性 SpringApplication.run(…)
。例如:
public static void main(String [] args){ System.setProperty(“spring.devtools.restart.enabled”,“false”); SpringApplication.run(MyApp的类,参数); }
如果您使用连续编译已更改文件的IDE,则可能只希望在特定时间触发重新启动。要做到这一点,你可以使用“触发文件”,这是一个特殊的文件,当你想要实际触发重新启动检查时,必须修改这个文件。只更改文件会触发检查,只有Devtools检测到必须执行某些操作时才会重新启动。触发文件可以手动更新,也可以通过IDE插件进行更新。
要使用触发器文件,请使用该spring.devtools.restart.trigger-file
属性。
您可能希望将其设置 |
如上面的重新启动vs重新加载部分所述,重新启动功能是通过使用两个类加载器来实现的。对于大多数应用程序来说,这种方法运行良好,但有时候会导致类加载问题。
默认情况下,IDE中的任何打开的项目都将使用“重新启动”类加载器来加载,而任何常规.jar
文件将使用“基本”类加载器加载。如果您使用多模块项目,而不是将每个模块导入到IDE中,则可能需要自定义项目。要做到这一点,你可以创建一个META-INF/spring-devtools.properties
文件。
该spring-devtools.properties
文件可以包含restart.exclude.
和 restart.include.
前缀的属性。这些include
元素是应该被拉入到“重启”类加载器exclude
中的项目,而元素是应该被下推到“基本”类加载器中的项目。该属性的值是一个将应用于类路径的正则表达式模式。
例如:
restart.exclude.companycommonlibs = / MyCorp的共用- [\\瓦特- ]。+ \罐子 restart.include.projectcommon = / MyCorp的-的Myproj - [\\瓦特- ]。+ \罐
所有的财产钥匙必须是唯一的。只要财产始于 |
所有 |
对于使用标准进行反序列化的对象,重新启动功能无法正常工作ObjectInputStream
。如果你需要反序列化数据,你可能需要ConfigurableObjectInputStream
结合Spring 使用 Thread.currentThread().getContextClassLoader()
。
不幸的是,有些第三方库反序列化,而不考虑上下文类加载器。如果您发现这样的问题,您需要向原作者请求修复。
该spring-boot-devtools
模块包含一个嵌入式LiveReload服务器,可用于在资源发生更改时触发浏览器刷新。LiveReload浏览器扩展可从livereload.com的 Chrome,Firefox和Safari免费获得 。
如果您不想在应用程序运行时启动LiveReload服务器,则可以将该spring.devtools.livereload.enabled
属性设置为false
。
一次只能运行一个LiveReload服务器。在开始您的应用程序之前,请确保没有其他LiveReload服务器正在运行。如果您从IDE启动多个应用程序,则只有第一个应用程序支持LiveReload。 |
您可以通过添加一个文件名为配置全局devtools设置 .spring-boot-devtools.properties
你的$HOME
文件夹(注意:文件名开头“”)。添加到此文件的任何属性都将应用于使用devtools的计算机上的所有 Spring Boot应用程序。例如,要将重新启动配置为始终使用触发器文件,可以添加以下内容:
〜/ .spring引导-devtools.properties。
spring.devtools.reload.trigger-file = .reloadtrigger
Spring Boot开发人员工具不仅限于本地开发。您还可以在远程运行应用程序时使用多个功能。远程支持是选择性的,为了启用它,您需要确保devtools
包含在重新打包的存档中:
org.springframework.boot groupId> spring-boot-maven-plugin artifactId> false excludeDevtools> configuration> plugin> plugins> build>
那么你需要设置一个spring.devtools.remote.secret
属性,例如:
spring.devtools.remote.secret = mysecret
启用 |
远程devtools支持分两部分提供; 有一个接受连接的服务器端点以及您在IDE中运行的客户端应用程序。在spring.devtools.remote.secret
设置属性时,服务器组件会自动启用。客户端组件必须手动启动。
远程客户端应用程序旨在从您的IDE中运行。您需要org.springframework.boot.devtools.RemoteSpringApplication
使用与您要连接的远程项目相同的类路径运行。传递给应用程序的非选项参数应该是您要连接到的远程URL。
例如,如果您使用的是Eclipse或STS,并且您有一个my-app
已经部署到Cloud Foundry的项目,则可以执行以下操作:
Run Configurations…
从Run
菜单。Java Application
“启动配置”。my-app
项目。org.springframework.boot.devtools.RemoteSpringApplication
作为主类。https://myapp.cfapps.io
到Program arguments
(或任何您的远程URL是)。正在运行的远程客户端将如下所示:
。____ _ __ _ _ / \\ / _____ __ _ _(_)_ __ _ _ ___ _ \ \ \ \ (()\ ___ |'_ |'_ | |'_ \ / _` | | _ \ ___ _ __ ___ | | _ ___ \ \ \ \ \\ / ___)| | _)| | | | | || (_ | [] :::::: [] / -_)'\ / _ \ _ / -_))))) '| ____ | .__ | _ | | _ | _ | | _ \ __,| | _ | _ \ ___ | _ | _ | _ \ ___ / \ __ \ ___ | / / / / ========= | _ | ============== | ___ / ===================== ============== / _ / _ / _ / :: Spring Boot Remote :: 1.5.2.RELEASE 2015-06-10 18:25:06.632信息14938 --- [main] osbdevtools.RemoteSpringApplication:在pwmbp上用PID 14938启动RemoteSpringApplication(/ Users / pwebb / projects / spring-boot / code / spring-boot-devtools / target / classes在/ Users / pwebb / projects / spring-boot / code / spring-boot-samples / spring-boot-sample-devtools中由pwebb启动) 2015-06-10 18:25:06.671 INFO 14938 --- [main] scaAnnotationConfigApplicationContext:Refreshing org.spring framework.context.annotation.AnnotationConfigApplicationContext @ 2a17b7b6:启动日期[Wed Jun 10 18:25:06 PDT 2015]; 上下文层次的根 2015-06-10 18:25:07.043 WARN 14938 --- [main] osbdrcRemoteClientConfiguration:连接到http:// localhost:8080是不安全的。您应该使用以“https://”开头的网址。 2015-06-10 18:25:07.074信息14938 --- [main] osbdaOptionalLiveReloadServer:LiveReload服务器端口35729上运行 2015-06-10 18:25:07.130信息14938 --- [main] osbdevtools.RemoteSpringApplication:在0.74秒内启动RemoteSpringApplication(JVM运行为1.105)
由于远程客户端使用与实际应用程序相同的类路径,因此可以直接读取应用程序属性。这是如何 |
总是建议使用 |
如果您需要使用代理来访问远程应用程序,请配置 |
远程客户端将以与本地重启相同的方式监视您的应用程序类路径的更改。任何更新的资源将被推送到远程应用程序,并(如果需要)触发重新启动。如果您正在迭代使用您本地没有的云服务的功能,这可能会非常有帮助。通常远程更新和重新启动比完整的重建和部署周期快得多。
只有远程客户端正在运行时才监视文件。如果在启动远程客户端之前更改文件,则不会将其推送到远程服务器。 |
Java远程调试在诊断远程应用程序的问题时非常有用。不幸的是,当您的应用程序部署在数据中心之外时,并不总是可以启用远程调试。如果您使用基于容器的技术(例如Docker),则远程调试也可能非常棘手。
为了帮助解决这些限制,devtools支持通过HTTP隧道传输远程调试流量。远程客户端在端口上提供本地服务器8000
,您可以将其附加到远程调试器。建立连接后,调试流量将通过HTTP发送到远程应用程序。spring.devtools.remote.debug.local-port
如果您想使用其他端口,则可以使用该属性。
您需要确保您的远程应用程序在启用远程调试的情况下启动。通常这可以通过配置来实现JAVA_OPTS
。例如,使用Cloud Foundry,您可以将以下内容添加到您的manifest.yml
:
--- env: JAVA_OPTS:“-Xdebug -Xrunjdwp:server = y,transport = dt_socket,suspend = n”
请注意,您不需要传递 |
通过Internet调试远程服务可能会很慢,您可能需要增加IDE中的超时。例如,在Eclipse中,您可以选择 |
在IntelliJ IDEA中使用远程调试通道时,必须将所有断点配置为挂起线程而不是VM。默认情况下,IntelliJ IDEA中的断点会挂起整个虚拟机,而不是挂起命中断点的线程。这具有暂停管理远程调试通道的线程的不良副作用,导致您的调试会话冻结。在IntelliJ IDEA中使用远程调试通道时,应将所有断点配置为挂起线程而不是VM。请参阅 IDEA-165769了解更多详情。 |
可执行的罐子可用于生产部署。由于它们是独立的,因此它们也非常适合基于云的部署。
对于其他“生产就绪”功能,如健康,审计和度量REST或JMX端点; 考虑加入spring-boot-actuator
。有关详细信息,请参阅 第五部分“弹簧执行器:生产就绪功能”。
您现在应该对如何使用Spring Boot以及您应该遵循的一些最佳实践有很好的理解。您现在可以继续深入了解特定的 Spring Boot功能,或者可以跳过并阅读Spring Boot 的“ 生产准备 ”部分。
本节将深入探讨Spring Boot的细节。在这里,您可以了解要使用和定制的关键功能。如果还没有,可能需要阅读第II部分“入门”和 第III部分“使用Spring Boot”部分,以便您了解基础知识。
本SpringApplication
类提供了一个方便的方式来引导,将来自启动Spring应用程序main()
的方法。在许多情况下,你可以委托给静态SpringApplication.run
方法:
public static void main(String [] args){ SpringApplication.run(MySpringConfiguration 类,参数); }
当您的应用程序启动时,您应该看到类似于以下内容:
。____ _ __ _ _ / \\ / _____ __ _ _(_)_ __ __ _ \ \ \ \ (()\ ___ |'_ |'_ | |'_ \ / _` | \ \ \ \ \\ / ___)| | _)| | | | | || (_ | |)))) '| ____ | .__ | _ | | _ | _ | | _ \ __,| / / / / ========= | _ | ============== | ___ / = / _ / _ / _ / :: Spring Boot :: v1.5.2.RELEASE 2013-07-31 00:08:16.117 INFO 56603 --- [main] osbsapp.SampleApplication:在我的电脑上用PID 56603启动SampleApplication v0.1.0(/apps/myapp.jar由pwebb启动) 2013-07-31 00:08:16.166 INFO 56603 --- [main] ationConfigEmbeddedWebApplicationContext:Refreshing org.springframework.boot .context.embedded.AnnotationConfigEmbeddedWebApplicationContext @ 6e5a8246:startup date [Wed Jul 31 00:08:16 PDT 2013]; 上下文层次的根 2014-03-04 13:09:54.912信息41370 --- [main] .t.TomcatEmbeddedServletContainerFactory:服务器初始化端口:8080 2014-03-04 13:09:56.501 INFO 41370 --- [main] osbsapp.SampleApplication:在2.992秒内启动SampleApplication(运行JVM 3.658)
默认情况下,INFO
将显示日志消息,包括一些相关的启动详细信息,如启动应用程序的用户。
如果您的应用程序无法启动,注册FailureAnalyzers
有机会提供一个专门的错误信息和一个具体的行动来解决这个问题。例如,如果您在端口上启动Web应用程序,8080
并且该端口已被使用,则应该看到类似于以下内容的内容:
*************************** 应用程序无法启动 *************************** 描述: 嵌入式servlet容器无法启动。端口8080已经被使用。 行动: 识别并停止在端口8080上侦听的进程或配置此应用程序在另一个端口上侦听。
Spring Boot提供了很多的 |
如果没有故障分析仪能够处理异常,您仍然可以显示完整的自动配置报告,以更好地了解出了什么问题。为此,您需要 启用该debug
属性或 启用DEBUG
日志记录功能org.springframework.boot.autoconfigure.logging.AutoConfigurationReportLoggingInitializer
。
例如,如果您正在使用您的应用程序运行您java -jar
可以启用该 debug
属性,如下所示:
$ java -jar myproject-0.0.1-SNAPSHOT.jar --debug
启动时打印的横幅可以通过将banner.txt
文件添加到类路径中,或通过设置banner.location
文件的位置来更改。如果文件有一个不寻常的编码,你可以设置banner.charset
(默认是UTF-8
)。除了一个文本文件,你还可以添加一个banner.gif
,banner.jpg
或banner.png
图像文件到您的类路径,或者设置一个banner.image.location
属性。图像将被转换成ASCII艺术表现形式并打印在任何文字横幅上方。
在您的banner.txt
文件中,您可以使用以下任何占位符:
表23.1。横幅变量
变量 | 描述 |
---|---|
|
您申请的申请版本号 |
|
您的应用程序的版本号 |
|
您正在使用的Spring Boot版本。例如 |
|
您正在使用的弹簧启动版本被格式化显示(用方括号括起并且前缀 |
|
|
|
你在申请中申请的标题 |
|
您也可以使用该spring.main.banner-mode
属性来确定是否必须使用已配置的记录器()或不是(all )System.out
(console
)打印横幅log
(off
)。
打印的横幅将在名称下注册为一个singleton bean springBootBanner
。
YAML映射 春天: 主要: 横幅模式:“关闭” |
如果SpringApplication
默认值不符合您的口味,则可以创建一个本地实例并对其进行自定义。例如,要关闭横幅,你会写:
public static void main(String [] args){ SpringApplication应用= 新 SpringApplication(MySpringConfiguration。类); app.setBannerMode(Banner.Mode.OFF); app.run(参数); }
传递给构造函数的参数 |
也可以配置SpringApplication
使用application.properties
文件。有关详细信息,请参阅第24章,外部化配置。
有关配置选项的完整列表,请参阅 SpringApplication
Javadoc。
如果您需要构建一个ApplicationContext
层次结构(具有父/子关系的多个上下文),或者您只是更喜欢使用“流利的”构建器API,则可以使用SpringApplicationBuilder
。
将SpringApplicationBuilder
让您链在一起的多个方法调用,包括parent
和child
,让您创建一个层次结构的方法。
例如:
新的 SpringApplicationBuilder() .sources(父类) .child(应用程序类) .bannerMode(Banner.Mode.OFF) .RUN(参数);
在创建 |
除了通常的Spring框架的事件,比如 ContextRefreshedEvent
,一个SpringApplication
发送一些附加的应用程序事件。
有些事件实际上 如果您希望这些监听器自动注册,而不管创建应用程序的方式如何,您可以将 org.springframework.context.ApplicationListener = com.example.project.MyListener |
应用程序事件按照以下顺序发送,就像您的应用程序运行一样:
ApplicationStartingEvent
在运行开始时发送,但是在除了监听器和初始化器的注册之外的任何处理之前。ApplicationEnvironmentPreparedEvent
发送An Environment
。ApplicationPreparedEvent
在刷新开始之前发送一个,但在bean定义被加载之后。ApplicationReadyEvent
在刷新之后发送一个并且已经处理了任何相关的回调以指示应用准备好为请求提供服务。ApplicationFailedEvent
如果启动时出现异常,则发送An 。您通常不需要使用应用程序事件,但可以方便地知道它们存在。在内部,Spring Boot使用事件来处理各种任务。 |
A SpringApplication
将会尝试以ApplicationContext
您的名义创建正确的类型。默认情况下,将使用AnnotationConfigApplicationContext
或AnnotationConfigEmbeddedWebApplicationContext
将被使用,这取决于您是否正在开发Web应用程序。
用于确定“Web环境”的算法相当简单(基于少数类的存在)。setWebEnvironment(boolean webEnvironment)
如果您需要覆盖默认值,您可以使用。
也可以完全控制ApplicationContext
将被调用的类型setApplicationContextClass(…)
。
在JUnit测试中 |
如果您需要访问传递给SpringApplication.run(…)
您的应用程序参数, 可以注入一个 org.springframework.boot.ApplicationArguments
bean。该ApplicationArguments
接口提供对原始String[]
参数以及解析option
和 non-option
参数的访问:
import org.springframework.boot。* import org.springframework.beans.factory.annotation。* import org.springframework.stereotype。* @Component 公共 类 MyBean { @Autowired public MyBean(ApplicationArguments args){ boolean debug = args.containsOption( “debug”); Listfiles = args.getNonOptionArgs(); //如果用“--debug logfile.txt”debug = true,files = [“logfile.txt”] } }
Spring Boot也将 |
如果您需要在启动后运行一些特定的代码SpringApplication
,您可以实现ApplicationRunner
或CommandLineRunner
接口。这两个接口都以相同的方式工作,并提供一个run
方法,将在SpringApplication.run(…)
完成之前调用 。
这些CommandLineRunner
接口提供对应用程序参数的访问,作为一个简单的字符串数组,而ApplicationRunner
使用ApplicationArguments
上面讨论的接口。
import org.springframework.boot。* import org.springframework.stereotype。* @Component 公共 类 MyBean实现了 CommandLineRunner { 公共 无效运行(字符串...参数){ //做些什么... } }
您还可以实现org.springframework.core.Ordered
接口或使用 org.springframework.core.annotation.Order
注释,如果定义了几个CommandLineRunner
或ApplicationRunner
bean,则必须按特定顺序调用它们。
每个SpringApplication
JVM都会注册一个关闭钩子,以确保 ApplicationContext
退出时正常关闭。所有标准的Spring生命周期回调(如DisposableBean
接口或@PreDestroy
注释)都可以使用。
另外,org.springframework.boot.ExitCodeGenerator
如果bean 在应用程序结束时希望返回特定的退出代码,则它们可以实现该接口。
可以通过指定spring.application.admin.enabled
属性为应用程序启用与管理相关的功能 。这暴露 SpringApplicationAdminMXBean
了平台上MBeanServer
。您可以使用此功能远程管理您的Spring Boot应用程序。这对于任何服务包装实现也是有用的。
如果您想知道应用程序在哪个HTTP端口上运行,请使用密钥获取该属性 |
启用此功能时要小心,因为MBean公开了一种关闭应用程序的方法。 |
Spring Boot允许您将配置外部化,以便在不同的环境中使用相同的应用程序代码。您可以使用属性文件,YAML文件,环境变量和命令行参数来外部化配置。属性值可以直接使用注入到你的豆@Value
注释,通过Spring的访问Environment
抽象或 绑定到结构化对象 通过@ConfigurationProperties
。
Spring Boot使用了一个非常特殊的PropertySource
命令,旨在让值得注意的重写。属性按以下顺序考虑:
~/.spring-boot-devtools.properties
当devtools处于活动状态时)。@TestPropertySource
您的测试中的注释。@SpringBootTest#properties
注释属性在您的测试。SPRING_APPLICATION_JSON
(内联JSON嵌入在环境变量或系统特性)ServletConfig
初始化参数。ServletContext
初始化参数。java:comp/env
。System.getProperties()
)。RandomValuePropertySource
只有属性random.*
。application-{profile}.properties
和YAML变种)之外的特定于配置文件的应用程序属性application-{profile}.properties
和YAML变体)中的特定于配置文件的应用程序属性application.properties
和YAML变体)之外的应用程序属性。application.properties
和YAML变体)。@PropertySource
在你的@Configuration
课堂上的注释。SpringApplication.setDefaultProperties
)。为了提供一个具体的例子,假设你开发一个@Component
使用 name
属性:
import org.springframework.stereotype。* import org.springframework.beans.factory.annotation。* @Component 公共 类 MyBean { @Value(“$ {name}”) 私人字符串名称; // ... }
在您的应用程序类路径中(例如,在您的jar中),您可以 application.properties
为其提供一个合理的默认属性值name
。当在新的环境中运行时,application.properties
可以在你的jar外面提供一个覆盖的环境name
; 对于一次性测试,您可以使用特定的命令行开关(例如java -jar app.jar --name="Spring"
)启动。
这些 $ SPRING_APPLICATION_JSON ='{“foo”:{“bar”:“spam”}}'java -jar myapp.jar 在这个例子中,你将 $ java -Dspring.application.json ='{“foo”:“bar”}'-jar myapp.jar 或命令行参数: $ java -jar myapp.jar --spring.application.json ='{“foo”:“bar”}' 或者作为一个JNDI变量 |
这RandomValuePropertySource
对注入随机值很有用(例如注入秘密或测试用例)。它可以产生整数,长整数,uuids或字符串,例如
my.secret = $ {random.value} my.number = $ {random.int} my.bignumber = $ {random.long} my.uuid = $ {random.uuid} my.number.less.than.ten = $ {random.int(10)} my.number.in.range = $ {random.int [1024,65536]}
该random.int*
语法是OPEN value (,max) CLOSE
其中的OPEN,CLOSE
任何字符和value,max
是整数。如果max
提供,则value
是最小值,max
是最大(独占)。
默认情况下,SpringApplication
会将任何命令行选项参数(以' - '开头--server.port=9000
)转换为property
并添加到Spring中 Environment
。如上所述,命令行属性总是优先于其他属性源。
如果您不想将命令行属性添加到Environment
您可以使用禁用它们SpringApplication.setAddCommandLineProperties(false)
。
SpringApplication
将从application.properties
以下位置的文件加载属性并将其添加到Spring Environment
:
/config
当前目录下的子目录。/config
包该列表按优先顺序排列(在列表中较高的位置定义的属性将覆盖在较低位置定义的属性)。
您也可以使用YAML('.yml')文件替代“.properties”。 |
如果您不喜欢application.properties
作为配置文件名,则可以通过指定spring.config.name
环境属性来切换到另一个名称。您还可以使用spring.config.location
环境属性(以逗号分隔的目录位置列表或文件路径)引用显式位置。
$ java -jar myproject.jar --spring.config.name = myproject
要么
$ java -jar myproject.jar --spring.config.location = classpath:/default.properties,classpath:/override.properties
|
如果spring.config.location
包含目录(而不是文件),它们应该以/
(并且将spring.config.name
被加载之前生成的名称,包括配置文件特定的文件名称)结尾。指定的文件 spring.config.location
按原样使用,不支持特定于配置文件的变体,并且将被特定于配置文件的特性覆盖。
classpath:,classpath:/config,file:,file:config/
总是使用默认的搜索路径,而不考虑其值spring.config.location
。此搜索路径按从低到高的顺序排列(file:config/
胜出)。如果您确实指定了自己的位置,则它们优先于所有默认位置,并使用相同的从最低到最高的优先顺序。通过这种方式,您可以为您的应用程序application.properties
(或您选择的其他基本名称 spring.config.name
)设置默认值,并在运行时使用不同的文件覆盖它,保持默认值。
如果使用环境变量而不是系统属性,大多数操作系统都不允许使用句点分隔的键名称,但是可以使用下划线( |
如果您正在容器中运行,则可以使用JNDI属性(in |
除application.properties
文件外,还可以使用命名约定来定义配置文件特定的属性application-{profile}.properties
。在 Environment
具有一组默认的配置文件(默认情况下[default]
,如果没有激活的配置文件设置其中使用)(即,如果配置文件没有显式地激活然后从属性application-default.properties
加载)。
特定于配置文件的属性是从标准的相同位置加载的 application.properties
,配置文件特定的文件总是覆盖非特定的文件,而不管配置文件特定的文件是在打包的jar内还是外部。
如果指定了多个配置文件,则应用最后一个赢取策略。例如,由spring.profiles.active
属性指定的配置文件将添加到通过SpringApplication
API 配置的配置文件之后,因此优先。
如果您已经指定了任何文件 |
这些值在application.properties
被使用的Environment
时候会被现有的过滤掉,所以你可以返回到以前定义的值(例如从系统属性中)。
app.name = MyApp app.description = $ {app.name}是一个Spring Boot应用程序
您也可以使用这种技术来创建现有Spring Boot属性的“简短”变体。有关详细信息,请参见第72.4节“使用简短的命令行参数”。 |
YAML是JSON的超集,因此是用于指定分层配置数据的非常方便的格式。该SpringApplication
课程将自动支持YAML作为一种替代性,只要你有 SnakeYAML在classpath库。
如果使用“Starter”,SnakeYAML将会自动提供 |
Spring框架提供了两个方便的类,可以用来加载YAML文档。在YamlPropertiesFactoryBean
将加载YAML作为Properties
和 YamlMapFactoryBean
将加载YAML作为Map
。
例如,下面的YAML文件:
环境: dev: url:http://dev.bar.com 名称:开发人员设置 prod: url:http://foo.bar.com 名称:我的酷应用程序
将被转化为这些属性:
environments.dev.url = http://dev.bar.com environments.dev.name =开发人员设置 environments.prod.url = http://foo.bar.com environments.prod.name =我的酷应用程序
YAML列表被表示为具有[index]
解引用的属性键,例如这个YAML:
我: 服务器: - dev.bar.com - foo.bar.com
将被转化为这些属性:
my.servers [0] = dev.bar.com my.servers [1] = foo.bar.com
要使用Spring DataBinder
实用程序绑定到类似的属性(这是什么 @ConfigurationProperties
),你需要在java.util.List
(或Set
)类型的目标bean中拥有一个属性, 并且你需要提供一个setter,或者用一个可变值初始化它,例如this将绑定到上面的属性
@ConfigurationProperties(prefix =“my”) public class Config { private Listservers = new ArrayList(); 公共列表<字符串> getServers(){ 返回 这个 .servers; } }
这个YamlPropertySourceLoader
类可以用来在YAML中作为PropertySource
Spring的一个Environment
。这使您可以使用@Value
带有占位符语法的熟悉注释来访问YAML属性。
您可以通过使用一个spring.profiles
键来指定文档应用的时间,在单个文件中指定多个特定于配置文件的YAML文档。例如:
服务器: 地址:192.168。1.100 --- spring: profiles:开发 服务器: 地址:127.0。0.1 --- 春天: 配置文件:生产 服务器: 地址:192.168。1.120
在上面的示例中,如果 配置文件处于活动状态,则该server.address
属性为。如果和配置文件没有 启用,那么属性的值将是。127.0.0.1
development
development
production
192.168.1.100
如果在应用程序上下文启动时没有显式激活,则默认配置文件被激活。所以在这个YAML中,我们为security.user.password
它设置了一个值, 只有在“默认”配置文件中可用:
server: port:8000 --- spring: profiles:default security: user: password:weak
而在这个例子中,密码总是被设置的,因为它没有被附加到任何配置文件,并且必须在所有其他配置文件中显式重置,如有必要:
服务器: 端口:8000 安全性: 用户: 密码:弱
使用“spring.profiles”元素指定的弹簧配置文件可以有选择地使用该!
字符进行否定。如果为单个文档指定了否定配置文件和非否定配置文件,则至少有一个非否定配置文件必须匹配,且否定配置文件可能不匹配。
YAML文件不能通过@PropertySource
注释加载。所以在需要以这种方式加载值的情况下,您需要使用一个属性文件。
正如我们上面看到的,任何YAML内容最终都会转换为属性。当通过配置文件覆盖“列表”属性时,该过程可能不直观。
例如,假定默认情况下MyPojo
具有name
和description
属性的对象null
。让我们揭露的名单MyPojo
来自FooProperties
:
@ConfigurationProperties(“foo”) 公共 类 FooProperties { private final Listlist = new ArrayList <>(); public ListgetList(){ return this .list; } }
考虑以下配置:
foo: list: - name:my name description:my description --- spring: profiles:dev foo: list: - name:my another name
如果dev
配置文件不活跃,FooProperties.list
将包含MyPojo
上面定义的一个条目。如果dev
配置文件但是启用后,list
将仍然 只有一项(名称为“我的另一名”和说明null
)。此配置不会将第二个MyPojo