1. 概要

Spring Bootは、導入以来、Springエコシステムの主要なプレーヤーです。 このプロジェクトは、自動構成機能により、私たちの生活をはるかに楽にします。

このチュートリアルでは、就職の面接中に出てくる可能性のあるSpring Bootに関連する最も一般的な質問のいくつかを取り上げます。

2. 質問

Q1。 スプリングブーツとは何ですか?その主な機能は何ですか?

Spring Bootは本質的に、SpringFrameworkの上に構築された迅速なアプリケーション開発のためのフレームワークです。 自動構成と組み込みアプリケーションサーバーのサポート、および豊富なドキュメントとコミュニティサポートを組み合わせることで、SpringBootは現在Javaエコシステムで最も人気のあるテクノロジーの1つです。

ここにいくつかの顕著な特徴があります:

  • Starters –外出先で関連する依存関係を含めるための依存関係記述子のセット
  • 自動構成–クラスパスに存在する依存関係に基づいてアプリケーションを自動的に構成する方法
  • アクチュエータ–監視などの本番環境に対応した機能を取得します
  • 安全
  • ロギング

Q2。 SpringとSpringBootの違いは何ですか?

Spring Frameworkは、Webアプリケーションの開発を容易にする複数の機能を提供します。 これらの機能には、依存性注入、データバインディング、アスペクト指向プログラミング、データアクセスなどが含まれます。

何年にもわたって、Springはますます複雑になり、そのようなアプリケーションに必要な構成の量は恐ろしいものになる可能性があります。 ここでSpringBootが役に立ちます—Springアプリケーションの構成が簡単になります。

基本的に、Springはピニオン化されていませんが、 Spring Bootはプラットフォームとライブラリの意見を取り入れているため、すぐに始めることができます。

SpringBootがもたらす最も重要な利点の2つを次に示します。

  • クラスパスで見つかったアーティファクトに基づいてアプリケーションを自動構成します
  • セキュリティやヘルスチェックなど、本番環境のアプリケーションに共通する機能しない機能を提供する

バニラスプリングとスプリングブーツの詳細な比較については、他のチュートリアルをご覧ください。

Q3。 MavenでSpringBootアプリケーションを設定するにはどうすればよいですか?

他のライブラリと同じように、SpringBootをMavenプロジェクトに含めることができます。 ただし、最善の方法は、 spring-boot-starter-parent プロジェクトから継承し、 Spring Bootstartersへの依存関係を宣言することです。 これを行うと、プロジェクトはSpringBootのデフォルト設定を再利用できます。

spring-boot-starter-parent プロジェクトの継承は簡単です— pom.xmlparent要素を指定するだけで済みます。

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.4.0.RELEASE</version>
</parent>

spring-boot-starter-parentの最新バージョンはMavenCentralにあります。

スターター親プロジェクトの使用は便利ですが、常に実行可能とは限りません。たとえば、会社がすべてのプロジェクトを標準POMから継承する必要がある場合でも、を使用したSpring Bootの依存関係管理のメリットを享受できます。 ]カスタム親

Q4。 Spring Initializrとは何ですか?

Spring Initializrは、SpringBootプロジェクトを作成するための便利な方法です。

Spring Initializr サイトにアクセスし、依存関係管理ツール(MavenまたはGradle)、言語(Java、KotlinまたはGroovy)、パッケージ化スキーム(JarまたはWar)、バージョンと依存関係を選択できます。プロジェクトをダウンロードします。

このは、私たちのスケルトンプロジェクトを作成し、セットアップ時間を節約して、ビジネスロジックの追加に集中できるようにします。

IDE(STSやSCSプラグインを備えたEclipseなど)の新しいプロジェクトウィザードを使用してSpring Bootプロジェクトを作成する場合でも、内部でSpringInitializrを使用します。

Q5。 どのようなスプリングブートスターターが利用可能ですか?

各スターターは、必要なすべてのSpringテクノロジーのワンストップショップとしての役割を果たします。 次に、他の必要な依存関係が一時的に取り込まれ、一貫した方法で管理されます。

すべてのスターターはorg.springframework.bootグループの下にあり、名前はspring-boot-starter-で始まります。 この命名パターンにより、特に名前による依存関係の検索をサポートするIDEを使用する場合に、スターターを簡単に見つけることができます。

