SpringからSpring Bootへの移行
1. 概要
この記事では、既存のSpring FrameworkアプリケーションをSpring Bootアプリケーションに移行する方法を見ていきます。
Spring Boot is not intended to replace Spring, but to make working with it faster and easier.その結果、アプリケーションの移行に必要な変更のほとんどは構成に関連しています。 ほとんどの場合、カスタムコントローラーと他のコンポーネントは同じままです。
Spring Bootを使用して開発すると、いくつかの利点があります。
-
より簡単な依存関係管理
-
デフォルトの自動設定
-
組み込みWebサーバー
-
アプリケーションメトリックとヘルスチェック
-
高度な外部設定
2. Spring Bootスターター
まず、新しい依存関係のセットが必要になります。 特定の機能に必要なすべてのテクノロジーを取り込むことができるSpring Boot provides convenient starter dependencies, which are dependency descriptors。
これらには、依存関係ごとにバージョンを指定する必要がなくなり、代わりにスターターが依存関係を管理できるという利点があります。
開始する最も簡単な方法は、spring-boot-starter-parentpom.xml:を追加することです。
org.springframework.boot
spring-boot-starter-parent
1.5.6.RELEASE
これにより、依存関係の管理が行われます。
移行する機能に応じて、次のセクションでさらにいくつかのスターターについて説明します。 参考までに、スターターhereの完全なリストを見つけることができます。
より一般的な注意として、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 –Applicationクラス以下と同じパッケージ内の他の構成およびBeanをスキャンします
By default, the @SpringBootApplication annotation scans all classes in the same package or below.したがって、便利なパッケージ構造は次のようになります。
アプリケーションがApplicationContextを作成する非Webアプリケーションである場合、このコードを削除して、上記の@SpringBootApplicationクラスに置き換えることができます。
発生する可能性のある問題には、競合する複数の構成クラスがあります。 これを回避するために、スキャンされるクラスをフィルタリングする可能性があります。
@SpringBootAppliaction
@ComponentScan(excludeFilters = {
@ComponentScan.Filter(type = FilterType.REGEX,
pattern = "com.example.config.*")})
public class Application {
//...
}
4. 構成とコンポーネントのインポート
Spring Bootは構成の注釈に大きく依存していますが、既存の構成を注釈とXML形式の両方でインポートすることもできます。
既存の@Configurationまたはコンポーネントクラスを取得するには、次の2つのオプションがあります。
-
既存のクラスを、メインのApplicationクラスパッケージと同じかそれより下のパッケージに移動します
-
クラスを明示的にインポートする
メインクラスのTo import the classes explicitly, you can use the @ComponentScan or @Import annotations:
@SpringBootApplication
@ComponentScan(basePackages="com.example.config")
@Import(UserRepository.class)
public class Application {
//...
}
公式ドキュメントでは、XML構成よりも注釈を使用することを推奨しています。 ただし、Java構成に変換したくないXMLファイルが既にある場合は、@ImportResourceを使用してこれらをインポートできます。
@SpringBootApplication
@ImportResource("applicationContext.xml")
public class Application {
//...
}
5. アプリケーションリソースの移行
デフォルトでは、Spring Bootは次のいずれかの場所でリソースファイルを検索します。
-
/ resources
-
/パブリック
-
/静的
-
/META-INF/resources
移行するには、すべてのリソースファイルを次のいずれかの場所に移動するか、spring.resources.static-locationsプロパティを設定してリソースの場所をカスタマイズします。
spring.resources.static-locations=classpath:/images/,classpath:/jsp/
6. アプリケーションプロパティの移行
フレームワークは、次のいずれかの場所に配置されたapplication.propertiesまたはapplication.ymlというファイルで定義されたプロパティを自動的にロードします。
-
現在のディレクトリの/configサブディレクトリ
-
現在のディレクトリ
-
クラスパス上の/configディレクトリ
-
クラスパスのルート
プロパティを明示的にロードしないようにするには、これらの場所のいずれかでこの名前のファイルにプロパティを移動します。 たとえば、クラスパスに存在する必要がある/resourcesフォルダーに移動します。
application-{profile}.propertiesというファイルからプロファイル固有のプロパティを自動的にロードすることもできます。
また、さまざまなアプリケーションの動作を構成するために、多数のpredefined property namesを使用できます。
アプリケーションで使用する各Springフレームワークモジュールには、主に設定に関連するわずかな変更が必要です。 最も一般的に使用される機能のいくつかを見てみましょう。
7. SpringWebアプリケーションを移行する
7.1. Webスターター
Spring Bootは、必要なすべての依存関係をもたらすWebアプリケーションのスターターを提供します。 これは、SpringフレームワークからすべてのWeb固有の依存関係を削除し、それらをspring-boot-starter-webに置き換えることができることを意味します。
org.springframework.boot
spring-boot-starter-web
Spring Bootは、クラスパスに基づいて可能な限りアプリケーションを自動構成しようとするため、この依存関係を追加すると、@EnableWebMvcアノテーションがメインのApplicationクラスに追加され、セットアップされます。 DispatcherServletBean。
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、Mustache。 それらのいずれかを使用するために必要なことは、特定のスターターを追加することだけです。
org.springframework.boot
spring-boot-starter-thymeleaf
テンプレートファイルは/resources/templatesフォルダに配置する必要があります。
JSPファイルを引き続き使用する場合は、JSPを解決できるようにアプリケーションを構成する必要があります。 たとえば、ファイルが/webapp/WEB-INF/viewsにある場合、次のプロパティを設定する必要があります。
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
7.3. 組み込みWebサーバー
また、spring-boot-starter-tomcat依存関係を追加することにより、ポート8080で自動構成される組み込みTomcatサーバーを使用してアプリケーションを実行することもできます。
org.springframework.boot
spring-boot-starter-tomcat
Spring Bootが自動構成を提供する他のWebサーバーは、JettyとUndertowです。
8. SpringSecurityアプリケーションを移行する
Spring Securityを有効にするためのスターターはspring-boot-starter-securityです。
org.springframework.boot
spring-boot-starter-security
デフォルトでは、これにより、「user」と呼ばれるユーザーが作成され、起動時にランダムに生成されたパスワードが記録され、すべてのエンドポイントが基本認証で保護されます。 ただし、通常はデフォルトとは異なるセキュリティ構成を追加します。
このため、WebSecurityConfigurerAdapterを拡張し、カスタム構成を定義する@EnableWebSecurityで注釈を付けた既存のクラスを保持します。
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
// ...
}
9. SpringDataアプリケーションを移行する
使用しているSpring Dataの実装に応じて、対応するスターターを追加する必要があります。 たとえば、JPAの場合、spring-boot-starter-data-jpa依存関係を追加できます。
org.springframework.boot
spring-boot-starter-data-jpa
インメモリデータベースを使用する場合は、タイプH2、Derby、およびHSQLDBのデータベースに対応する依存関係対応の自動構成を追加します。
たとえば、H2インメモリデータベースを操作するために必要なのは、h2の依存関係だけです。
com.h2database
h2
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アプリケーションを新しいSpring Bootフレームワークに移行するときに遭遇するいくつかの一般的なシナリオを示しました。
概して、移行時の経験はもちろん、構築したアプリケーションに大きく依存します。