乐趣区

关于spring:Spring认证指南了解如何以最少的配置构建应用程序

原题目:Spring 认证指南 | 应用 Spring Boot 构建应用程序

Spring 认证指南:理解如何以起码的配置构建应用程序
本指南提供了 Spring Boot 如何帮忙您减速利用程序开发的示例。随着您浏览更多 Spring 入门指南,您将看到更多 Spring Boot 用例。本指南旨在让您疾速理解 Spring Boot。如果您想创立本人的基于 Spring Boot 的我的项目,请拜访 Spring Initializr,填写您的我的项目详细信息,抉择您的选项,而后将捆绑的我的项目下载为 zip 文件。

你将建造什么
您将应用 Spring Boot 构建一个简略的 Web 应用程序,并向其中增加一些有用的服务。

你须要什么
约 15 分钟
最喜爱的文本编辑器或 IDE
JDK 1.8 或更高版本
Gradle 4+ 或 Maven 3.2+
您还能够将代码间接导入 IDE:
弹簧工具套件 (STS)
IntelliJ IDEA
如何实现本指南
像大多数 Spring 入门指南一样,您能够从头开始并实现每个步骤,也能够绕过您曾经相熟的根本设置步骤。无论哪种形式,您最终都会失去工作代码。

要从头开始,请持续从 Spring Initializr 开始。

要跳过基础知识,请执行以下操作:

下载并解压本指南的源代码库,或应用 Git 克隆它:git clone https://github.com/spring-gui…
光盘进入 gs-spring-boot/initial
持续创立一个简略的 Web 应用程序。
实现后,您能够对照中的代码查看后果 gs-spring-boot/complete。

理解应用 Spring Boot 能够做什么
Spring Boot 提供了一种疾速构建应用程序的办法。它查看您的类门路和您已配置的 bean,对您短少的内容做出正当的假如,而后增加这些我的项目。应用 Spring Boot,您能够更多地关注业务性能,而不是基础设施。

以下示例展现了 Spring Boot 能够为您做什么:

Spring MVC 在类门路上吗?您简直总是须要几个特定的​ bean,Spring Boot 会主动增加它们。Spring MVC 应用程序还须要一个 servlet 容器,因而 Spring Boot 会主动配置嵌入式 Tomcat。
Jetty 在类门路上吗?如果是这样,您可能不想要 Tomcat,而是想要嵌入式 Jetty。Spring Boot 会为您解决这些问题。
Thymeleaf 在类门路上吗?如果是这样,则必须始终将一些 bean 增加到您的应用程序上下文中。Spring Boot 会为您增加它们。
这些只是 Spring Boot 提供的主动配置的几个示例。同时,Spring Boot 不会障碍您。例如,如果 Thymeleaf 在您的门路上,Spring Boot 会主动将 a 增加 SpringTemplateEngine 到您的应用程序上下文中。然而如果你 SpringTemplateEngine 用本人的设置定义本人的,Spring Boot 不会加一个。这使您无需付出任何致力即可管制。

Spring Boot 不会生成代码或对文件进行编辑。相同,当您启动应用程序时,Spring Boot 会动静连贯 bean 和设置并将它们利用于您的应用程序上下文。

从 Spring Initializr 开始
您能够应用这个事后初始化的我的项目并单击 Generate 下载 ZIP 文件。此我的项目配置为适宜本教程中的示例。

手动初始化我的项目:

导航到 https://start.spring.io。该服务提取应用程序所需的所有依赖项,并为您实现大部分设置。
抉择 Gradle 或 Maven 以及您要应用的语言。本指南假设您抉择了 Java。
单击 Dependencies 并抉择 Spring Web。
单击生成。
下载生成的 ZIP 文件,该文件是依据您的抉择配置的 Web 应用程序的存档。
如果您的 IDE 具备 Spring Initializr 集成,您能够从您的 IDE 实现此过程。

你也能够从 Github 上 fork 我的项目并在你的 IDE 或其余编辑器中关上它。