この記事の執筆時点では、50人以上のスターターが自由に利用できます。 ここでは、最も一般的なものをリストします。

  • spring-boot-starter :自動構成サポート、ロギング、YAMLを含むコアスターター
  • spring-boot-starter-aop :SpringAOPおよびAspectJを使用したアスペクト指向プログラミング用
  • spring-boot-starter-data-jpa:HibernateでSpringDataJPAを使用する場合
  • spring-boot-starter-security :SpringSecurityを使用するため
  • spring-boot-starter-test :SpringBootアプリケーションをテストするため
  • spring-boot-starter-web :RESTfulを含む、SpringMVCを使用したアプリケーションの構築用

スターターの完全なリストについては、このリポジトリを参照してください。

Spring Bootスターターの詳細については、 SpringBootStartersの概要を参照してください。

Q6。 特定の自動構成を無効にする方法は?

特定の自動構成を無効にする場合は、@EnableAutoConfigurationアノテーションのexclude属性を使用して指定できます。

たとえば、このコードスニペットはDataSourceAutoConfigurationを無効にします。

// other annotations
@EnableAutoConfiguration(exclude = DataSourceAutoConfiguration.class)
public class MyConfiguration { }

@SpringBootApplication アノテーション(メタアノテーションとして @EnableAutoConfiguration を含む)を使用して自動構成を有効にした場合、同じ名前の属性を使用して自動構成を無効にできます。

// other annotations
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class MyConfiguration { }

spring.autoconfigure.exclude環境プロパティを使用して自動構成を無効にすることもできます。 application.properties ファイルのこの設定は、以前と同じことを行います。

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

Q7。 カスタム自動構成を登録する方法は?

自動構成クラスを登録するには、 META-INF /spring.factoriesファイルのEnableAutoConfigurationキーの下に完全修飾名をリストする必要があります。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.baeldung.autoconfigure.CustomAutoConfiguration

Mavenを使用してプロジェクトをビルドする場合、そのファイルは resources / META-INF ディレクトリーに配置する必要があります。これは、packageフェーズ中に上記の場所に配置されます。

Q8。 Beanが存在するときに自動構成を元に戻すように指示するにはどうすればよいですか?

Beanがすでに存在する場合に自動構成クラスにバックオフするように指示するには、@ConditionalOnMissingBeanアノテーションを使用できます。

この注釈の最も顕著な属性は次のとおりです。

  • value –チェックするBeanのタイプ
  • name –チェックするBeanの名前

@ Bean で装飾されたメソッドに配置されると、ターゲットタイプはデフォルトでメソッドの戻りタイプになります。

@Configuration
public class CustomConfiguration {
    @Bean
    @ConditionalOnMissingBean
    public CustomService service() { ... }
}

Q9。 Spring Boot WebアプリケーションをJarおよびWarファイルとしてデプロイする方法は?

従来、WebアプリケーションをWARファイルとしてパッケージ化し、それを外部サーバーにデプロイしていました。 これにより、同じサーバー上に複数のアプリケーションを配置できます。 CPUとメモリが不足していたとき、これはリソースを節約するための優れた方法でした。

しかし、状況は変わりました。 現在、コンピュータのハードウェアはかなり安価であり、サーバーの構成に注目が集まっています。 展開中にサーバーを構成する際の小さな間違いは、壊滅的な結果につながる可能性があります。

Springは、プラグイン、つまり spring-boot-maven-plugin を提供して、Webアプリケーションを実行可能JARとしてパッケージ化することにより、この問題に取り組んでいます。

このプラグインを含めるには、plugin要素をpom.xmlに追加するだけです。

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

このプラグインを配置すると、packageフェーズを実行した後にファットJARを取得します。 このJARには、組み込みサーバーを含む、必要なすべての依存関係が含まれています。 したがって、外部サーバーの構成について心配する必要はありません。

その後、通常の実行可能JARと同じようにアプリケーションを実行できます。

JARファイルを作成するには、pom.xmlファイルのpackaging要素をjarに設定する必要があることに注意してください。

<packaging>jar</packaging>

この要素を含めない場合、デフォルトでjarになります。

WARファイルを作成するには、packages要素をwarに変更します。

<packaging>war</packaging>

コンテナの依存関係をパッケージ化されたファイルから除外します。

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

Maven package フェーズを実行すると、デプロイ可能なWARファイルが作成されます。

Q10。 コマンドラインアプリケーションにSpringBootを使用する方法は?

他のJavaプログラムと同様に、SpringBootコマンドラインアプリケーションにはmainメソッドが必要です。

このメソッドは、 SpringApplication#runメソッドを呼び出してアプリケーションをブートストラップするエントリポイントとして機能します。

@SpringBootApplication
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class);
        // other statements
    }
}

