spring-boot入門篇

使用Spring Boot構(gòu)建應(yīng)用程序

本指南提供了Spring Boot如何幫助您加速和促進(jìn)應(yīng)用程序開(kāi)發(fā)的示例。當(dāng)您閱讀更多Spring入門指南時(shí),您將看到更多用于Spring Boot的用例。它旨在讓您快速了解Spring Boot。如果您想創(chuàng)建自己的基于Spring Boot的項(xiàng)目,請(qǐng)?jiān)L問(wèn)Spring Initializr,填寫項(xiàng)目詳細(xì)信息,選擇您的選項(xiàng),然后您可以下載Maven構(gòu)建文件或捆綁項(xiàng)目作為zip文件。

你要?jiǎng)?chuàng)建什么

您將使用Spring Boot構(gòu)建一個(gè)簡(jiǎn)單的Web應(yīng)用程序,并為其添加一些有用的服務(wù)。

你需要做什么

如何完成本指南

與大多數(shù)Spring 入門指南一樣,您可以從頭開(kāi)始并完成每個(gè)步驟,或者您可以繞過(guò)您已熟悉的基本設(shè)置步驟。無(wú)論哪種方式,您最終都會(huì)使用工作代碼。

從頭開(kāi)始,請(qǐng)繼續(xù)使用Gradle構(gòu)建

跳過(guò)基礎(chǔ)知識(shí),請(qǐng)執(zhí)行以下操作:

  • 下載并解壓縮本指南的源存儲(chǔ)庫(kù),或使用Git克隆它:git clone [https://github.com/spring-guides/gs-spring-boot.git](https://github.com/spring-guides/gs-spring-boot.git)

  • 進(jìn)入 gs-spring-boot/initial

  • 跳到[初始]

完成后,您可以根據(jù)代碼檢查結(jié)果gs-spring-boot/complete

了解使用Spring Boot可以做些什么

Spring Boot提供了一種快速構(gòu)建應(yīng)用程序的方法。它會(huì)查看您的類路徑以及您配置的bean,對(duì)您缺少的內(nèi)容做出合理的假設(shè),然后添加它。使用Spring Boot,您可以更專注于業(yè)務(wù)功能而不是基礎(chǔ)架構(gòu)。

例如:

  • 有Spring Spring MVC嗎?您幾乎總是需要幾個(gè)特定的??bean,Spring Boot會(huì)自動(dòng)添加它們。Spring MVC應(yīng)用程序還需要一個(gè)servlet容器,因此Spring Boot會(huì)自動(dòng)配置嵌入式Tomcat。

  • 有碼頭?如果是這樣,你可能不想要Tomcat,而是嵌入Jetty。Spring Boot為您處理。

  • 得了Thymeleaf?必須始終將一些bean添加到應(yīng)用程序上下文中; Spring Boot為您添加它們。

這些只是Spring Boot提供的自動(dòng)配置的幾個(gè)示例。與此同時(shí),Spring Boot不會(huì)妨礙你。例如,如果Thymeleaf在您的路徑上,Spring Boot會(huì)SpringTemplateEngine自動(dòng)為您的應(yīng)用程序上下文添加一個(gè)。但是如果您SpringTemplateEngine使用自己的設(shè)置定義自己的設(shè)置,那么Spring Boot將不會(huì)添加一個(gè)。這樣您就可以輕松掌控自己。

Spring Boot不會(huì)生成代碼或?qū)ξ募M(jìn)行編輯。相反,當(dāng)您啟動(dòng)應(yīng)用程序時(shí),Spring Boot會(huì)動(dòng)態(tài)連接bean和設(shè)置,并將它們應(yīng)用到您的應(yīng)用程序上下文中。

創(chuàng)建一個(gè)簡(jiǎn)單的Web應(yīng)用程序

現(xiàn)在,您可以為簡(jiǎn)單的Web應(yīng)用程序創(chuàng)建Web控制器。
src/main/java/hello/HelloController.java

package hello;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;

@RestController
public class HelloController {
    @RequestMapping("/")
    public String index() {
        return "Greetings from Spring Boot!";
    }
}

