このセクションでは、Spring Bootの使用方法について詳しく説明します。ビルドシステム、自動構成、アプリケーションの実行方法などのトピックを扱います。また、Spring Bootのベストプラクティスもいくつか取り上げています。Spring Bootに関して特別なことは何もありませんが(それは使用する単なるライブラリにすぎません)、従えば、開発プロセスを少し簡単にするいくつかの推奨事項があります。

Spring Bootを使用する場合は、このセクションに進む前に入門ガイドを参照してください。

1. ビルドシステム

依存関係管理をサポートし、「Maven セントラル」リポジトリに公開されたアーティファクトを消費できるビルドシステムを選択することを強くお勧めします。MavenまたはGradleを選択することをお勧めします。Spring Bootを他のビルドシステム(Antなど)で動作させることは可能ですが、それらは特に十分にサポートされていません。

1.1. 依存関係管理

Spring Bootの各リリースは、サポートする依存関係の精選されたリストを提供します。実際には、Spring Bootが管理するため、ビルド構成のこれらの依存関係のバージョンを提供する必要はありません。Spring Boot自体をアップグレードすると、これらの依存関係も一貫した方法でアップグレードされます。

バージョンを指定し、必要に応じてSpring Bootの推奨事項を上書きすることもできます。

キュレーションリストには、Spring Bootで使用できるすべてのSpringモジュールと、サードパーティライブラリの洗練されたリストが含まれています。このリストは、MavenGradleの両方で使用できる標準部品表 ( spring-boot-dependencies )として利用可能です。

Spring Bootの各リリースは、Spring Frameworkの基本バージョンに関連付けられています。バージョンを指定しないことを強くお勧めします。

1.2. Maven

Mavenユーザーは、spring-boot-starter-parent プロジェクトから継承して、適切なデフォルトを取得できます。親プロジェクトは次の機能を提供します。

  • デフォルトのコンパイラレベルとしてのJava 1.8。

  • UTF-8ソースエンコーディング。

  • spring-boot-dependencies pomから継承された依存関係管理セクションは、一般的な依存関係のバージョンを管理します。この依存関係管理では、独自のpomで使用する場合、これらの依存関係の<version>タグを省略できます。

  • repackage 実行IDを使用した repackage ゴールの実行。

  • 実用的なリソースフィルタリング(Apache)

  • 実用的なプラグイン構成( exec plugin(英語) git commit id(GitHub) 、およびshade(Apache) )。

  • プロファイル固有のファイルを含む application.properties および application.yml の実用的なリソースフィルタリング (たとえば、application-dev.properties および application-dev.yml )

application.properties および application.yml ファイルはSpringスタイルのプレースホルダー(${…​})を受け入れるため、Mavenフィルタリングは @[email protected](英語) プレースホルダーを使用するように変更されることに注意してください。( resource.delimiterと呼ばれるMavenプロパティを設定することにより、それをオーバーライドできます。)

1.2.1. スターター親の継承

spring-boot-starter-parentから継承するようにプロジェクトを構成するには、parent を次のように設定します。

<!-- Inherit defaults from Spring Boot -->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.4.RELEASE</version>
</parent>
この依存関係では、Spring Bootバージョン番号のみを指定する必要があります。追加のスターターをインポートする場合、バージョン番号を安全に省略できます。

この設定では、独自のプロジェクトのプロパティをオーバーライドすることにより、個々の依存関係をオーバーライドすることもできます。たとえば、別のSpring Dataリリーストレインにアップグレードするには、以下を pom.xmlに追加します。

<properties>
    <spring-data-releasetrain.version>Fowler-SR2</spring-data-releasetrain.version>
</properties>
サポートされているプロパティのリストについては、 spring-boot-dependencies pom(GitHub) を確認してください。

1.2.2. 親POMなしでSpring Bootを使用する

誰もが spring-boot-starter-parent POMからの継承を好むわけではありません。独自の企業標準親を使用する必要がある場合や、すべてのMaven構成を明示的に宣言する場合があります。

spring-boot-starter-parentを使用したくない場合は、次のように scope=import 依存関係を使用することにより、依存関係管理(プラグイン管理ではない)の利点を維持できます。

<dependencyManagement>
    <dependencies>
        <dependency>
            <!-- Import dependency management from Spring Boot -->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.2.4.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

上記のサンプルセットアップでは、上記で説明したように、プロパティを使用して個々の依存関係をオーバーライドすることはできません。同じ結果を得るには、spring-boot-dependencies エントリのにプロジェクトの dependencyManagement のエントリを追加する必要があります。たとえば、別のSpring Dataリリーストレインにアップグレードするには、pom.xmlに次の要素を追加できます。

<dependencyManagement>
    <dependencies>
        <!-- Override Spring Data release train provided by Spring Boot -->
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-releasetrain</artifactId>
            <version>Fowler-SR2</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.2.4.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
前の例では、BOMを指定していますが、どの依存関係タイプも同じ方法でオーバーライドできます。

1.2.3. Spring Boot Mavenプラグインの使用

Spring Bootには、プロジェクトを実行可能なjarとしてパッケージ化できるMavenプラグインが含まれています。次の例に示すように、使用する場合は、<plugins> セクションにプラグインを追加します。

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>
Spring Bootスターターの親pomを使用する場合、プラグインのみを追加する必要があります。親で定義されている設定を変更する場合を除き、設定する必要はありません。

1.3. Gradle

Spring BootをGradleで使用する方法については、Spring BootのGradleプラグインのドキュメントを参照してください。

1.4. Ant

Apache Ant + Ivyを使用してSpring Bootプロジェクトを構築することができます。 spring-boot-antlib “ AntLib”モジュールは、Antが実行可能なjarを作成するのを支援するためにも利用可能です。

依存関係を宣言するための一般的な ivy.xml ファイルは、次の例のようになります。

<ivy-module version="2.0">
    <info organisation="org.springframework.boot" module="spring-boot-sample-ant" />
    <configurations>
        <conf name="compile" description="everything needed to compile this module" />
        <conf name="runtime" extends="compile" description="everything needed to run this module" />
    </configurations>
    <dependencies>
        <dependency org="org.springframework.boot" name="spring-boot-starter"
            rev="${spring-boot.version}" conf="compile" />
    </dependencies>
</ivy-module>

典型的な build.xml は、次の例のようになります。

