このガイドは、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().equals("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,shutdownapplication.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クリエイティブコモンズライセンス(英語) でリリースされています。