1概要

この記事では、既存のSpring Frameworkアプリケーションを

Spring Boot

アプリケーションに移行する方法について説明します。


  • Spring Boot

    はSpringに代わるものではありませんが、Springを迅速かつ容易に使用するためのものです。ほとんどの場合、私たちのカスタムコントローラと他のコンポーネントは変わりません。


Spring Boot

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

  • より簡単な依存関係管理

  • デフォルトの自動設定

  • 内蔵Webサーバー

  • アプリケーションメトリクスとヘルスチェック

  • 高度な外部設定


2

スプリングブーツ

スターター

まず、新しい依存関係が必要です。


Spring Boot

は便利なスターター依存関係を提供します。これは依存関係記述子

であり、特定の機能に必要なすべてのテクノロジーを取り込むことができます。

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

最も手早く始める方法はhttps://search.maven.org/classic/#search%7Cga%7C1%7Ca%3A%22spring-boot-starter-parent%22

pom.xml:

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

これは依存関係管理の面倒を見ます。

どの機能を移行するかに応じて、次のセクションでさらにいくつかのスターターについて説明します。参考のために、あなたはスターターの完全なリストhttps://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-starters[ここ]を見つけることができます。

  • より一般的な注意として、

    Spring Boot

    によっても管理されている明示的に定義された依存関係バージョンを削除したいと思います。そうでなければ、私達は私達の定義されたバージョンとBootによって使用されるものの間に非互換性があるかもしれません。


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


Spring Boot

を使用して構築された各アプリケーションは、メインエントリポイントを定義する必要があります。これは通常、

@ SpringBootApplication

というアノテーションが付けられた

main

メソッドを持つJavaクラスです。

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


@ SpringBootApplication

アノテーションは以下のアノテーションを追加します:


  • @ Configuration

    – クラスをBeanのソースとしてマーク

定義
**

@ EnableAutoConfiguration

– フレームワークにBeanの追加を指示します

クラスパスへの依存関係に自動的に基づく
**

@ ComponentScan

– 他の設定とBeanを検索します。


Application

クラス以下と同じパッケージ

  • デフォルトでは、

    @ SpringBootApplication

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

リンク:/uploads/package.png[]

アプリケーションが

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アプリケーションリソースの移行

デフォルトでは、

Spring Boot

は次のいずれかの場所でリソースファイルを探します。


  • /resources


  • /public


  • /static


  • /META-INF/resources

移行するには、すべてのリソースファイルを次のいずれかの場所に移動するか、

spring.resources.static-locations

プロパティを設定してリソースの場所をカスタマイズします。

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

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

フレームワークは自動的にこれらの場所の1つに置かれた__application.properties__または__application.yml__と呼ばれるファイルで定義されたすべてのプロパティをロードします:

** 現在のディレクトリの__/config__サブディレクトリ

** 現在のディレクトリ

** クラスパス上の__/config__ディレクトリ

** クラスパスルート

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

__application  -  \ {profile} .properties__というファイルからプロファイル固有のプロパティを自動的に読み込むこともできます。

また、さまざまなアプリケーション動作を設定するために多数のhttps://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html[定義済みプロパティ名]を使用できます。

アプリケーションで使用する各Springフレームワークモジュールは、主に設定に関連して、わずかな変更を必要とします。

最もよく使われる機能のいくつかを見てみましょう。

===  **  7.  Spring Webアプリケーションを移行する**

====  **  7.1.  Webスターター**

__Spring Boot__は、必要なすべての依存関係を取り込むWebアプリケーションのスターターです。つまり、SpringフレームワークからWeb固有の依存関係をすべて削除し、それらをhttps://search.maven.org/classic/#search%7Cga%7C1%7Ca%3A%22spring-boot-starter-web%に置き換えることができます22%20AND%20g%3A%22org.springframework.boot%22[__spring-boot-starter-web__]:

[source,xml,gutter:,true]

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

__Spring Boot__はクラスパスに基づいて可能な限りアプリケーションを自動設定しようとするので、この依存関係を追加すると、__DispatcherServlet__ Beanを設定するだけでなく、メインの__Application__クラスに__ @ EnableWebMvc__アノテーションが追加されます。

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

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

**  __ @ Configuration__クラスで__ @ EnableWebMvc__アノテーションを明示的に使用すると、MVCの自動設定は無効になります。

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

**  __/static__というディレクトリから静的コンテンツを提供するためのサポート。

クラスパスの__/public__、__/resources__、または__/META-INF/resources__
JSONやXMLなどの一般的なユースケース用の**  __HttpMessageConverter__ Bean

** すべてのエラーを処理する__/error__マッピング

====  **  7.2. テクノロジを見る**

Webページの構築に関しては、公式文書ではJSPファイルを使用せず、代わりにテンプレートエンジンを使用することを推奨しています。

自動設定は、次のテンプレートエンジンに含まれています。

__Thymeleaf__、__Groovy__、__FreeMarker__、__口ひげ__。そのうちの1つを使用するために必要なのは、特定のスターターを追加することだけです。

[source,xml,gutter:,true]

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

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

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

[source,java,gutter:,true]

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

====  **  7.3. 内蔵Webサーバー**

また、https://search.maven.org/classic/#search%7Cga%7C1%7Ca%3A%22springを追加することでポート8080で自動設定される組み込みTomcatサーバーを使用してアプリケーションを実行することもできます。 -boot-starter-tomcat%22%20AND%20g%3A%22org.springframework.boot%22[__spring-boot-starter-tomcat__]依存関係:

[source,xml,gutter:,true]

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

__Spring Boot__が自動設定を提供する他のWebサーバーは__Jetty__と__Undertow__です。

===  **  8 Spring Securityアプリケーションを移行する**

Spring Securityを有効にするためのスターターはhttps://search.maven.org/classic/#search%7Cga%7C1%7Ca%3A%22spring-boot-starter-security%22%20AND%20g%3A%22org.springframeworkです。 boot%22[__spring-boot-starter-security__]:

[source,xml,gutter:,true]

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

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

このため、既存のクラスに__WebSecurityConfigurerAdapter__を拡張してカスタム設定を定義する__ @ EnableWebSecurity__のアノテーションを付けたままにします。

[source,java,gutter:,true]

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
//…​
}

===  **  9 Spring Dataアプリケーションを移行する**

どのSpring Data実装を使用しているかに応じて、対応するスターターを追加する必要があります。たとえば、JPAの場合は、https://search.maven.org/classic/#search%7Cga%7C1%7Ca%3A%22spring-boot-starter-data-jpa%22%20AND%20g%3A %22org.springframework.boot%22[__spring-boot-starter-data-jpa__]依存関係:

[source,xml,gutter:,true]

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

インメモリデータベースを使用する場合は、対応する依存関係を追加することで、タイプ__H2__、__Derby__、および__HSQLDB__のデータベースの自動設定が有効になります。

たとえば、__H2__インメモリデータベースを操作するには、https://search.maven.org/classic/#search%7Cga%7C1%7Ca%3A%22h2%22%20AND%20g%3Aが必要です。 %22com.h2database%22[h2]依存関係:

[source,xml,gutter:,true]

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

__MySQL__データベースのように、異なるデータベースの種類と設定で作業したい場合は、設定を定義するだけでなく、依存関係も必要です。

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

[source,text,gutter:,true]

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プロバイダとして、そして__transactionManager__ beanとして自動設定します。

===  **  10結論**

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

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