<project
    xmlns:ivy="antlib:org.apache.ivy.ant"
    xmlns:spring-boot="antlib:org.springframework.boot.ant"
    name="myapp" default="build">

    <property name="spring-boot.version" value="2.2.4.RELEASE" />

    <target name="resolve" description="--> retrieve dependencies with ivy">
        <ivy:retrieve pattern="lib/[conf]/[artifact]-[type]-[revision].[ext]" />
    </target>

    <target name="classpaths" depends="resolve">
        <path id="compile.classpath">
            <fileset dir="lib/compile" includes="*.jar" />
        </path>
    </target>

    <target name="init" depends="classpaths">
        <mkdir dir="build/classes" />
    </target>

    <target name="compile" depends="init" description="compile">
        <javac srcdir="src/main/java" destdir="build/classes" classpathref="compile.classpath" />
    </target>

    <target name="build" depends="compile">
        <spring-boot:exejar destfile="build/myapp.jar" classes="build/classes">
            <spring-boot:lib>
                <fileset dir="lib/runtime" />
            </spring-boot:lib>
        </spring-boot:exejar>
    </target>
</project>
spring-boot-antlib モジュールを使用したくない場合は、howto.html 「使い方」を参照してください。

1.5. スターター

スターターは、アプリケーションに含めることができる便利な依存関係記述子のセットです。必要なすべてのSpringおよび関連テクノロジーのワンストップショップを利用して、サンプルコードを探したり、依存関係記述子のコピーアンドペーストを行う必要はありません。例:データベースアクセスにSpringとJPAの使用を開始する場合は、プロジェクトに spring-boot-starter-data-jpa 依存関係を含めます。

スターターには、プロジェクトを迅速に立ち上げて実行するために必要な多くの依存関係と、管理された推移的な依存関係のサポートされたセットが含まれています。

名前の内容

すべての公式スターターは、同様の命名パターンに従います。 spring-boot-starter-*、ここで * は特定のタイプのアプリケーションです。この命名構造は、スターターを見つける必要がある場合に役立つことを目的としています。多くのIDEのMaven統合により、名前で依存関係を検索できます。例:適切なEclipseまたはSTSプラグインがインストールされている場合、POMエディターで ctrl-space を押し、「spring-boot-starter」と入力して完全なリストを表示できます。

独自のスターターを作成する」セクションで説明したように、サードパーティのスターターは公式のSpring Bootアーティファクト用に予約されているため、spring-bootで開始しないでください。むしろ、サードパーティのスターターは通常、プロジェクトの名前で始まります。例: thirdpartyproject というサードパーティのスタータープロジェクトは、通常 thirdpartyproject-spring-boot-starterという名前になります。

次のアプリケーションスターターは、org.springframework.boot グループでSpring Bootによって提供されます。

表 1: Spring Bootアプリケーションスターター
名前説明Pom

spring-boot-starter

自動構成サポート、ロギング、YAMLを含むコアスターター

Pom(GitHub)

spring-boot-starter-activemq

Apache ActiveMQを使用したJMSメッセージングのスターター

Pom(GitHub)

spring-boot-starter-amqp

Spring AMQPおよびRabbit MQを使用するためのスターター

Pom(GitHub)

spring-boot-starter-aop

Spring AOPおよびAspectJを使用したアスペクト指向プログラミングのスターター

Pom(GitHub)

spring-boot-starter-artemis

Apache Artemisを使用したJMSメッセージングのスターター

Pom(GitHub)

spring-boot-starter-batch

Spring Batchを使用するためのスターター

Pom(GitHub)

spring-boot-starter-cache

Spring Frameworkのキャッシュサポートを使用するためのスターター

Pom(GitHub)

spring-boot-starter-cloud-connectors

Spring Cloud Connectorsを使用するためのスターター。Cloud FoundryやHerokuなどのクラウドプラットフォームのサービスへの接続を簡素化します。Java CFEnvを推奨して非推奨

Pom(GitHub)

spring-boot-starter-data-cassandra

Cassandra分散データベースおよびSpring Data Cassandraを使用するためのスターター

Pom(GitHub)

spring-boot-starter-data-cassandra-reactive

Cassandra分散データベースおよびSpring Data Cassandra Reactiveを使用するためのスターター

Pom(GitHub)

spring-boot-starter-data-couchbase

Couchbaseドキュメント指向データベースおよびSpring Data Couchbaseを使用するためのスターター

Pom(GitHub)

spring-boot-starter-data-couchbase-reactive

Couchbaseドキュメント指向データベースおよびSpring Data Couchbase Reactiveを使用するためのスターター

Pom(GitHub)

spring-boot-starter-data-elasticsearch

Elasticsearch検索および分析エンジンとSpring Data Elasticsearchを使用するためのスターター

Pom(GitHub)

spring-boot-starter-data-jdbc

Spring Data JDBCを使用するためのスターター

Pom(GitHub)

spring-boot-starter-data-jpa

HibernateでSpring Data JPAを使用するためのスターター

Pom(GitHub)

spring-boot-starter-data-ldap

Spring Data LDAPを使用するためのスターター

Pom(GitHub)

spring-boot-starter-data-mongodb

MongoDBドキュメント指向データベースとSpring Data MongoDBを使用するためのスターター

Pom(GitHub)

spring-boot-starter-data-mongodb-reactive

MongoDBドキュメント指向データベースとSpring Data MongoDB Reactiveを使用するためのスターター

Pom(GitHub)

spring-boot-starter-data-neo4j

Neo4jグラフデータベースとSpring Data Neo4jを使用するためのスターター

Pom(GitHub)

spring-boot-starter-data-redis

Spring Data RedisおよびLettuceクライアントでRedis Key-Valueデータストアを使用するためのスターター

Pom(GitHub)

spring-boot-starter-data-redis-reactive

Spring Data RedisリアクティブおよびLettuceクライアントでRedisキー値データストアを使用するためのスターター

Pom(GitHub)

spring-boot-starter-data-rest

Spring Data RESTを使用してRESTでSpring Dataリポジトリを公開するためのスターター

Pom(GitHub)

spring-boot-starter-data-solr

Spring Data SolrでApache Solr検索プラットフォームを使用するためのスターター

Pom(GitHub)

spring-boot-starter-freemarker