該類被標(biāo)記為a @RestController,這意味著Spring MVC可以使用它來(lái)處理Web請(qǐng)求。@RequestMapping映射/index()方法。從瀏覽器調(diào)用或在命令行上使用curl時(shí),該方法返回純文本。這是因?yàn)?code>@RestController組合@Controller@ResponseBody兩個(gè)注釋會(huì)導(dǎo)致Web請(qǐng)求返回?cái)?shù)據(jù)而不是視圖。

創(chuàng)建一個(gè)Application類

在這里,您創(chuàng)建一個(gè)Application包含組件的類:
src/main/java/hello/Application.java

package hello;

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 是一個(gè)便利注釋,添加了以下所有內(nèi)容:

  • @Configuration 標(biāo)記該類作為應(yīng)用程序上下文的bean定義的來(lái)源。

  • @EnableAutoConfiguration 告訴Spring Boot開(kāi)始根據(jù)類路徑設(shè)置,其他bean和各種屬性設(shè)置添加bean。

  • 通常你會(huì)添加@EnableWebMvc一個(gè)Spring MVC應(yīng)用程序,但Spring Boot會(huì)在類路徑上看到spring-webmvc時(shí)自動(dòng)添加它。這會(huì)將應(yīng)用程序標(biāo)記為Web應(yīng)用程序并激活關(guān)鍵行為,例如設(shè)置a DispatcherServlet

  • @ComponentScan告訴Spring在包中尋找其他組件,配置和服務(wù)hello,允許它找到控制器。

main()方法使用Spring Boot的SpringApplication.run()方法啟動(dòng)應(yīng)用程序。您是否注意到?jīng)]有一行XML?也沒(méi)有web.xml文件。此Web應(yīng)用程序是100%純Java,您無(wú)需處理配置任何管道或基礎(chǔ)結(jié)構(gòu)。

還有一個(gè)CommandLineRunner標(biāo)記為a 的方法@Bean,它在啟動(dòng)時(shí)運(yùn)行。它檢索由您的應(yīng)用程序創(chuàng)建或由于Spring Boot自動(dòng)添加的所有bean。它對(duì)它們進(jìn)行分類并打印出來(lái)。

運(yùn)行該應(yīng)用程序

要運(yùn)行該應(yīng)用程序,請(qǐng)執(zhí)行:

./gradlew build && java -jar build / libs / gs-spring-boot-0.1.0.jar

如果您使用的是Maven,請(qǐng)執(zhí)行:

mvn package && java -jar target / gs-spring-boot-0.1.0.jar

你應(yīng)該看到這樣的輸出:

讓我們檢查一下Spring Boot提供的bean:
應(yīng)用
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 beans。還有一個(gè)tomcatEmbeddedServletContainerFactory

檢查服務(wù)。

$ curl localhost:8080
來(lái)自Spring Boot的問(wèn)候!

添加單元測(cè)試

您將需要為添加的端點(diǎn)添加測(cè)試,Spring Test已經(jīng)為此提供了一些機(jī)制,并且很容易包含在您的項(xiàng)目中。

將其添加到構(gòu)建文件的依賴項(xiàng)列表中:

    testCompile("org.springframework.boot:spring-boot-starter-test")

如果您使用的是Maven,請(qǐng)將其添加到依賴項(xiàng)列表中:

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

現(xiàn)在編寫一個(gè)簡(jiǎn)單的單元測(cè)試,通過(guò)端點(diǎn)模擬servlet請(qǐng)求和響應(yīng):
src/test/java/hello/HelloControllerTest.java

package hello;

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.Test;
import org.junit.runner.RunWith;
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.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;

@RunWith(SpringRunner.class)
@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來(lái)自彈簧試驗(yàn),并允許您通過(guò)一組方便的建設(shè)者班,發(fā)送HTTP請(qǐng)求到DispatcherServlet并作出斷言關(guān)于結(jié)果。注意@AutoConfigureMockMvc@SpringBootTest注入MockMvc實(shí)例一起使用。使用后,@SpringBootTest我們要求創(chuàng)建整個(gè)應(yīng)用程序上下文。另一種方法是讓Spring Boot使用@WebMvcTest。僅創(chuàng)建上下文的Web層。在任何一種情況下,Spring Boot都會(huì)自動(dòng)嘗試查找應(yīng)用程序的主應(yīng)用程序類,但是如果要構(gòu)建不同的東西,可以覆蓋它,或縮小范圍。