创立一个简略的 Web 应用程序
当初您能够为简略的 Web 应用程序创立一个 Web 控制器,如以下清单(来自
src/main/java/com/example/springboot/HelloController.java)所示:

package com.example.springboot;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

@GetMapping("/")
public String index() {return "Greetings from Spring Boot!";}

}复制
该类被标记为 @RestController,这意味着 Spring MVC 能够应用它来解决 Web 申请。@GetMapping 映射 / 到 index()办法。当从浏览器调用或在命令行上应用 curl 时,该办法返回纯文本。这是因为 @RestController 联合了 @Controller 和 @ResponseBody,这两个正文会导致 Web 申请返回数据而不是视图。

创立一个应用程序类
Spring Initializr 为您创立了一个简略的应用程序类。然而,在这种状况下,它太简略了。您须要批改应用程序类以匹配以下清单(来自
src/main/java/com/example/springboot/Application.java):

package com.example.springboot;

import java.util.Arrays;

import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class Application {

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

@Bean
public CommandLineRunner commandLineRunner(ApplicationContext ctx) {
    return args -> {System.out.println("Let's inspect the beans provided by Spring Boot:");

        String[] beanNames = ctx.getBeanDefinitionNames();
        Arrays.sort(beanNames);
        for (String beanName : beanNames) {System.out.println(beanName);
        }

    };
}

}复制
@SpringBootApplication 是一个不便的正文,它增加了以下所有内容:

@Configuration: 将类标记为应用程序上下文的 bean 定义源。
@EnableAutoConfiguration:通知 Spring Boot 依据类门路设置、其余 bean 和各种属性设置开始增加 bean。例如,如果 spring-webmvc 位于类门路上,则此正文将应用程序标记为 Web 应用程序并激活要害行为,例如设置 DispatcherServlet.
@ComponentScan: 通知 Spring 在包中查找其余组件、配置和服务 com/example,让它找到控制器。
该 main()办法应用 Spring Boot 的 SpringApplication.run()办法来启动应用程序。您是否留神到没有一行 XML?也没有 web.xml 文件。这个 Web 应用程序是 100% 纯 Java,您不用解决任何管道或基础设施的配置。

还有一个 CommandLineRunner 标记为 a 的办法 @Bean,它在启动时运行。它检索由您的应用程序创立或由 Spring Boot 主动增加的所有 bean。它对它们进行分类并打印进去。

运行应用程序
要运行应用程序,请在终端窗口(位于 complete)目录中运行以下命令:

./gradlew bootRun
complete 如果您应用 Maven,请在终端窗口(位于)目录中运行以下命令:

./mvnw 弹簧启动:运行
您应该会看到相似于以下内容的输入:

Let’s inspect the beans provided by Spring Boot:
application
beanNameHandlerMapping
defaultServletHandlerMapping
dispatcherServlet
embeddedServletContainerCustomizerBeanPostProcessor
handlerExceptionResolver
helloController
httpRequestHandlerAdapter
messageSource
mvcContentNegotiationManager
mvcConversionService
mvcValidator
org.springframework.boot.autoconfigure.MessageSourceAutoConfiguration
org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration
org.springframework.boot.autoconfigure.web.EmbeddedServletContainerAutoConfiguration
org.springframework.boot.autoconfigure.web.EmbeddedServletContainerAutoConfiguration$DispatcherServletConfiguration
org.springframework.boot.autoconfigure.web.EmbeddedServletContainerAutoConfiguration$EmbeddedTomcat
org.springframework.boot.autoconfigure.web.ServerPropertiesAutoConfiguration
org.springframework.boot.context.embedded.properties.ServerProperties
org.springframework.context.annotation.ConfigurationClassPostProcessor.enhancedConfigurationProcessor
org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalRequiredAnnotationProcessor
org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration
propertySourcesBinder
propertySourcesPlaceholderConfigurer
requestMappingHandlerAdapter
requestMappingHandlerMapping
resourceHandlerMapping
simpleControllerHandlerAdapter
tomcatEmbeddedServletContainerFactory
viewControllerHandlerMapping 复制
你能够分明地看到
org.springframework.boot.autoconfigure 豆子。还有一个
tomcatEmbeddedServletContainerFactory。

