このガイドは、Spring Boot (GitHub) がアプリケーション開発を加速するのにどのように役立つかのサンプルを提供します。Spring 入門ガイドを読むと、Spring Boot のユースケースが増えます。このガイドは、Spring Boot について簡単に説明することを目的としています。独自の Spring ブートベースのプロジェクトを作成する場合は、Spring Initializr (英語) にアクセスし、プロジェクトの詳細を入力し、オプションを選択して、バンドルされたプロジェクトを zip ファイルとしてダウンロードします。

構築するもの

Spring Boot を使用して簡単な Web アプリケーションを構築し、それに便利なサービスを追加します。

必要なもの

このガイドを完了する方法

ほとんどの Spring 入門ガイドと同様に、最初から始めて各ステップを完了するか、すでに慣れている場合は基本的なセットアップステップをバイパスできます。いずれにしても、最終的に動作するコードになります。

最初から始めるには、Spring Initializr から開始に進みます。

基本スキップするには、次の手順を実行します。

完了したときは、gs-spring-boot/complete のコードに対して結果を確認できます。

Spring Boot でできることを学ぶ

Spring Boot は、アプリケーションを迅速に構築する方法を提供します。クラスパスと設定した Bean を調べ、不足しているものについて合理的な仮定を立て、それらの項目を追加します。Spring Boot を使用すると、インフラストラクチャではなくビジネス機能に集中できます。

以下の例は、Spring Boot ができることを示しています。

  • Spring MVC はクラスパスにありますか?ほとんど常に必要な特定の Bean がいくつかあり、Spring Boot はそれらを自動的に追加します。Spring MVC アプリケーションにはサーブレットコンテナーも必要なので、Spring Boot は埋め込み Tomcat を自動的に構成します。

  • Jetty はクラスパスにありますか?もしそうなら、おそらく Tomcat は必要なく、代わりに組み込み Jetty が必要です。Spring Boot がそれを処理します。

  • Thymeleaf はクラスパスにありますか?その場合、アプリケーションコンテキストに常に追加する必要がある Bean がいくつかあります。Spring Boot はそれらを追加します。

これらは、Spring Boot が提供する自動構成のほんの一例です。同時に、Spring Boot は邪魔になりません。例:Thymeleaf がパス上にある場合、Spring Boot は SpringTemplateEngine をアプリケーションコンテキストに自動的に追加します。ただし、独自の設定で独自の SpringTemplateEngine を定義した場合、Spring Boot は追加しません。これにより、一部の労力をほとんどかけることなく制御できます。

Spring Boot は、コードを生成したり、ファイルを編集したりしません。代わりに、アプリケーションを起動すると、Spring Boot は Bean と設定を動的に結び付け、アプリケーションコンテキストに適用します。

Spring Initializr から開始

すべての Spring アプリケーションの場合、Spring Initializr (英語) から開始する必要があります。Initializr は、アプリケーションに必要なすべての依存関係をすばやく取り込む方法を提供し、多くのセットアップを行います。この例では、Spring Web 依存関係のみが必要です。次のイメージは、このサンプルプロジェクト用に設定された Initializr を示しています。

initializr
前の図は、Maven がビルドツールとして選択された Initializr を示しています。Gradle も使用できます。また、com.example および spring-boot の値をそれぞれグループおよびアーティファクトとして表示します。このサンプルの残りの部分では、これらの値を使用します。

次のリストは、Maven を選択したときに作成される pom.xml ファイルを示しています。

<?xml version="1.0" encoding="UTF-8"?>
<project 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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.2.2.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.example</groupId>
	<artifactId>spring-boot</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>spring-boot</name>
	<description>Demo project for Spring Boot</description>

	<properties>
		<java.version>1.8</java.version>
	</properties>

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

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
			<exclusions>
				<exclusion>
					<groupId>org.junit.vintage</groupId>
					<artifactId>junit-vintage-engine</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

次のリストは、Gradle を選択したときに作成される build.gradle ファイルを示しています。

plugins {
	id 'org.springframework.boot' version '2.2.2.RELEASE'
	id 'io.spring.dependency-management' version '1.0.8.RELEASE'
	id 'java'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
	testImplementation('org.springframework.boot:spring-boot-starter-test') {
		exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
	}
}

