领先一步
VMware 提供培训和认证,助您加速进步。
了解更多Spring Tool Suite 3.6.4 已于上周发布。这篇博客文章是一个教程,演示了 STS 为创建和使用 Spring Boot 应用程序提供的一些新功能。
在本教程中,您将学习如何
我们使用“New Spring Starter”向导来创建一个基本的 Spring Boot 应用程序。

Spring Boot 提供了所谓的“启动器”(starters)。启动器是一组类路径依赖项,它们与 Spring Boot 自动配置一起,使您无需进行任何配置即可开始开发应用程序。我们选择“web”启动器,因为我们将构建一个简单的“Hello”REST 服务。

该向导是一个 GUI 前端,它在底层使用 start.spring.io 的 Web 服务来生成一些基本的脚手架。您可以直接使用该 Web 服务,下载它生成的 zip 文件,解压,然后导入等等。使用 STS 向导只需点击一个按钮即可完成所有这些操作,并确保项目配置正确,以便您立即开始编码。
点击完成按钮后,您的工作区将如下所示:

目前,由 start.spring.io 生成的 HelloBootApplication Java 主类是我们应用程序中唯一的代码。由于 Spring Boot 的“魔力”,并且我们向依赖项添加了“web”启动器,这小段代码已经是一个功能齐全的 Web 服务器了!它只是还没有任何实际内容。在添加内容之前,让我们学习如何运行应用程序,并验证它确实正在运行。
通过向导创建的 Spring Boot 应用程序有两种类型:“jar”或“war”。启动器向导允许您在其“packaging”选项中选择它们。Spring Boot 的一个很棒的功能是,您可以轻松创建包含功能齐全的嵌入式 Web 服务器的独立“jar”打包项目。运行您的应用程序所需的只是运行它的 Java Main 类型,就像运行任何其他普通 Java 应用程序一样。这是一个巨大的优势,因为您不必费心设置本地或远程 Tomcat 服务器、war 打包和部署。如果您真的想“走难路”,仍然可以选择“war”打包。但是,确实没有必要这样做,因为
注意:我们不会在这里介绍如何将应用程序部署到 Cloud Foundry,但在 这篇文章中,您可以了解更多关于使用 Cloud Foundry Eclipse 直接从您的 IDE 进行部署的信息。
现在,如果您理解了我刚才所说的,那么您可能会意识到您实际上不需要 STS 的任何“特殊”工具来在本地运行应用程序。只需点击 Java Main 类型并选择“Run As >> Java Application”,瞧!您所有的标准 Eclipse Java 调试工具也将“正常工作”。然而,STS 提供了一个专用启动器,它基本上做同样的事情,但增加了一些有用的附加功能。所以让我们改用它。

您的应用程序应该会启动,并且您应该在控制台视图中看到一些输出

您可以在 https://:8080 上打开在本地运行的应用程序。您将只得到一个 404 错误页面,但这正是预期的,因为我们尚未向应用程序添加任何实际内容。
那么,我承诺的附加功能是什么呢?“Run As >> Boot App”基本上是一个普通的 Java 启动器,但提供了一些额外的选项来自定义它创建的启动配置。要查看这些选项,我们需要打开“Launch Configuration Editor”,可以通过
或
工具栏按钮访问

如果您在 Eclipse 中使用过 Java 启动配置编辑器,这应该很熟悉。对于 Boot 启动配置,“Main”选项卡有所不同,并有一些额外内容。我不会讨论所有额外内容,您可以在 STS 3.6.4 发布说明 中找到更多信息。因此,让我们只做一些简单的事情,例如,将默认的 http 端口 8080 覆盖为其他端口,例如 8888。您可能会猜到这可以通过设置系统属性来完成。在“纯”Java 启动器中,您可以通过命令行参数设置此类属性。但是,您可能想知道,该属性的名称究竟是“spring.port”、“http.port”、“spring.server.port”?幸运的是,启动配置编辑器提供了帮助。Override Properties 表提供了一些基本的内容辅助。您只需键入“port”,它就会提供一些建议

选择 server.port,在右侧列中添加值 8888,然后单击“Run”。
如果您严格按照步骤操作到这一点,您的启动可能会立即因异常而终止
Error: Exception thrown by the agent : java.rmi.server.ExportException: Port already in use: 31196; nested exception is:
java.net.BindException: Address already in use
这可能有点令人惊讶,因为我们刚刚更改了端口,不是吗?实际上,这里的端口冲突不是来自 http 端口,而是用于启用“Live Bean Graph Support”的 JMX 端口(我不会在这篇博客文章中讨论此功能,请参阅 STS 3.6.4 发布说明)。
我们可以采取一些措施来避免这个错误。我们可以再次打开编辑器并更改 JMX 端口,或者我们可以禁用“Live Bean Support”。但在此场景中,我们可能并不真正希望运行多个应用程序实例。因此,我们应该在启动新实例之前停止已运行的实例。由于这是一个非常常见的操作,STS 提供了一个
工具栏按钮,专门用于此目的。点击该按钮,正在运行的应用程序将被停止并使用您刚刚对启动配置所做的更改重新启动。如果成功,您现在应该在 https://:8888 而不是 8080 看到一个 404 错误页面。(注意:如果您尚未启动任何内容,重新启动按钮将不起作用,因为它从您当前会话的启动历史记录中工作。但是,如果您至少启动过一次应用程序,则重新启动已终止的应用程序是可以的。)
从启动配置编辑器中覆盖默认属性值对于“快速覆盖”很方便,但长期来看,依靠它来配置许多属性和管理更复杂的配置可能不是一个好主意。为此,最好在属性文件中管理属性,您可以将其提交到 SCM。启动向导已经为我们方便地创建了一个空的 application.properties 文件。
为了帮助您编辑 application.properties,STS 3.6.4 提供了一个全新的 Spring Properties Editor。该编辑器提供了出色的内容辅助和错误检查功能