FreeMarkerビューを使用してMVC Webアプリケーションを構築するためのスターター

Pom(GitHub)

spring-boot-starter-groovy-templates

Groovyテンプレートビューを使用してMVC Webアプリケーションを構築するためのスターター

Pom(GitHub)

spring-boot-starter-hateoas

Spring MVCおよびSpring HATEOASでハイパーメディアベースのRESTful Webアプリケーションを構築するためのスターター

Pom(GitHub)

spring-boot-starter-integration

Spring Integrationを使用するためのスターター

Pom(GitHub)

spring-boot-starter-jdbc

HikariCP接続プールでJDBCを使用するためのスターター

Pom(GitHub)

spring-boot-starter-jersey

JAX-RSおよびJerseyを使用してRESTful Webアプリケーションを構築するためのスターター。 spring-boot-starter-web の代替

Pom(GitHub)

spring-boot-starter-jooq

jOOQを使用してSQLデータベースにアクセスするためのスターター。 spring-boot-starter-data-jpa または spring-boot-starter-jdbc の代替

Pom(GitHub)

spring-boot-starter-json

JSONを読み書きするためのスターター

Pom(GitHub)

spring-boot-starter-jta-atomikos

Atomikosを使用したJTAトランザクションのスターター

Pom(GitHub)

spring-boot-starter-jta-bitronix

Bitronixを使用したJTAトランザクションのスターター

Pom(GitHub)

spring-boot-starter-mail

Java MailおよびSpring Frameworkのメール送信サポートを使用するためのスターター

Pom(GitHub)

spring-boot-starter-mustache

Mustacheビューを使用してWebアプリケーションを構築するためのスターター

Pom(GitHub)

spring-boot-starter-oauth2-client

Spring SecurityのOAuth2 / OpenID Connectクライアント機能を使用するためのスターター

Pom(GitHub)

spring-boot-starter-oauth2-resource-server

Spring SecurityのOAuth2リソースサーバー機能を使用するためのスターター

Pom(GitHub)

spring-boot-starter-quartz

Quartzスケジューラーを使用するためのスターター

Pom(GitHub)

spring-boot-starter-rsocket

RSocketクライアントおよびサーバーを構築するためのスターター。

Pom(GitHub)

spring-boot-starter-security

Spring Securityを使用するためのスターター

Pom(GitHub)

spring-boot-starter-test

JUnit、Hamcrest、Mockitoなどのライブラリを使用してSpring Bootアプリケーションをテストするためのスターター

Pom(GitHub)

spring-boot-starter-thymeleaf

Thymeleafビューを使用してMVC Webアプリケーションを構築するためのスターター

Pom(GitHub)

spring-boot-starter-validation

Hibernate ValidatorでJava Bean Validationを使用するためのスターター

Pom(GitHub)

spring-boot-starter-web

Spring MVCを使用して、RESTfulを含むWebアプリケーションを構築するためのスターター。Tomcatをデフォルトの埋め込みコンテナーとして使用する

Pom(GitHub)

spring-boot-starter-web-services

Spring Web Servicesを使用するためのスターター

Pom(GitHub)

spring-boot-starter-webflux

Spring FrameworkのReactive Webサポートを使用してWebFluxアプリケーションを構築するためのスターター

Pom(GitHub)

spring-boot-starter-websocket

Spring FrameworkのWebSocketサポートを使用してWebSocketアプリケーションを構築するためのスターター

Pom(GitHub)

アプリケーションスターターに加えて、次のスターターを使用して、本番対応機能を追加できます。

テーブル 2: Spring Boot本番スターター
名前説明Pom

spring-boot-starter-actuator

Spring Bootのアクチュエーターを使用するためのスターター。アプリケーションの監視と管理に役立つ本番対応機能を提供する

Pom(GitHub)

最後に、Spring Bootには、特定の技術ファセットを除外または交換する場合に使用できる次のスターターも含まれています。

表3: Spring Bootテクニカルスターター
名前説明Pom

spring-boot-starter-jetty

Jettyを埋め込みサーブレットコンテナーとして使用するためのスターター。 spring-boot-starter-tomcat の代替

Pom(GitHub)

spring-boot-starter-log4j2

ロギングにLog4j2を使用するためのスターター。 spring-boot-starter-logging の代替

Pom(GitHub)

spring-boot-starter-logging

Logbackを使用したロギングのスターター。デフォルトのロギングスターター

Pom(GitHub)

spring-boot-starter-reactor-netty

Reactor Nettyを組み込みのリアクティブHTTPサーバーとして使用するためのスターター。

Pom(GitHub)

spring-boot-starter-tomcat

Tomcatを埋め込みサーブレットコンテナーとして使用するためのスターター。 spring-boot-starter-web が使用するデフォルトのサーブレットコンテナースターター

Pom(GitHub)

spring-boot-starter-undertow

Undertowを埋め込みサーブレットコンテナーとして使用するためのスターター。 spring-boot-starter-tomcat の代替

Pom(GitHub)

コミュニティが提供するその他のスターターのリストについては、GitHubの spring-boot-starters モジュールのREADMEファイル(GitHub) を参照してください。

2. コードの構造化

Spring Bootは、動作するために特定のコードレイアウトを必要としません。ただし、役立つベストプラクティスがいくつかあります。

2.1. 「デフォルト」パッケージの使用

クラスに package 宣言が含まれていない場合、そのクラスは「デフォルトパッケージ」にあると見なされます。通常、「デフォルトパッケージ」の使用は推奨されておらず、避ける必要があります。すべてのjarのすべてのクラスが読み取られるため、@ComponentScan, @ConfigurationPropertiesScan, @EntityScan、または @SpringBootApplication アノテーションを使用するSpring Bootアプリケーションで特定の問題を引き起こす可能性があります。

Javaの推奨パッケージ命名規則に従い、逆ドメイン名(たとえば、com.example.project)を使用することをお勧めします。

2.2. メインアプリケーションクラスの特定

通常、メインアプリケーションクラスを他のクラスの上にあるルートパッケージに配置することをお勧めします。 @SpringBootApplication アノテーションは多くの場合メインクラスに配置され、特定のアイテムのベース「検索パッケージ」を暗黙的に定義します。例:JPAアプリケーションを作成している場合、@SpringBootApplication アノテーション付きクラスのパッケージを使用して @Entity アイテムを検索します。ルートパッケージを使用すると、コンポーネントスキャンをプロジェクトにのみ適用することもできます。