除了模擬HTTP請(qǐng)求周期之外,我們還可以使用Spring Boot編寫一個(gè)非常簡(jiǎn)單的全棧集成測(cè)試。例如,我們可以這樣做,而不是(或以及)上面的模擬測(cè)試:

src/test/java/hello/HelloControllerIT.java

package hello;

import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
import java.net.URL;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
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.boot.web.server.LocalServerPort;
import org.springframework.http.ResponseEntity;
import org.springframework.test.context.junit4.SpringRunner;

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

    @LocalServerPort
    private int port;

    private URL base;

    @Autowired
    private TestRestTemplate template;

    @Before
    public void setUp() throws Exception {
        this.base = new URL("http://localhost:" + port + "/");
    }

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

嵌入式服務(wù)器由隨機(jī)端口啟動(dòng),webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT并且在運(yùn)行時(shí)發(fā)現(xiàn)實(shí)際端口@LocalServerPort

添加生產(chǎn)級(jí)服務(wù)

如果要為您的企業(yè)構(gòu)建網(wǎng)站,則可能需要添加一些管理服務(wù)。Spring Boot提供了幾個(gè)開(kāi)箱即用的執(zhí)行器模塊,例如健康,審核,豆類等。

將其添加到構(gòu)建文件的依賴項(xiàng)列表中:

    compile("org.springframework.boot:spring-boot-starter-actuator")

如果您使用的是Maven,請(qǐng)將其添加到依賴項(xiàng)列表中:

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

然后重啟應(yīng)用:

./gradlew build && java -jar build / libs / gs-spring-boot-0.1.0.jar

如果您使用的是Maven,請(qǐng)執(zhí)行:

mvn package && java -jar target / gs-spring-boot-0.1.0.jar

您將看到一組新的RESTful端點(diǎn)添加到應(yīng)用程序中。這些是Spring Boot提供的管理服務(wù)。

