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!";
}
}
Spring Boot アプリケーションの構築
このガイドでは、Spring Boot がどのようにしてアプリケーション開発を加速させるのに役立つかを紹介しています。Spring 入門ガイドを読み進めていくと、Spring Boot のユースケースがより多く見えてくるでしょう。このガイドは、Spring Boot を簡単に体験していただくことを目的としています。独自の Spring Boot ベースのプロジェクトを作成したい場合は、Spring Initializr を使用して、プロジェクトの詳細を入力、オプションを選択し、バンドルされたプロジェクトを取得してください。
構築するもの
Spring Boot を使用して簡単な Web アプリケーションを構築し、それに便利なサービスを追加します。
必要なもの
約 15 分
Eclipse STS や IntelliJ IDEA のような任意の IDE または VSCode のようなテキストエディター
Java 17 以降
コードを直接 IDE にインポートすることもできます。
本ガイドの完成までの流れ
ほとんどの Spring 入門ガイドと同様に、最初から始めて各ステップを完了するか、すでに慣れている場合は基本的なセットアップステップをバイパスできます。いずれにしても、最終的に動作するコードになります。
最初から始めるには、Spring Initializr から開始に進みます。
基本をスキップするには、次の手順を実行します。
このガイドを Eclipse で「Spring 入門コンテンツのインポート」するか、ソースリポジトリをダウンロードして解凍、または、Git (英語) を使用してクローンを作成します。
git clone https://github.com/spring-guides/gs-spring-boot.git
gs-spring-boot/initial
に cd簡単な Web アプリケーションを作成するにジャンプしてください。
完了したときは、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 から開始
IDE を使用する場合はプロジェクト作成ウィザードを使用します。IDE を使用せずにコマンドラインなどで開発する場合は、この事前に初期化されたプロジェクトからプロジェクトを ZIP ファイルとしてダウンロードできます。このプロジェクトは、このチュートリアルの例に合うように構成されています。
プロジェクトを手動で初期化するには:
IDE のメニューまたはブラウザーから Spring Initializr を開きます。アプリケーションに必要なすべての依存関係を取り込み、ほとんどのセットアップを行います。
Gradle または Maven のいずれかと、使用する言語を選択します。このガイドは、Java を選択したことを前提としています。
依存関係をクリックして、Spring Web を選択します。
生成をクリックします。
結果の ZIP ファイルをダウンロードします。これは、選択して構成された Web アプリケーションのアーカイブです。
Eclipse や IntelliJ のような IDE は新規プロジェクト作成ウィザードから Spring Initializr の機能が使用できるため、手動での ZIP ファイルのダウンロードやインポートは不要です。 |
プロジェクトを Github からフォークして、IDE または他のエディターで開くこともできます。 |
Spring 3.0 の場合は、Spring Initializr を使用するかどうかに関係なく、Java 17 以降が必要です。 |
簡単な Web アプリケーションを作成する
次のリスト(src/main/java/com/example/springboot/HelloController.java
から)が示すように、単純な Web アプリケーション用の Web コントローラーを作成できるようになりました。
クラスには @RestController
のフラグが設定されています。これは、Web リクエストを処理するために Spring MVC が使用できる状態になっていることを意味します。@GetMapping
は、/
を 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
内)ディレクトリで次のコマンドを実行します。Windows のコマンドプロンプトの場合は、先頭の ./ は不要です。
./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 http://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>
次のリスト(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
を使用してコンテキストの Web レイヤーのみを作成するように Spring Boot に依頼することです。いずれの場合も、Spring Boot はアプリケーションのメインアプリケーションクラスを自動的に見つけようとしますが、別のものを構築する場合は、それをオーバーライドするか、絞り込むことができます。
HTTP リクエストサイクルをモックするだけでなく、Spring Boot を使用して、簡単なフルスタック統合テストを作成することもできます。例: 前に示したモックテストの代わりに(または同様に)、次のテストを作成できます(src/test/java/com/example/springboot/HelloControllerITest.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 HelloControllerITest {
@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
のためにランダムなポートで起動し、実際のポートは TestRestTemplate
のベース URL で自動的に構成されます。
本番グレードのサービスを追加する
ビジネス用の 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.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 http://localhost:8080/actuator/health
{"status":"UP"}
また、curl を使用してシャットダウンを呼び出して、application.properties
に必要な行(前の注を参照)を追加していない場合に何が起こるかを確認することもできます。
$ curl -X POST http://localhost:8080/actuator/shutdown
{"timestamp":1401820343710,"error":"Not Found","status":404,"message":"","path":"/actuator/shutdown"}
有効にしなかったため、リクエストされたエンドポイントは使用できません(エンドポイントが存在しないため)。
これらの各 REST エンドポイントの詳細および application.properties
ファイル(src/main/resources
内)で設定を調整する方法については、エンドポイントに関するドキュメントを参照してください。
Spring Boot のスターターを見る
スターターをいくつか見てきました。これらはすべてソースコード [GitHub] (英語) で確認できます。
JAR のサポート
最後の例では、Spring Boot を使用して、必要なことに気付かない可能性のある Bean をワイヤリングする方法を示しました。また、便利な管理サービスを有効にする方法も示しました。
ただし、Spring Boot はそれ以上のことを行います。従来の WAR ファイルデプロイだけでなく、Spring Boot のローダーモジュールのおかげで実行可能 JAR をまとめることもできます。さまざまなガイドが、spring-boot-gradle-plugin
および spring-boot-maven-plugin
によるこの二重サポートを示しています。
要約
おめでとう! Spring Boot を使用して簡単な Web アプリケーションを構築し、開発ペースを向上させる方法を学びました。また、便利な本番サービスもオンにしました。これは、Spring Boot でできることのほんの小さなサンプリングです。詳細については、Spring Boot のオンラインドキュメントを参照してください。
関連事項
次のガイドも役立ちます。
新しいガイドを作成したり、既存のガイドに貢献したいですか? 投稿ガイドラインを参照してください [GitHub] (英語) 。
すべてのガイドは、コード用の ASLv2 ライセンス、およびドキュメント用の Attribution、NoDerivatives creative commons ライセンス (英語) でリリースされています。 |