@SpringBootApplicationを使用したくない場合、インポートする @EnableAutoConfiguration および @ComponentScan アノテーションはその動作を定義するため、代わりに使用することもできます。

次のリストは、典型的なレイアウトを示しています。

com
 +- example
     +- myapplication
         +- Application.java
         |
         +- customer
         |   +- Customer.java
         |   +- CustomerController.java
         |   +- CustomerService.java
         |   +- CustomerRepository.java
         |
         +- order
             +- Order.java
             +- OrderController.java
             +- OrderService.java
             +- OrderRepository.java

Application.java ファイルは、次のように、基本的な @SpringBootApplicationとともに main メソッドを宣言します。

package com.example.myapplication;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

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

}

3. 構成クラス

Spring BootはJavaベースの構成を優先します。 SpringApplication をXMLソースで使用することは可能ですが、通常、プライマリソースは単一の @Configuration クラスにすることをお勧めします。通常、main メソッドを定義するクラスは、プライマリ @Configurationとして適切な候補です。

XML構成を使用する多くのSpring構成例がインターネットで公開されています。可能であれば、常に同等のJavaベースの構成を使用してください。 Enable* アノテーションを検索することは、出発点として適切です。

3.1. 追加の構成クラスのインポート

すべての @Configuration を単一のクラスに入れる必要はありません。 @Import アノテーションを使用して、追加の構成クラスをインポートできます。または、@ComponentScan を使用して、@Configuration クラスを含むすべてのSpringコンポーネントを自動的に取得できます。

3.2. XML設定のインポート

絶対にXMLベースの構成を使用する必要がある場合は、@Configuration クラスから開始することをお勧めします。その後、@ImportResource アノテーションを使用してXML構成ファイルをロードできます。

4. 自動構成

Spring Boot自動構成は、追加したjar依存関係に基づいて、Springアプリケーションを自動的に構成しようとします。例: HSQLDB がクラスパス上にあり、データベース接続Beanを手動で構成していない場合、Spring Bootはメモリ内データベースを自動構成します。

@EnableAutoConfiguration または @SpringBootApplication アノテーションを @Configuration クラスの1つに追加して、自動構成をオプトインする必要があります。

@SpringBootApplication または @EnableAutoConfiguration アノテーションを1つだけ追加してください。通常、プライマリ @Configuration クラスのみにいずれかを追加することをお勧めします。

4.1. 自動構成の段階的な置き換え

自動構成は非侵襲的です。いつでも、独自の構成を定義して、自動構成の特定の部分を置き換えることができます。例:独自の DataSource Beanを追加すると、デフォルトの組み込みデータベースサポートは元に戻ります。

現在適用されている自動構成とその理由を調べる必要がある場合は、--debug スイッチを使用してアプリケーションを開始してください。これにより、選択したコアロガーのデバッグログが有効になり、コンソールに状態レポートが記録されます。

4.2. 特定の自動構成クラスを無効にする

不要な特定の自動構成クラスが適用されている場合は、次の例に示すように、@EnableAutoConfiguration のexclude属性を使用して無効にすることができます。

import org.springframework.boot.autoconfigure.*;
import org.springframework.boot.autoconfigure.jdbc.*;
import org.springframework.context.annotation.*;

@Configuration(proxyBeanMethods = false)
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
public class MyConfiguration {
}

クラスがクラスパス上にない場合、アノテーションの excludeName 属性を使用して、代わりに完全修飾名を指定できます。最後に、spring.autoconfigure.exclude プロパティを使用して、除外する自動構成クラスのリストを制御することもできます。

アノテーションレベルとプロパティの使用の両方で除外を定義できます。
自動構成クラスは publicですが、パブリックAPIと見なされるクラスの唯一の側面は、自動構成を無効にするために使用できるクラスの名前です。ネストされた構成クラスやBeanメソッドなど、これらのクラスの実際の内容は内部使用専用であり、直接使用することはお勧めしません。

5. Spring Beanと依存性注入

Beanとその注入された依存関係を定義するために、標準のSpring Framework技法を自由に使用できます。簡単にするために、@ComponentScan を使用して(Beanを見つける)、@Autowired を使用して(コンストラクター注入を行う)がうまく機能することがよくあります。

上記で提案したようにコードを構成する場合(アプリケーションクラスをルートパッケージに配置する場合)、引数なしで @ComponentScan を追加できます。すべてのアプリケーションコンポーネント(@Component, @Service, @Repository, @Controller など)は、Spring Beanとして自動的に登録されます。

次の例は、コンストラクター注入を使用して必要な RiskAssessor Beanを取得する @Service Beanを示しています。

package com.example.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class DatabaseAccountService implements AccountService {

    private final RiskAssessor riskAssessor;

    @Autowired
    public DatabaseAccountService(RiskAssessor riskAssessor) {
        this.riskAssessor = riskAssessor;
    }

    // ...

}

Beanに1つのコンストラクターがある場合、次の例に示すように、@Autowiredを省略できます。

@Service
public class DatabaseAccountService implements AccountService {

    private final RiskAssessor riskAssessor;

    public DatabaseAccountService(RiskAssessor riskAssessor) {
        this.riskAssessor = riskAssessor;
    }

    // ...

}
コンストラクターインジェクションを使用すると、riskAssessor フィールドが finalとしてマークされ、その後変更できないことを示すことに注意してください。

6. @SpringBootApplicationアノテーションの使用

多くのSpring Boot開発者は、自動構成、コンポーネントスキャンを使用し、「アプリケーションクラス」で追加の構成を定義できるアプリを好みます。単一の @SpringBootApplication アノテーションを使用して、これらの3つの機能を有効にできます。

  • @EnableAutoConfiguration : Spring Bootの自動構成メカニズムを有効にする

  • @ComponentScan : アプリケーションが配置されているパッケージで @Component スキャンを有効にする (ベストプラクティスを見る)

  • @Configuration : コンテキストに追加のBeanを登録したり、追加の構成クラスをインポートしたりできます。

package com.example.myapplication;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication // same as @Configuration @EnableAutoConfiguration @ComponentScan
public class Application {

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

}
@SpringBootApplication は、@EnableAutoConfiguration および @ComponentScanの属性をカスタマイズするエイリアスも提供します。