2018-03-17 15:42:20.088 ...:將“{[/ error],produce = [text / html]}”映射到公共組織...
2018-03-17 15:42:20.089 ...:將“{[/ error]}”映射到公共org.springframework.http.R ...
2018-03-17 15:42:20.121 ...:將URL路徑[/ webjars / **]映射到[class]類型的處理程序上
2018-03-17 15:42:20.121 ...:將URL路徑[/ **]映射到[class org.spri ...類型的處理程序上
2018-03-17 15:42:20.157 ...:將URL路徑[/**/favicon.ico]映射到[cl ...類型的處理程序]
2018-03-17 15:42:20.488 ...:映射“{[/ actuator / health],methods = [GET],產(chǎn)生= [application / vnd ...
2018-03-17 15:42:20.490 ...:映射“{[/ actuator / info],methods=[GET],produces=[application/vnd.s ...
2018-03-17 15:42:20.491 ...:映射“{[/ actuator],methods = [GET],produces = [application / vnd.spring ...

它們包括:錯(cuò)誤,執(zhí)行器/健康執(zhí)行器/信息執(zhí)行器

還有一個(gè)/actuator/shutdown端點(diǎn),但它只能通過(guò)JMX默認(rèn)顯示。要將其作為HTTP端點(diǎn)啟用,請(qǐng)?zhí)砑?code>management.endpoints.shutdown.enabled=true到您的application.properties文件中。 |

檢查應(yīng)用程序的運(yùn)行狀況很容易。

$ curl localhost:8080 /執(zhí)行器/健康
{ “地位”: “UP”}

您可以嘗試通過(guò)curl調(diào)用shutdown。

$ curl -X POST localhost:8080 /執(zhí)行器/關(guān)機(jī)
{“timestamp”:1401820343710,“error”:“Method Not Allowed”,“status”:405,“message”:“不支持請(qǐng)求方法'POST'”}

因?yàn)槲覀儧](méi)有啟用它,所以請(qǐng)求被不存在的優(yōu)點(diǎn)所阻止。

有關(guān)每個(gè)REST點(diǎn)以及如何使用application.properties文件(in src/main/resources)調(diào)整其設(shè)置的更多詳細(xì)信息,您可以閱讀有關(guān)端點(diǎn)的詳細(xì)文檔

查看Spring Boot的初學(xué)者

你已經(jīng)看到了一些Spring Boot的“初學(xué)者”。您可以在源代碼中看到它們。

JAR支持和Groovy支持

最后一個(gè)示例顯示了Spring Boot如何輕松地連接您可能不知道您需要的bean。它展示了如何開(kāi)啟便捷的管理服務(wù)。

但Spring Boot確實(shí)做得更多。它不僅支持傳統(tǒng)的WAR文件部署,而且還可以通過(guò)Spring Boot的加載器模塊輕松地將可執(zhí)行JAR組合在一起。各種指南通過(guò)spring-boot-gradle-plugin和展示了這種雙重支持spring-boot-maven-plugin

最重要的是,Spring Boot還支持Groovy,允許您使用一個(gè)文件構(gòu)建Spring MVC Web應(yīng)用程序。

創(chuàng)建一個(gè)名為app.groovy的新文件,并在其中添加以下代碼:

@RestController
class ThisWillActuallyRun {

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

}

文件的位置無(wú)關(guān)緊要。你甚至可以在一條推文中使用一個(gè)小的應(yīng)用程序! |

接下來(lái),安裝Spring Boot的CLI

運(yùn)行如下:

$ spring run app.groovy

| | 這假設(shè)您關(guān)閉以前的應(yīng)用程序,以避免端口沖突。 |

從不同的終端窗口:

$ curl localhost:8080
你好,世界!

Spring Boot通過(guò)動(dòng)態(tài)地向代碼添加關(guān)鍵注釋并使用Groovy Grape來(lái)下載使應(yīng)用程序運(yùn)行所需的庫(kù)來(lái)實(shí)現(xiàn)此目的。

摘要

恭喜!您使用Spring Boot構(gòu)建了一個(gè)簡(jiǎn)單的Web應(yīng)用程序,并了解它如何提高您的開(kāi)發(fā)速度。您還開(kāi)啟了一些方便的生產(chǎn)服務(wù)。這只是Spring Boot可以做的一小部分。如果您想深入挖掘,請(qǐng)查看Spring Boot的在線文檔

也可以看看

以下指南也可能有所幫助:

想要撰寫新指南或?yàn)楝F(xiàn)有指南做出貢獻(xiàn)?查看我們的貢獻(xiàn)指南

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 不知道大家對(duì)上次的《深入理解Java集合框架》系列文章(已全部更新完畢)有沒(méi)有好好研究呢?對(duì)于學(xué)習(xí)Java的童鞋來(lái)...
    極樂(lè)君閱讀 4,944評(píng)論 0 18
  • 什么是Spring Boot Spring Boot是由Pivotal團(tuán)隊(duì)提供的全新框架,其設(shè)計(jì)目的是用來(lái)簡(jiǎn)化新S...
    Bobby0322閱讀 488評(píng)論 0 3
  • 什么是spring boot Spring Boot是由Pivotal團(tuán)隊(duì)提供的全新框架,其設(shè)計(jì)目的是用來(lái)簡(jiǎn)化新S...
    guanalex閱讀 153評(píng)論 0 0
  • 看遍世間繁華,總有一個(gè)人偷偷孤寂的時(shí)候。 喜歡熱鬧,卻總是有那么一段時(shí)間會(huì)孤寂下來(lái)。 當(dāng)自己真正的孤寂下來(lái)的時(shí)候才...
    我要一米八閱讀 304評(píng)論 0 2
  • 第一次用簡(jiǎn)書,從來(lái)沒(méi)想過(guò)會(huì)接觸一個(gè)流傳了那么久,卻依然火熱的話題。挑戰(zhàn)挺大的,呵呵···能不寫么?不能!就這么逼自...
    Elaine6111閱讀 285評(píng)論 1 0