1. 概要

この記事では、既存のSpringフレームワークアプリケーションをSpring Bootアプリケーションに移行する方法を見ていきます。

Spring Bootは、Springを置き換えることを目的としたものではなく、Springをより速く簡単に操作できるようにすることを目的としています。その結果、アプリケーションの移行に必要な変更のほとんどは構成に関連しています。 ほとんどの場合、カスタムコントローラーとその他のコンポーネントは同じままです。

Spring Boot を使用して開発すると、いくつかの利点があります。

  • よりシンプルな依存関係管理
  • デフォルトの自動構成
  • 組み込みWebサーバー
  • アプリケーションメトリクスとヘルスチェック
  • 高度な外部構成

2. Spring Bootスターター

まず、新しい依存関係のセットが必要になります。 Spring Bootは、便利なスターター依存関係を提供します。これは、特定の機能に必要なすべてのテクノロジーを取り込むことができる依存関係記述子です。

これらには、依存関係ごとにバージョンを指定する必要がなくなるという利点がありますが、代わりに、スターターが依存関係を管理できるようにします。

開始する最も簡単な方法は、 spring-boot-starter-parent pom.xml:を追加することです。

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

これにより、依存関係の管理が行われます。

移行する機能に応じて、次のセクションでさらにいくつかのスターターについて説明します。 参考までに、スターターの完全なリストはここにあります。

より一般的な注意として、 SpringBootによっても管理されている明示的に定義された依存関係バージョンを削除する必要があります。 そうでない場合、定義されたバージョンとBootで使用されるバージョンとの間に非互換性が発生する可能性があります。

3. アプリケーションエントリポイント

Spring Boot を使用して構築された各アプリケーションは、メインのエントリポイントを定義する必要があります。 これは通常、 main メソッドを持つJavaクラスであり、@SpringBootApplicationで注釈が付けられています。

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

@SpringBootApplication アノテーションは、次のアノテーションを追加します。

  • @Configuration –クラスをBean定義のソースとしてマークします
  • @EnableAutoConfiguration –クラスパスへの依存関係に基づいてBeanを自動的に追加するようにフレームワークに指示します
  • @ComponentScan Applicationクラス以下と同じパッケージ内の他の構成とBeanをスキャンします

デフォルトでは、@ SpringBootApplicationアノテーションは、同じパッケージ以下のすべてのクラスをスキャンします。したがって、便利なパッケージ構造は次のようになります。

アプリケーションがApplicationContextを作成する非Webアプリケーションである場合、このコードを削除して、上記の@SpringBootApplicationクラスに置き換えることができます。

発生する可能性のある問題には、競合する複数の構成クラスがあります。 これを回避するために、スキャンされるクラスをフィルタリングする可能性があります。

@SpringBootAppliaction
@ComponentScan(excludeFilters = { 
  @ComponentScan.Filter(type = FilterType.REGEX, 
  pattern = "com.baeldung.config.*")})
public class Application {
    //...
}

4. 構成とコンポーネントのインポート

Spring Boot は、構成のアノテーションに大きく依存していますが、既存の構成をアノテーションとXML形式の両方でインポートすることもできます。

既存の@Configurationまたはコンポーネントクラスを選択するには、次の2つのオプションがあります。

  • 既存のクラスを、メインのApplicationクラスパッケージと同じかそれより下のパッケージに移動します
  • クラスを明示的にインポートする

クラスを明示的にインポートするには、メインクラスで@ComponentScanまたは@Importアノテーションを使用できます。

@SpringBootApplication
@ComponentScan(basePackages="com.baeldung.config")
@Import(UserRepository.class)
public class Application {
    //...
}

公式ドキュメントでは、XML構成よりも注釈を使用することを推奨しています。 ただし、Java構成に変換したくないXMLファイルが既にある場合は、@ImportResourceを使用してこれらをインポートできます。

@SpringBootApplication
@ImportResource("applicationContext.xml")
public class Application {
    //...
}

5. アプリケーションリソースの移行

デフォルトでは、 SpringBootは次のいずれかの場所でリソースファイルを検索します。

  • /資力
  • /公衆
  • /静的
  • / META-INF / resources

移行するには、すべてのリソースファイルをこれらの場所のいずれかに移動するか、spring.resources.static-locationsプロパティを設定してリソースの場所をカスタマイズできます。

spring.resources.static-locations=classpath:/images/,classpath:/jsp/

6. アプリケーションプロパティの移行

フレームワークは、次のいずれかの場所に配置されたapplication.propertiesまたはapplication.ymlというファイルで定義されたプロパティを自動的にロードします。

  • 現在のディレクトリの/configサブディレクトリ
  • 現在のディレクトリ
  • クラスパス上の/configディレクトリ
  • クラスパスルート