これらの機能はいずれも必須ではなく、この単一のアノテーションを有効にする機能のいずれかに置き換えることもできます。たとえば、アプリケーションでコンポーネントスキャンまたは構成プロパティスキャンを使用したくない場合があります。

package com.example.myapplication;

import org.springframework.boot.SpringApplication;
import org.springframework.context.annotation.ComponentScan
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@Configuration(proxyBeanMethods = false)
@EnableAutoConfiguration
@Import({ MyConfig.class, MyAnotherConfig.class })
public class Application {

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

}

この例では、Application は、@Componentアノテーション付きクラスと @ConfigurationPropertiesアノテーション付きクラスが自動的に検出されず、ユーザー定義Beanが明示的にインポートされることを除いて、他のSpring Bootアプリケーションとまったく同じです( @Importを参照)。

7. アプリケーションを実行する

アプリケーションをjarとしてパッケージ化し、組み込みHTTPサーバーを使用する最大の利点の1つは、他のアプリケーションと同じようにアプリケーションを実行できることです。Spring Bootアプリケーションのデバッグも簡単です。特別なIDEプラグインまたは拡張機能は必要ありません。

このセクションでは、jarベースのパッケージングのみを扱います。アプリケーションをwarファイルとしてパッケージ化することを選択した場合は、サーバーとIDEのドキュメントを参照する必要があります。

7.1. IDEから実行する

IDEからSpring Bootアプリケーションを単純なJavaアプリケーションとして実行できます。ただし、最初にプロジェクトをインポートする必要があります。インポート手順は、IDEとビルドシステムによって異なります。ほとんどのIDEはMavenプロジェクトを直接インポートできます。例:Eclipseユーザーは、File メニューから Import…​Existing Maven Projects を選択できます。

プロジェクトをIDEに直接インポートできない場合は、ビルドプラグインを使用してIDEメタデータを生成できる場合があります。Mavenには、Eclipse(Apache) およびIDEA(Apache) のプラグインが含まれています。Gradleは、さまざまなIDE(英語) のプラグインを提供します。

誤ってWebアプリケーションを2回実行すると、「Port already in use」エラーが表示されます。STSユーザーは、Run ボタンではなく Relaunch ボタンを使用して、既存のインスタンスを確実に閉じることができます。

7.2. パッケージ化されたアプリケーションとして実行する

Spring Boot MavenまたはGradleプラグインを使用して実行可能jarを作成する場合、次の例に示すように、java -jarを使用してアプリケーションを実行できます。

$ java -jar target/myapplication-0.0.1-SNAPSHOT.jar

リモートデバッグサポートを有効にしてパッケージ化されたアプリケーションを実行することもできます。これにより、次の例に示すように、パッケージ化されたアプリケーションにデバッガーを接続できます。

$ java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n \
       -jar target/myapplication-0.0.1-SNAPSHOT.jar

7.3. Mavenプラグインの使用

Spring Boot Mavenプラグインには、アプリケーションをすばやくコンパイルして実行するために使用できる run ゴールが含まれています。IDEの場合と同様に、アプリケーションは展開された形式で実行されます。次の例は、Spring Bootアプリケーションを実行する典型的なMavenコマンドを示しています。

$ mvn spring-boot:run

次の例に示すように、MAVEN_OPTS オペレーティングシステム環境変数を使用することもできます。

$ export MAVEN_OPTS=-Xmx1024m

7.4. Gradleプラグインの使用

Spring Boot Gradleプラグインには、アプリケーションを展開形式で実行するために使用できる bootRun タスクも含まれています。 bootRun タスクは、org.springframework.boot および java プラグインを適用するたびに追加され、次の例に示されています。

$ gradle bootRun

次の例に示すように、JAVA_OPTS オペレーティングシステム環境変数を使用することもできます。

$ export JAVA_OPTS=-Xmx1024m

7.5. ホットスワップ

Spring Bootアプリケーションは単なるJavaアプリケーションであるため、JVMホットスワップはそのまま使用できます。JVMのホットスワップは、置き換えることができるバイトコードによって多少制限されています。より完全なソリューションを得るには、JRebel(英語) を使用できます。

spring-boot-devtools モジュールには、アプリケーションの迅速な再起動のサポートも含まれています。詳細については、この章で後述する開発ツールセクションおよびホットスワップ「使い方」を参照してください。

8. 開発ツール

Spring Bootには、アプリケーション開発エクスペリエンスをもう少し快適にすることができる追加のツールセットが含まれています。 spring-boot-devtools モジュールを任意のプロジェクトに含めて、追加の開発時機能を提供できます。devtoolsサポートを含めるには、MavenおよびGradleの次のリストに示すように、ビルドにモジュール依存関係を追加します。

Maven
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>
Gradle
configurations {
    developmentOnly
    runtimeClasspath {
        extendsFrom developmentOnly
    }
}
dependencies {
    developmentOnly("org.springframework.boot:spring-boot-devtools")
}
完全にパッケージ化されたアプリケーションを実行すると、開発者ツールは自動的に無効になります。アプリケーションが java -jar から起動された場合、または特別なクラスローダーから起動された場合、「本番アプリケーション」と見なされます。それが当てはまらない場合(つまり、コンテナーからアプリケーションを実行する場合)、devtoolsを除外するか、-Dspring.devtools.restart.enabled=false システムプロパティを設定することを検討してください。
Mavenでオプションとして依存関係にフラグを立てるか、Gradleでカスタム developmentOnly 構成を使用する(上記を参照)ことは、プロジェクトを使用する他のモジュールに開発ツールが一時的に適用されるのを防ぐベストプラクティスです。
再パッケージ化されたアーカイブには、デフォルトではdevtoolsが含まれていません。特定のリモート devtools機能を使用する場合は、excludeDevtools ビルドプロパティを無効にしてそれを含める必要があります。このプロパティは、MavenおよびGradleプラグインの両方でサポートされています。

8.1. プロパティのデフォルト

Spring Bootがサポートするライブラリのいくつかは、キャッシュを使用してパフォーマンスを向上させます。例: テンプレートエンジンはコンパイル済みテンプレートをキャッシュして、テンプレートファイルの繰り返し解析を回避します。また、Spring MVCは、静的リソースを提供するときに、HTTPキャッシュヘッダーを応答に追加できます。