次に、 SpringApplication クラスは、Springコンテナーを起動し、Beanを自動構成します。

プライマリ構成ソースとして機能するには、構成クラスをrunメソッドに渡す必要があることに注意してください。 慣例により、この引数はエントリクラス自体です。

run メソッドを呼び出した後、通常のプログラムと同様に他のステートメントを実行できます。

Q11。 外部構成の考えられる原因は何ですか?

Spring Bootは外部構成のサポートを提供し、さまざまな環境で同じアプリケーションを実行できるようにします。 プロパティファイル、YAMLファイル、環境変数、システムプロパティ、およびコマンドラインオプション引数を使用して、構成プロパティを指定できます。

次に、 @Value アノテーション、 @ConfigurationPropertiesアノテーションを介したバインドされたオブジェクト、または Environment 抽象化を使用して、これらのプロパティにアクセスできます。

Q12。 スプリングブーツがリラックスしたバインディングをサポートすることはどういう意味ですか?

Spring Bootの緩和されたバインディングは、構成プロパティのタイプセーフなバインディングに適用できます。

リラックスしたバインディングでは、プロパティのキーは、プロパティ名と完全に一致する必要はありません。このような環境プロパティは、キャメルケース、ケバブケース、スネークケース、または大文字で単語を使用して記述できます。アンダースコアで区切られます。

たとえば、@ConfigurationPropertiesアノテーションが付いたBeanクラスのプロパティの名前がmyPropの場合、次の環境プロパティのいずれかにバインドできます: myProp my-prop my_prop 、またはMY_PROP

Q13。 私が何を s Spring Boot DevToolsは?

Spring Boot Developer Tools(DevTools)は、開発プロセスを容易にするツールのセットです。

これらの開発時機能を含めるには、pom.xmlファイルに依存関係を追加する必要があります。

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

spring-boot-devtools モジュールは、アプリケーションが本番環境で実行されている場合、自動的に無効になります。 アーカイブの再パッケージ化も、デフォルトでこのモジュールを除外します。 したがって、最終製品にオーバーヘッドが発生することはありません。

デフォルトでは、DevToolsは開発環境に適したプロパティを適用します。 これらのプロパティは、テンプレートキャッシュを無効にし、Webグループのデバッグログを有効にします。 その結果、プロパティを設定せずに、この賢明な開発時の構成を実現できます。

DevToolsを使用するアプリケーションは、クラスパス上のファイルが変更されるたびに再起動します。これは、変更に対する迅速なフィードバックを提供するため、開発において非常に役立つ機能です。

デフォルトでは、ビューテンプレートを含む静的リソースは再起動を開始しません。 代わりに、リソースの変更によりブラウザーの更新がトリガーされます。 これは、DevToolsに含まれている組み込みのLiveReloadサーバーと対話するためにLiveReload拡張機能がブラウザーにインストールされている場合にのみ発生する可能性があることに注意してください。

このトピックの詳細については、 Spring BootDevToolsの概要を参照してください。

Q14。 統合テストの書き方は?

Springアプリケーションの統合テストを実行するときは、ApplicationContextが必要です。

私たちの生活を楽にするために、Spring Bootはテスト用の特別なアノテーションを提供します— @SpringBootTest。 このアノテーションは、classes属性で示される構成クラスからApplicationContextを作成します。

classes属性が設定されていない場合、Spring Bootはプライマリ構成クラスを検索します。検索は、 @ Spring BootApplicationで注釈が付けられたクラスが見つかるまで、テストを含むパッケージから始まります。 または@SpringBootConfiguration

詳細な手順については、 SpringBootでのテストに関するチュートリアルをご覧ください。

Q15 。 Spring Bootアクチュエータは何に使用されますか?

基本的に、Actuatorは、本番環境に対応した機能を有効にすることで、SpringBootアプリケーションに命を吹き込みます。 これらの機能により、アプリケーションが本番環境で実行されているときに、アプリケーションを監視および管理できます。

SpringBootActuatorをプロジェクトに統合するのは非常に簡単です。 spring-boot-starter-actuatorスターターをpom.xmlファイルに含めるだけです。

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

Spring Boot Actuatorは、HTTPまたはJMXエンドポイントを使用して操作情報を公開できます。 ただし、ほとんどのアプリケーションはHTTPを使用しており、エンドポイントのIDと/アクチュエータプレフィックスがURLパスを形成します。