上面的屏幕截图显示了对内容辅助和错误检查的一些“修修补补”。目前对于我们非常简单的“错误页面应用程序”来说,唯一真正有意义的属性是 server.port。尝试更改属性文件中的端口,当您再次运行应用程序时,它应该会自动生效。但是请注意,启动配置中覆盖的属性优先于 application.properties。因此,您必须取消选中或删除启动配置中的 server.port 属性才能看到效果。
让我们让我们的应用程序更有趣。我们将做以下事情:
要创建 REST 服务,您可以遵循 本指南。但是,我们正在做一些更简单、更直接的事情。
继续创建一个包含此代码的控制器类
package demo;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@RequestMapping("/hello")
public String hello(@RequestParam String name) {
return "Hello "+name;
}
}
通过重新启动(
)您的应用程序来尝试一下。URL https://:8888/hello?name=Kris 应该返回文本消息“Hello Kris”。
这实际上很容易做到,您可能熟悉 Spring 的 @Value 注解。但是,使用 @Value 您将无法获得良好的内容辅助。Spring Properties Editor 将不会知道您以这种方式定义的属性。要理解为什么,了解 Spring Properties Editor 如何获取其关于已知属性的信息是很有用的。
从版本 1.2.x 开始的一些 Spring Boot Jar 包含特殊的 JSON 元数据文件,编辑器会在您的项目类路径中查找并解析这些文件。这些文件包含有关已知配置属性的信息。如果您稍作深入,可以从 STS 中找到这些文件。例如,打开“spring-boot-autoconfigure-1.2.2.RELEASE.jar”(在“Maven Dependencies”下)并浏览到“META-INF/spring-configuration-metadata.json”。您会发现像 server.port 这样的属性在那里有文档。

为了让编辑器识别我们自己定义的用户属性,我们必须创建这个元数据。幸运的是,只要您使用 Spring Boot @ConfigurationProperties 定义属性,就可以轻松地自动化这个过程。因此,定义一个像这样的类
package demo;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties("hello")
public class HelloProperties {
/**
* Greeting message returned by the Hello Rest service.
*/
private String greeting = "Welcome ";
public String getGreeting() {
return greeting;
}
public void setGreeting(String greeting) {
this.greeting = greeting;
}
}
@ConfigurationProperties("hello") 告诉 Boot 查找以 hello. 开头的配置属性,并尝试将它们注入到 HelloProperties Bean 的相应 Bean 属性中。@Component 注解标记此类,以便 Spring Boot 在扫描类路径时会发现它并将其转换为一个 Bean。因此,如果配置文件(或另一个属性源)包含属性 hello.greeting,则该属性的值将被注入到我们的 HelloProperties Bean 的 setGreeting 方法中。
现在,要实际使用此属性,我们只需要对该 bean 的引用。例如,要自定义 REST 服务返回的消息,我们可以向 HelloController 添加一个 @Autowired 字段并调用其 getGreeting 方法
@RestController
public class HelloController {
@Autowired
HelloProperties props;
@RequestMapping("/hello")
public String hello(@RequestParam String name) {
return props.getGreeting()+name;
}
}
再次重新启动您的应用程序,并尝试访问 https://:8888/hello?name=yourname。您应该会收到默认的“Welcome yourname”消息。
现在继续尝试编辑 application.properties 并将问候语更改为其他内容。尽管我们已经具备了在运行时正确定义属性的一切条件,但您会注意到编辑器仍然不知道我们新创建的属性

要使编辑器知道,仍然缺少 spring-configuration-metadata.json 文件。此文件是在构建时由 spring-boot-configuration-processor(一个 Java 注解处理器)创建的。我们必须将此处理器添加到我们的项目并确保它在项目构建期间执行。
将此添加到 pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
然后执行“Maven >> Update Project”以触发项目配置更新。STS 提供的 Maven 项目配置器将配置 JDT APT 并激活 Eclipse 构建的处理器。警告将立即从编辑器中消失。您还将获得正确的悬停信息

现在注解处理器已被激活,将来对 HelloProperties 类的任何更改都将触发 json 元数据的自动更新。您可以尝试添加一些额外的属性,或将 greeting 属性重命名为其他名称。警告将适当地出现/消失。如果您好奇您的元数据文件在哪里,您可以在 target/classes/META-INF 中找到它。文件在那里,即使 Eclipse 尽力向您隐藏它。Eclipse 对项目输出文件夹中的所有文件都这样做。但是,您可以使用 Navigator 视图来绕过此问题,该视图不会过滤太多文件,并向您显示工作区中实际资源的更直接视图。通过“Window >> Show View >> Other >> Navigator”打开此视图

注意:我们知道添加处理器的手动步骤似乎是不必要的复杂化。我们计划在未来 进一步自动化此过程。
希望您喜欢本教程。欢迎提出意见和问题。在另一篇即将发布的文章中,我将向您展示 @ConfigurationProperties 的更高级用法以及 STS 属性编辑器如何支持这些用法。