キャッシングは本番環境では非常に有益ですが、開発中は逆効果となり、アプリケーションで行った変更を確認できなくなります。このため、spring-boot-devtoolsはデフォルトでキャッシュオプションを無効にします。

キャッシュオプションは通常、application.properties ファイルの設定によって構成されます。例:Thymeleafは spring.thymeleaf.cache プロパティを提供します。 spring-boot-devtools モジュールは、これらのプロパティを手動で設定する必要があるのではなく、適切な開発時構成を自動的に適用します。

Spring MVCおよびSpring WebFluxアプリケーションの開発中にWeb要求に関する詳細情報が必要なため、開発者ツールは web ロギンググループの DEBUG ロギングを有効にします。これにより、受信要求、処理しているハンドラー、応答結果などに関する情報が得られます。すべての要求の詳細(機密情報を含む可能性がある)を記録する場合は、spring.http.log-request-details 構成プロパティをオンにできます。

プロパティのデフォルトを適用したくない場合は、application.propertiesspring.devtools.add-propertiesfalse に設定できます。
devtoolsによって適用されるプロパティの完全なリストについては、DevToolsPropertyDefaultsPostProcessor(GitHub) を参照してください。

8.2. 自動再起動

spring-boot-devtools を使用するアプリケーションは、クラスパス上のファイルが変更されるたびに自動的に再起動します。これは、コードの変更に対して非常に高速なフィードバックループを提供するため、IDEで作業する場合に便利な機能です。デフォルトでは、フォルダーを指すクラスパス上のエントリは、変更が監視されます。静的アセットやビューテンプレートなどの特定のリソースでは、アプリケーションを再起動する必要がないことに注意してください。

再起動のトリガー

DevToolsはクラスパスリソースを監視するため、再起動をトリガーする唯一の方法はクラスパスを更新することです。クラスパスを更新する方法は、使用しているIDEによって異なります。Eclipseでは、変更されたファイルを保存すると、クラスパスが更新され、再起動がトリガーされます。IntelliJ IDEAでは、プロジェクト(Build +→+ Build Project)をビルドすると同じ効果があります。

フォークが有効になっている限り、サポートされているビルドプラグイン(MavenおよびGradle)を使用してアプリケーションを起動することもできます。これは、DevToolsが適切に動作するために独立したアプリケーションクラスローダーを必要とするためです。デフォルトでは、GradleおよびMavenプラグインはアプリケーションプロセスをフォークします。
自動再起動は、LiveReloadと併用すると非常にうまく機能します。詳細については、LiveReloadセクションを参照してください。JRebelを使用する場合、動的なクラスの再読み込みを優先して自動再起動が無効になります。その他のdevtools機能(LiveReloadやプロパティのオーバーライドなど)は引き続き使用できます。
DevToolsは、アプリケーションコンテキストのシャットダウンフックに依存して、再起動中に閉じます。シャットダウンフック(SpringApplication.setRegisterShutdownHook(false))を無効にした場合、正しく機能しません。
クラスパスのエントリが変更されたときに再起動をトリガーするかどうかを決定する場合、DevToolsは spring-boot, spring-boot-devtools, spring-boot-autoconfigure, spring-boot-actuatorおよび spring-boot-starterという名前のプロジェクトを自動的に無視します。
DevToolsは、ApplicationContextが使用する ResourceLoader をカスタマイズする必要があります。アプリケーションがすでに提供している場合、ラップされます。 ApplicationContext での getResource メソッドの直接オーバーライドはサポートされていません。
再起動とリロード

Spring Bootが提供する再起動テクノロジは、2つのクラスローダーを使用して機能します。変更されないクラス(たとえば、サードパーティのjarからのクラス)は、基本クラスローダーにロードされます。積極的に開発しているクラスは、再起動クラスローダーにロードされます。アプリケーションを再起動すると、再起動クラスローダーが破棄され、新しいクラスローダーが作成されます。このアプローチは、基本クラスローダーがすでに利用可能であり、データが設定されているため、通常、アプリケーションの再起動は「コールドスタート」よりもはるかに高速であることを意味します。

再起動がアプリケーションに対して十分に速くない場合、またはクラスローディングの課題が発生した場合は、JRebel(英語) などのテクノロジーをZeroTurnaroundからリロードすることを検討できます。これらは、ロードされたクラスを書き換えて、リロードを受け入れやすくすることで機能します。

8.2.1. 状態評価の変更の記録

デフォルトでは、アプリケーションを再起動するたびに、状態評価デルタを示すレポートが記録されます。このレポートには、Beanの追加や削除、構成プロパティの設定などの変更を行うと、アプリケーションの自動構成に対する変更が表示されます。

レポートのログを無効にするには、次のプロパティを設定します。

spring.devtools.restart.log-condition-evaluation-delta=false

8.2.2. リソースを除外する

特定のリソースは、変更されたときに必ずしも再起動をトリガーする必要はありません。例:Thymeleafテンプレートはその場で編集できます。デフォルトでは、/META-INF/maven, /META-INF/resources, /resources, /static, /publicまたは /templates のリソースを変更しても再起動はトリガーされませんが、ライブリロードはトリガーされます。これらの除外をカスタマイズする場合は、spring.devtools.restart.exclude プロパティを使用できます。例: /static/public のみを除外するには、次のプロパティを設定します。