当初应用 curl 运行服务(在独自的终端窗口中),通过运行以下命令(显示其输入):

$ curl localhost:8080
Greetings from Spring Boot! 复制
增加单元测试
您将心愿为您增加的端点增加一个测试,而 Spring Test 为此提供了一些机制。

如果您应用 Gradle,请将以下依赖项增加到您的 build.gradle 文件中:

testImplementation(‘org.springframework.boot:spring-boot-starter-test’)复制
如果您应用 Maven,请将以下内容增加到您的 pom.xml 文件中:

<dependency>

<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>

</dependency> 复制
当初编写一个简略的单元测试,通过端点模仿 servlet 申请和响应,如以下清单(来自
src/test/java/com/example/springboot/HelloControllerTest.java)所示:

package com.example.springboot;

import static org.hamcrest.Matchers.equalTo;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

import org.junit.jupiter.api.Test;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;

@SpringBootTest
@AutoConfigureMockMvc
public class HelloControllerTest {

@Autowired
private MockMvc mvc;

@Test
public void getHello() throws Exception {mvc.perform(MockMvcRequestBuilders.get("/").accept(MediaType.APPLICATION_JSON))
            .andExpect(status().isOk())
            .andExpect(content().string(equalTo("Greetings from Spring Boot!")));
}

}复制
MockMvc 来自 Spring Test 并容许您通过一组不便的构建器类将 HTTP 申请发送到 DispatcherServlet 并就后果进行断言。留神应用 @AutoConfigureMockMvcand@SpringBootTest 来注入一个 MockMvc 实例。应用后 @SpringBootTest,咱们要求创立整个应用程序上下文。另一种办法是要求 Spring Boot 应用 @WebMvcTest. 在任何一种状况下,Spring Boot 都会主动尝试定位应用程序的主应用程序类,但如果您想构建不同的货色,您能够笼罩它或放大范畴。

除了模仿 HTTP 申请周期外,还能够应用 Spring Boot 编写一个简略的全栈集成测试。例如,咱们能够创立以下测试(来自),而不是(或以及)后面显示的模仿测试
src/test/java/com/example/springboot/HelloControllerIT.java:

package com.example.springboot;

import org.junit.jupiter.api.Test;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.http.ResponseEntity;

import static org.assertj.core.api.Assertions.assertThat;

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class HelloControllerIT {

@Autowired
private TestRestTemplate template;

@Test
public void getHello() throws Exception {ResponseEntity<String> response = template.getForEntity("/", String.class);
    assertThat(response.getBody()).isEqualTo("Greetings from Spring Boot!");
}

}复制
因为,嵌入式服务器在随机端口上启动 webEnvironment =
SpringBootTest.WebEnvironment.RANDOM_PORT,并且理论端口在根本 URL 中主动配置为 TestRestTemplate.

增加生产级服务
如果您正在为您的企业构建网站,您可能须要增加一些治理服务。Spring Boot 通过其执行器模块提供了多种此类服务(例如衰弱、审计、bean 等)。

如果您应用 Gradle,请将以下依赖项增加到您的 build.gradle 文件中:

implementation ‘org.springframework.boot:spring-boot-starter-actuator’ 复制
如果您应用 Maven,请将以下依赖项增加到您的 pom.xml 文件中:

<dependency>

<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>

</dependency> 复制
而后重新启动应用程序。如果您应用 Gradle,请在终端窗口(在 complete 目录中)中运行以下命令:

./gradlew bootRun
如果您应用 Maven,请在终端窗口(在 complete 目录中)中运行以下命令:

./mvnw 弹簧启动:运行
您应该会看到一组新的 RESTful 端点已增加到应用程序中。这些是 Spring Boot 提供的治理服务。以下清单显示了典型输入:

management.endpoint.configprops-org.springframework.boot.actuate.autoconfigure.context.properties.ConfigurationPropertiesReportEndpointProperties
management.endpoint.env-org.springframework.boot.actuate.autoconfigure.env.EnvironmentEndpointProperties
management.endpoint.health-org.springframework.boot.actuate.autoconfigure.health.HealthEndpointProperties
management.endpoint.logfile-org.springframework.boot.actuate.autoconfigure.logging.LogFileWebEndpointProperties
management.endpoints.jmx-org.springframework.boot.actuate.autoconfigure.endpoint.jmx.JmxEndpointProperties
management.endpoints.web-org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties
management.endpoints.web.cors-org.springframework.boot.actuate.autoconfigure.endpoint.web.CorsEndpointProperties
management.health.diskspace-org.springframework.boot.actuate.autoconfigure.system.DiskSpaceHealthIndicatorProperties
management.info-org.springframework.boot.actuate.autoconfigure.info.InfoContributorProperties
management.metrics-org.springframework.boot.actuate.autoconfigure.metrics.MetricsProperties
management.metrics.export.simple-org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleProperties
management.server-org.springframework.boot.actuate.autoconfigure.web.server.ManagementServerProperties 复制
执行器公开以下内容:

执行器 / 衰弱
执行器
还有一个 /actuator/shutdown 端点,但默认状况下,它只能通过 JMX 可见。要将其作为 HTTP 端点启用,请增加
management.endpoint.shutdown.enabled=true 到您的 application.properties 文件并应用 management.endpoints.web.exposure.include=health,info,shutdown. 然而,您可能不应该为公开可用的应用程序启用敞开端点。

您能够通过运行以下命令来查看应用程序的运行状况:

$ curl localhost:8080/actuator/health
{“status”:”UP”}复制
您也能够尝试通过 curl 调用敞开,以查看当您没有增加必要的行(如后面的正文所示)时会产生什么 application.properties:

$ curl -X POST localhost:8080/actuator/shutdown
{“timestamp”:1401820343710,”error”:”Not Found”,”status”:404,”message”:””,”path”:”/actuator/shutdown”}复制
因为咱们没有启用它,所以申请的端点不可用(因为端点不存在)。

无关这些 REST 端点中的每一个以及如何应用 application.properties 文件(在 中 src/main/resources)调整它们的设置的更多详细信息,请参阅无关端点的文档。

查看 Spring Boot 的 Starters
您曾经看到了一些 Spring Boot 的“启动器”。您能够在源代码中看到它们。

JAR 反对和 Groovy 反对
最初一个示例展现了 Spring Boot 如何让您连贯您可能不晓得须要的 bean。它还展现了如何关上便捷的治理服务。

然而,Spring Boot 做的远不止这些。它不仅反对传统的 WAR 文件部署,还容许您将可执行的 JAR 放在一起,这要归功于 Spring Boot 的加载器模块。spring-boot-gradle-plugin 各种指南通过和展现了这种双重反对 spring-boot-maven-plugin。

最重要的是,Spring Boot 还反对 Groovy,让您只需一个文件即可构建 Spring MVC Web 应用程序。

创立一个名为的新文件 app.groovy 并将以下代码放入其中:

@RestController
class ThisWillActuallyRun {

@GetMapping("/")
String home() {return "Hello, World!"}

}
文件在哪里并不重要。您甚至能够在一条推文中放入这么小的应用程序!

接下来,装置 Spring Boot 的 CLI。

通过运行以下命令来运行 Groovy 应用程序:

$ spring run app.groovy 复制

敞开之前的应用程序,以防止端口抵触。

从不同的终端窗口,运行以下 curl 命令(显示其输入):

$ curl localhost:8080
Hello, World! 复制
Spring Boot 通过向代码动静增加要害正文并应用 Groovy Grape 拉下使利用程序运行所需的库来实现这一点。

概括
祝贺!您应用 Spring Boot 构建了一个简略的 Web 应用程序,并理解了它如何放慢您的开发速度。您还关上了一些不便的制作服务。这只是 Spring Boot 能够做的一小部分。无关更多信息,请参阅 Spring Boot 的在线文档。

退出移动版