Actuatorが提供する最も一般的な組み込みエンドポイントのいくつかを次に示します。

  • envは環境プロパティを公開します
  • healthはアプリケーションのヘルス情報を表示します
  • httptraceはHTTPトレース情報を表示します
  • infoは任意のアプリケーション情報を表示します
  • metricsはメトリック情報を表示します
  • loggers は、アプリケーションのロガーの構成を表示および変更します
  • mappings は、すべての@RequestMappingパスのリストを表示します

詳細な概要については、 SpringBootActuatorチュートリアルを参照してください。

Q16。 Spring Bootプロジェクトを構成するのに適しているのはプロパティとYAMLのどちらですか?

YAMLには、プロパティファイルに比べて多くの利点があります。

  • より明確で読みやすく
  • より優れた、より読みやすい形式で表される階層構成データに最適です
  • マップ、リスト、スカラータイプのサポート
  • 同じファイルに複数のプロファイルを含めることができます(Spring Boot 2.4.0以降、これはプロパティファイルでも可能です)

ただし、インデント規則があるため、書き込むのは少し難しく、エラーが発生しやすい場合があります。

詳細と作業サンプルについては、 Spring YAML vsPropertiesチュートリアルを参照してください。

Q17。 Spring Bootはどのような基本的な注釈を提供しますか?

Spring Bootが提供する主な注釈は、そのorg.springframework.boot.autoconfigureとそのサブパッケージにあります。

ここにいくつかの基本的なものがあります:

  • @EnableAutoConfiguration – Spring Bootがクラスパスで自動構成Beanを検索し、それらを自動的に適用するようにします
  • @SpringBootApplication –ブートアプリケーションのメインクラスを示します。 このアノテーションは、 @Configuration @EnableAutoConfiguration 、および@ComponentScanアノテーションをデフォルトの属性と組み合わせたものです。

Spring Boot Annotations は、主題についてより多くの洞察を提供します。

Q18。 Spring Bootでデフォルトポートを変更するにはどうすればよいですか?

次のいずれかの方法を使用して、SpringBootに組み込まれているサーバーのデフォルトポートを変更できます。

  • プロパティファイルの使用–プロパティ server.port を使用して、 application.properties (または application.yml )ファイルでこれを定義できます。
  • プログラムで–メインの @SpringBootApplication クラスでは、SpringApplicationインスタンスにserver.portを設定できます。
  • コマンドラインの使用–アプリケーションをjarファイルとして実行する場合、server.portをjavaコマンド引数として設定できます。
    java -jar -Dserver.port=8081 myspringproject.jar
    

Q19。 Spring Bootがサポートする組み込みサーバーと、デフォルトを変更する方法

現在、 Spring MVCはTomcat、Jetty、Undertowをサポートしています。 Tomcatは、Spring Bootのwebスターターでサポートされているデフォルトのアプリケーションサーバーです。

Spring WebFluxは、Reactor Netty、Tomcat、Jetty、Undertow をサポートし、デフォルトでReactorNettyを使用します。

Spring MVCでは、デフォルトを変更するには、たとえばJettyに対して、Tomcatを除外し、依存関係にJettyを含める必要があります。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jetty</artifactId>
</dependency>

同様に、WebFluxのデフォルトをUnderTowに変更するには、Reactor Nettyを除外し、依存関係にUnderTowを含める必要があります。

Spring Bootでの組み込みサーブレットコンテナの比較には、SpringMVCで使用できるさまざまな組み込みサーバーの詳細が記載されています。

Q20。 なぜSpringプロファイルが必要なのですか?

企業向けのアプリケーションを開発する場合、通常、Dev、QA、Prodなどの複数の環境を扱います。 これらの環境の構成プロパティは異なります。

たとえば、Devに組み込みのH2データベースを使用している場合でも、Prodには独自のOracleまたはDB2を使用できます。 DBMSが環境間で同じであっても、URLは間違いなく異なります。

これを簡単かつクリーンにするために、 Springには、環境ごとに構成を分離するのに役立つプロファイルが用意されています。したがって、これをプログラムで維持する代わりに、プロパティをapplicationなどの個別のファイルに保持できます。 -dev.propertiesおよびapplication-prod。properties。 デフォルトのapplication.propertieは、 spring.profiles.active を使用して現在アクティブなプロファイルを指しているため、正しい構成が選択されます。

Spring Profiles は、このトピックの包括的なビューを提供します。

3. 結論

この記事では、技術面接中に出てくる可能性のあるSpringBootに関する最も重要な質問のいくつかについて説明しました。

彼らがその夢の仕事を上陸させるのを手伝ってくれることを願っています!