spring.devtools.restart.exclude=static/**,public/**
これらのデフォルトを維持して除外を追加する場合は、代わりに spring.devtools.restart.additional-exclude プロパティを使用します。

8.2.3. 追加のパスを見る

クラスパスにないファイルに変更を加えた場合、アプリケーションを再起動または再ロードすることができます。これを行うには、spring.devtools.restart.additional-paths プロパティを使用して、変更を監視する追加のパスを構成します。前述spring.devtools.restart.exclude プロパティを使用して、追加のパスにある変更が完全な再起動またはライブリロードをトリガーするかどうかを制御できます。

8.2.4. 再起動を無効にする

再起動機能を使用しない場合は、spring.devtools.restart.enabled プロパティを使用して無効にすることができます。ほとんどの場合、application.properties でこのプロパティを設定できます(そうすると、再起動クラスローダーが初期化されますが、ファイルの変更は監視されません)。

再起動サポートを完全に無効にする必要がある場合(たとえば、特定のライブラリで動作しないため)、次の例に示すように、SpringApplication.run(…​)を呼び出す前に spring.devtools.restart.enabled System プロパティを false に設定する必要があります。

public static void main(String[] args) {
    System.setProperty("spring.devtools.restart.enabled", "false");
    SpringApplication.run(MyApp.class, args);
}

8.2.5. トリガーファイルの使用

変更されたファイルを継続的にコンパイルするIDEを使用している場合、特定の時間にのみ再起動をトリガーすることをお勧めします。そのためには、「トリガーファイル」を使用できます。これは、実際に再起動チェックをトリガーするときに変更する必要がある特別なファイルです。

ファイルを更新すると、チェックがトリガーされますが、再起動は、Devtoolsが何らかの処理を行うことを検出した場合にのみ実際に発生します。

トリガーファイルを使用するには、spring.devtools.restart.trigger-file プロパティをトリガーファイルの名前(パスを除く)に設定します。トリガーファイルは、クラスパスのどこかに表示する必要があります。

例:次の構造のプロジェクトがある場合:

src
+- main
   +- resources
      +- .reloadtrigger

trigger-file プロパティは次のようになります。

spring.devtools.restart.trigger-file=.reloadtrigger

再起動は、src/main/resources/.reloadtrigger が更新されたときにのみ発生します。

すべてのプロジェクトが同じように動作するように、spring.devtools.restart.trigger-fileグローバル設定として設定できます。

一部のIDEには、トリガーファイルの手動更新を不要にする機能があります。Pleiades All in One (STS, Lombok 付属) または Eclipse用Spring Tools(英語) IntelliJ IDEA (Ultimateエディション) は両方ともそのようなサポートを持っています。Spring Toolsでは、コンソールビューから「リロード」ボタンを使用できます( trigger-file の名前が .reloadtriggerである限り)。IntelliJについては、このドキュメントの指示に従ってください。

8.2.6. 再起動クラスローダーのカスタマイズ

再起動とリロードセクションで前述したように、再起動機能は2つのクラスローダーを使用して実装されます。ほとんどのアプリケーションでは、このアプローチはうまく機能します。ただし、クラスロードの課題が発生する場合があります。

デフォルトでは、IDEで開いているプロジェクトはすべて「再起動」クラスローダーでロードされ、通常の .jar ファイルは「ベース」クラスローダーでロードされます。すべてのモジュールがIDEにインポートされるわけではなく、マルチモジュールプロジェクトで作業している場合は、カスタマイズが必要になる場合があります。そのためには、META-INF/spring-devtools.properties ファイルを作成できます。

spring-devtools.properties ファイルには、restart.exclude および restart.includeというプレフィックスが付いたプロパティを含めることができます。 include 要素は「再起動」クラスローダーにプルアップする必要があるアイテムであり、exclude 要素は「ベース」クラスローダーにプッシュダウンする必要があるアイテムです。次の例に示すように、プロパティの値はクラスパスに適用される正規表現パターンです。

restart.exclude.companycommonlibs=/mycorp-common-[\\w\\d-\.]+\.jar
restart.include.projectcommon=/mycorp-myproj-[\\w\\d-\.]+\.jar
すべてのプロパティキーは一意である必要があります。プロパティが restart.include. または restart.exclude. で始まる限り、考慮されます。
クラスパスからのすべての META-INF/spring-devtools.properties がロードされます。プロジェクト内、またはプロジェクトが使用するライブラリ内にファイルをパッケージ化できます。

8.2.7. 既知の制限

再起動機能は、標準の ObjectInputStreamを使用してデシリアライズされたオブジェクトではうまく機能しません。データをデシリアライズする必要がある場合は、Springの ConfigurableObjectInputStreamThread.currentThread().getContextClassLoader()と組み合わせて使用する必要がある場合があります。

残念ながら、いくつかのサードパーティライブラリは、コンテキストクラスローダーを考慮せずにデシリアライズします。このような問題を見つけた場合は、元の作者に修正を依頼する必要があります。

8.3. LiveReload

spring-boot-devtools モジュールには、リソースが変更されたときにブラウザーのリフレッシュをトリガーするために使用できるLiveReloadサーバーが組み込まれています。LiveReloadブラウザー拡張機能は、livereload.com(英語) からChrome、Firefox、およびSafariで自由に使用できます。

アプリケーションの実行時にLiveReloadサーバーを開始したくない場合は、spring.devtools.livereload.enabled プロパティを falseに設定できます。

一度に実行できるLiveReloadサーバーは1つだけです。アプリケーションを開始する前に、他のLiveReloadサーバーが実行されていないことを確認してください。IDEから複数のアプリケーションを起動する場合、最初のアプリケーションのみがLiveReloadをサポートしています。

8.4. グローバル設定

次のファイルのいずれかを $HOME/.config/spring-boot フォルダーに追加することにより、グローバルdevtools設定を構成できます。

  1. spring-boot-devtools.properties

  2. spring-boot-devtools.yaml

  3. spring-boot-devtools.yml

これらのファイルに追加されたプロパティは、devtoolsを使用するマシン上のすべての Spring Bootアプリケーションに適用されます。例:常にトリガーファイルを使用するように再起動を構成するには、次のプロパティを追加します。

〜/ .config / spring-boot / spring-boot-devtools.properties
spring.devtools.restart.trigger-file=.reloadtrigger
devtools構成ファイルが $HOME/.config/spring-bootで見つからない場合、$HOME フォルダーのルートで .spring-boot-devtools.properties ファイルの存在が検索されます。これにより、$HOME/.config/spring-boot ロケーションをサポートしないSpring Bootの古いバージョン上にあるアプリケーションとdevtoolsグローバル構成を共有できます。
上記のファイルでアクティブ化されたプロファイルは、プロファイル固有の構成ファイルのロードには影響しません。

8.5. リモートアプリケーション

Spring Boot開発者ツールは、ローカル開発に限定されません。アプリケーションをリモートで実行するときに、いくつかの機能を使用することもできます。リモートサポートはオプトインです。これを有効にするとセキュリティ上のリスクになる可能性があります。信頼できるネットワークで実行している場合、またはSSLで保護されている場合にのみ有効にしてください。これらのオプションのいずれも使用できない場合は、DevTools 'リモートサポートを使用しないでください。本番デプロイでサポートを有効にしないでください。

有効にするには、次のリストに示すように、devtools が再パッケージ化されたアーカイブに含まれていることを確認する必要があります。

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

次に、spring.devtools.remote.secret プロパティを設定する必要があります。重要なパスワードやシークレットと同様に、値は一意で強力で、推測や総当たり攻撃ができないようにする必要があります。

リモート devtoolsサポートは2つの部分で提供されます。接続を受け入れるサーバー側エンドポイントと、IDEで実行するクライアントアプリケーションです。 spring.devtools.remote.secret プロパティが設定されると、サーバーコンポーネントは自動的に有効になります。クライアントコンポーネントは手動で起動する必要があります。

8.5.1. リモートクライアントアプリケーションの実行

リモートクライアントアプリケーションは、IDE内から実行されるように設計されています。接続するリモートプロジェクトと同じクラスパスで org.springframework.boot.devtools.RemoteSpringApplication を実行する必要があります。アプリケーションの単一の必須引数は、接続先のリモート URLです。

例:EclipseまたはSTSを使用していて、Cloud Foundryにデプロイした my-app という名前のプロジェクトがある場合、次のようにします。

  • Run メニューから Run Configurations…​ を選択します。

  • 新しい Java Application 「起動構成」を作成します。

  • my-app プロジェクトを参照します。

  • org.springframework.boot.devtools.RemoteSpringApplication をメインクラスとして使用します。

  • https://myapp.cfapps.ioProgram arguments (またはリモートのURL)に追加します。

実行中のリモートクライアントは、次のリストのようになります。

  .   ____          _                                              __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _          ___               _      \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` |        | _ \___ _ __  ___| |_ ___ \ \ \ \
 \\/  ___)| |_)| | | | | || (_| []::::::[]   / -_) '  \/ _ \  _/ -_) ) ) ) )
  '  |____| .__|_| |_|_| |_\__, |        |_|_\___|_|_|_\___/\__\___|/ / / /
 =========|_|==============|___/===================================/_/_/_/
 :: Spring Boot Remote :: 2.2.4.RELEASE

2015-06-10 18:25:06.632  INFO 14938 --- [           main] o.s.b.devtools.RemoteSpringApplication   : Starting RemoteSpringApplication on pwmbp with PID 14938 (/Users/pwebb/projects/spring-boot/code/spring-boot-project/spring-boot-devtools/target/classes started by pwebb in /Users/pwebb/projects/spring-boot/code)
2015-06-10 18:25:06.671  INFO 14938 --- [           main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.spring[email protected](英語)  2a17b7b6: startup date [Wed Jun 10 18:25:06 PDT 2015]; root of context hierarchy
2015-06-10 18:25:07.043  WARN 14938 --- [           main] o.s.b.d.r.c.RemoteClientConfiguration    : The connection to http://localhost:8080 is insecure. You should use a URL starting with 'https://'.
2015-06-10 18:25:07.074  INFO 14938 --- [           main] o.s.b.d.a.OptionalLiveReloadServer       : LiveReload server is running on port 35729
2015-06-10 18:25:07.130  INFO 14938 --- [           main] o.s.b.devtools.RemoteSpringApplication   : Started RemoteSpringApplication in 0.74 seconds (JVM running for 1.105)
リモートクライアントは実際のアプリケーションと同じクラスパスを使用しているため、アプリケーションプロパティを直接読み取ることができます。これにより、spring.devtools.remote.secret プロパティが読み取られ、認証のためにサーバーに渡されます。
接続プロトコルとして https:// を使用することを常にお勧めします。これにより、トラフィックが暗号化され、パスワードを傍受できなくなります。
プロキシを使用してリモートアプリケーションにアクセスする必要がある場合は、spring.devtools.remote.proxy.host および spring.devtools.remote.proxy.port プロパティを構成します。

8.5.2. リモートアップデート

リモートクライアントは、ローカル再起動と同じ方法でアプリケーションクラスパスの変更を監視します。更新されたリソースはすべてリモートアプリケーションにプッシュされ、( 必要な場合 )再起動をトリガーします。これは、ローカルにないクラウドサービスを使用する機能を反復する場合に役立ちます。一般的に、リモートの更新と再起動は、完全な再構築とデプロイのサイクルよりもはるかに高速です。

ファイルは、リモートクライアントが実行されている場合にのみ監視されます。リモートクライアントを開始する前にファイルを変更した場合、そのファイルはリモートサーバーにプッシュされません。

8.5.3. File System Watcherの構成

FileSystemWatcher(GitHub) は、特定の時間間隔でクラスの変更をポーリングし、事前定義された待機期間を待って、変更がないことを確認します。次に、変更がリモートアプリケーションにアップロードされます。より遅い開発環境では、クワイエット期間が十分ではなく、クラスの変更がバッチに分割される場合があります。クラス変更の最初のバッチがアップロードされた後、サーバーが再起動されます。サーバーが再起動しているため、次のバッチをアプリケーションに送信できません。

これは通常、RemoteSpringApplication ログに、一部のクラスのアップロードの失敗に関する警告と、それに続く再試行によって明示されます。しかし、変更の最初のバッチがアップロードされた後、アプリケーションコードの不整合や再起動の失敗につながる可能性もあります。

このような問題が常に発生する場合は、spring.devtools.restart.poll-interval および spring.devtools.restart.quiet-period パラメーターを開発環境に合った値に増やしてみてください。

spring.devtools.restart.poll-interval=2s
spring.devtools.restart.quiet-period=1s

監視対象のクラスパスフォルダーは2秒ごとにポーリングされて変更され、追加のクラス変更がないことを確認するために1秒の待機期間が維持されます。

9. 本番用にアプリケーションをパッケージ化する

実行可能jarは、実動デプロイに使用できます。自己完結型であるため、クラウドベースのデプロイにも最適です。

ヘルス、監査、メトリックRESTまたはJMXエンドポイントなどの追加の「本番対応」機能については、spring-boot-actuatorの追加を検討してください。詳細については、production-ready-features.htmlを参照してください。

10. 次のステップ

Spring Bootの使用方法と、従うべきいくつかのベストプラクティスを理解する必要があります。これで、特定のSpring Bootの機能詳細を学ぶことができます。または、スキップしてSpring Bootの「 本番対応 」の特徴について読むこともできます。

Unofficial Translation by spring.pleiades.io. See the original content.