test {
	useJUnitPlatform()
}

簡単な Web アプリケーションを作成する

次のリスト(src/main/java/com/example/springboot/HelloController.java から)が示すように、単純な Web アプリケーション用の Web コントローラーを作成できるようになりました。

package com.example.springboot;

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!";
	}

}

このクラスには @RestController のフラグが付いています。これは、Spring MVC が Web リクエストを処理するために使用できる状態であることを意味します。@RequestMapping は、/ を index() メソッドにマップします。ブラウザから、またはコマンドラインで curl を使用して呼び出された場合、メソッドは純粋なテキストを返します。これは、@RestController が @Controller と @ResponseBody を組み合わせているためです。これは、ビューではなくデータを返す Web リクエストをもたらす 2 つのアノテーションです。

アプリケーションクラスを作成する

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: クラスパス設定、他の Bean、およびさまざまなプロパティ設定に基づいて Bean の追加を開始するよう Spring Boot に指示します。例: spring-webmvc がクラスパスにある場合、このアノテーションはアプリケーションに Web アプリケーションとしてフラグを立て、DispatcherServlet のセットアップなどの主要な動作をアクティブにします。

  • @ComponentScan: Spring に、com/example パッケージ内の他のコンポーネント、構成、およびサービスを探して、コントローラーを検出させるように指示します。

main() メソッドは、Spring Boot の SpringApplication.run() メソッドを使用してアプリケーションを起動します。XML が 1 行もないことに気付きましたか? web.xml ファイルもありません。この Web アプリケーションは 100% 純粋な Java であり、接続機能やインフラストラクチャの構成に対処する必要はありませんでした。

@Bean としてマークされた CommandLineRunner メソッドもあり、これは起動時に実行されます。アプリケーションによって作成された、または Spring Boot によって自動的に追加されたすべての Bean を取得します。ソートし、出力します。

アプリケーションの実行

アプリケーションを実行するには、ターミナルウィンドウ(complete 内)ディレクトリで次のコマンドを実行します。

./gradlew bootRun

Maven を使用する場合は、ターミナルウィンドウ(complete 内)ディレクトリで次のコマンドを実行します。

./mvnw spring-boot:run

次のような出力が表示されます。

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 Bean をはっきりと見ることができます。tomcatEmbeddedServletContainerFactory もあります。

次のコマンドを実行して、curl でサービスを実行します(別のターミナルウィンドウで)(出力とともに表示)。

$ curl localhost:8080
Greetings from Spring Boot!

単体テストを追加する

追加したエンドポイントにテストを追加すると、Spring Test がそのためのいくつかの機構を提供します。

Gradle を使用する場合は、build.gradle ファイルに次の依存関係を追加します。

testImplementation('org.springframework.boot:spring-boot-starter-test') {
	exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}

Maven を使用する場合は、pom.xml ファイルに次を追加します。

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-test</artifactId>
	<scope>test</scope>
	<exclusions>
		<exclusion>
			<groupId>org.junit.vintage</groupId>
			<artifactId>junit-vintage-engine</artifactId>
		</exclusion>
	</exclusions>
</dependency>

次のリスト(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 に送信し、結果についてアサーションを行うことができます。@AutoConfigureMockMvc および @SpringBootTest を使用して MockMvc インスタンスを注入することに注意してください。@SpringBootTest を使用したため、アプリケーションコンテキスト全体を作成するように求めています。別のメソッドは、@WebMvcTest を使用して Spring Boot にコンテキストの Web レイヤーのみを作成するように依頼することです。いずれの場合も、Spring Boot はアプリケーションのメインアプリケーションクラスを自動的に見つけようとしますが、別の何かを構築したい場合は、オーバーライドするか、絞り込むことができます。

HTTP リクエストサイクルをモックするだけでなく、Spring Boot を使用して、簡単なフルスタック統合テストを作成することもできます。例:前に示したモックテストの代わりに(または同様に)、次のテストを作成できます(src/test/java/com/example/springboot/HelloControllerIT.java から)。

package com.example.springboot;

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

import java.net.URL;

import org.junit.jupiter.api.BeforeEach;
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.boot.web.server.LocalServerPort;
import org.springframework.http.ResponseEntity;

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

	@LocalServerPort
	private int port;

	private URL base;

	@Autowired
	private TestRestTemplate template;

    @BeforeEach
    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()).isEqualTo("Greetings from Spring Boot!");
    }
}

webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT のため、組み込みサーバーはランダムなポートで起動し、実行時に @LocalServerPort で実際のポートが検出されます。

本番グレードのサービスを追加する

ビジネス用の Web サイトを構築している場合、おそらくいくつかの管理サービスを追加する必要があります。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 spring-boot:run

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.status-org.springframework.boot.actuate.autoconfigure.health.HealthIndicatorProperties
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
management.trace.http-org.springframework.boot.actuate.autoconfigure.trace.http.HttpTraceProperties

アクチュエーターは次を公開します。

/actuator/shutdown エンドポイントもありますが、デフォルトでは、JMX を介してのみ表示されます。HTTP エンドポイントとして有効にするには、management.endpoints.web.exposure.include=health,info,shutdown を application.properties ファイルに追加します。ただし、公開されているアプリケーションのシャットダウンエンドポイントを有効にしないでください。

次のコマンドを実行して、アプリケーションの正常性を確認できます。

$ curl localhost:8080/actuator/health
{"status":"UP"}

また、curl を使用してシャットダウンを呼び出して、application.properties に必要な行(前の注を参照)を追加していない場合に何が起こるかを確認することもできます。

$ curl -X POST localhost:8080/actuator/shutdown
{"timestamp":1401820343710,"error":"Method Not Allowed","status":405,"message":"Request method 'POST' not supported"}

有効にしていないため、リクエストはブロックされます(エンドポイントが存在しないため)。

これらの各 REST エンドポイントの詳細および application.properties ファイル(src/main/resources 内)で設定を調整する方法については、エンドポイントに関するドキュメントを参照してください。

Spring Boot のスターターを見る

Spring Boot の「スターター」の一部を見てきました。これらはすべてソースコードで確認できます (GitHub)

JAR サポートおよび Groovy サポート

最後の例では、Spring Boot を使用して、必要なことに気付かない可能性のある Bean をワイヤリングする方法を示しました。また、便利な管理サービスを有効にする方法も示しました。

ただし、Spring Boot はそれ以上のことを行います。従来の WAR ファイルデプロイだけでなく、Spring Boot のローダーモジュールのおかげで実行可能 JAR をまとめることもできます。さまざまなガイドが、spring-boot-gradle-plugin および spring-boot-maven-plugin によるこの二重サポートを示しています。

その上、Spring Boot は Groovy もサポートしており、わずか 1 つのファイルで Spring MVC Web アプリケーションを構築できます。

app.groovy という新しいファイルを作成し、次のコードをその中に配置します。

@RestController
class ThisWillActuallyRun {

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

}
ファイルの場所は関係ありません。単一のツイート (英語) 内に小さなアプリケーションを収めることさえできます!

次のコマンドを実行して、Groovy アプリケーションを実行します。

$ spring run app.groovy
ポートの衝突を避けるために、以前のアプリケーションをシャットダウンします。

別のターミナルウィンドウから、次の curl コマンドを実行します(出力とともに表示)。

$ curl localhost:8080
Hello, World!

Spring Boot は、キーアノテーションをコードに動的に追加し、Groovy グレープ (英語) を使用してアプリの実行に必要なライブラリをプルダウンすることでこれを行います。

要約

おめでとう! Spring Boot を使用して簡単な Web アプリケーションを構築し、開発ペースを向上させる方法を学びました。また、便利な本番サービスもオンにしました。これは、Spring Boot でできることのほんの小さなサンプリングです。詳細については、Spring Boot のオンラインドキュメントを参照してください。

関連事項

次のガイドも役立ちます。

新しいガイドを作成したり、既存のガイドに貢献したいですか? 投稿ガイドラインを参照してください (GitHub)

すべてのガイドは、コード用の ASLv2 ライセンス、およびドキュメント用の Attribution、NoDerivatives クリエイティブコモンズライセンス (英語) でリリースされています。