プロパティを明示的にロードしないようにするために、これらの場所の1つにあるこの名前のファイルにプロパティを移動できます。 たとえば、クラスパスに存在する必要がある /resourcesフォルダーに移動します。

application- {profile}.propertiesというファイルからプロファイル固有のプロパティを自動的にロードすることもできます。

また、さまざまなアプリケーションの動作を構成するために、多数の事前定義されたプロパティ名を使用できます。

アプリケーションで使用する各Springフレームワークモジュールは、主に構成に関連して、わずかな変更が必要になります。 最も一般的に使用される機能のいくつかを見てみましょう。

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

7.1. Webスターター

Spring Boot は、必要なすべての依存関係をもたらすWebアプリケーションのスターターを提供します。 これは、SpringフレームワークからすべてのWeb固有の依存関係を削除し、それらをspring-boot-starter-webに置き換えることができることを意味します。

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

Spring Boot は、クラスパスに基づいて可能な限りアプリケーションを自動構成しようとするため、この依存関係を追加すると、メインのApplicationアノテーションに@EnableWebMvcアノテーションが追加されます。 ]クラス、およびDispatcherServletBeanのセットアップ。

DispatcherServletを設定するWebApplicationInitializerクラスがある場合、これは不要になり、@EnableWebMvcアノテーションも不要になります。

もちろん、カスタム動作が必要な場合はBeanを定義できます。その場合、Beanが使用されます。

@Configurationクラスで@EnableWebMvcアノテーションを明示的に使用すると、MVC自動構成は有効になりません。

Webスターターを追加すると、次のBeanの自動構成も決定されます。

  • / static / public / resources 、または / META-INF /resourcesというディレクトリから静的コンテンツを提供するためのサポートクラスパス
  • HttpMessageConverterJSONやXMLなどの一般的なユースケースのBean
  • すべてのエラーを処理する/errorマッピング

7.2. テクノロジーを見る

Webページの構築に関しては、公式ドキュメントでは、JSPファイルを使用せず、代わりにテンプレートエンジンを使用することを推奨しています。 自動構成は、 Thymeleaf Groovy FreeMarker Mustacheに含まれています。 それらの1つを使用するために必要なのは、特定のスターターを追加することだけです。

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

テンプレートファイルは、 / resources /templatesフォルダーに配置する必要があります。

JSPファイルを引き続き使用する場合は、JSPを解決できるようにアプリケーションを構成する必要があります。 たとえば、ファイルが / webapp / WEB-INF / views にある場合、次のプロパティを設定する必要があります。

spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp

7.3. 組み込みWebサーバー

また、組み込みのTomcatサーバーを使用してアプリケーションを実行することもできます。このサーバーは、 spring-boot-starter-tomcat 依存関係を追加することにより、ポート8080で自動構成されます。

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

Spring Boot が自動構成を提供する他のWebサーバーは、JettyおよびUndertowです。

8. SpringSecurityアプリケーションを移行する

SpringSecurityを有効にするためのスターターはspring-boot-starter-securityです。

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

デフォルトでは、これにより、起動時にランダムに生成されたパスワードが記録された「user」というユーザーが作成され、基本認証ですべてのエンドポイントが保護されます。 ただし、通常、デフォルトとは異なるセキュリティ構成を追加する必要があります。

このため、 WebSecurityConfigurerAdapter を拡張し、カスタム構成を定義する@EnableWebSecurityで注釈を付けた既存のクラスを保持します。

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    // ...
}

9. Springデータアプリケーションを移行する

使用しているSpringData の実装に応じて、対応するスターターを追加する必要があります。 たとえば、JPAの場合、spring-boot-starter-data-jpa依存関係を追加できます。

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

インメモリデータベースを使用する場合は、タイプ H2 Derby 、およびHSQLDBのデータベースに対応する依存関係対応の自動構成を追加します。

たとえば、 H2 インメモリデータベースを操作するには、h2の依存関係だけが必要です。

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
</dependency>

MySQL データベースなど、別のデータベースタイプと構成で作業する場合は、構成を定義するだけでなく、依存関係も必要です。

このために、 DataSource Bean定義を保持するか、事前定義されたプロパティを利用することができます。

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/myDb?createDatabaseIfNotExist=true
spring.datasource.username=user
spring.datasource.password=pass

Spring Boot は、HibernateをデフォルトのJPAプロバイダーおよびtransactionManagerBeanとして自動構成します。

10. 結論

この記事では、既存のSpringアプリケーションを新しい SpringBootフレームワークに移行するときに発生する一般的なシナリオをいくつか示しました。

全体として、移行時のエクスペリエンスは、もちろん、構築したアプリケーションに大きく依存します。