Beanを登録するためのアノテーション
Spring BootにおいてBean定義は、既存のサービスなどの設定でもあり、今回のAPI部分の実装などのロジックの実装でもあります。そのため、どのようなBean定義をしているのかを理解することは大変重要になります。
また、Bean定義をする際にはアノテーションを利用するので、どのようなアノテーションを使えばよいのか知る必要があります。
アノテーションは用途別に大きく分類され、また、各用途に応じて上書きするアノーテションが作られています。
例えば、サンプルアプリケーションで利用しているBean定義のためのアノテーションの構造は3のようになっています。
Bean定義に利用されるアノテーションは、表2に示すorg.springframework.stereotypeに定義してあるものが最も基本です。基本的にはこれらのアノテーションに機能的な違いはなく、管理上の慣習として使い分けが行われています。
ただし、例外的にSpring MVCやSpring Dataなどのサブプロジェクトによっては特別な機能を持つクラスとして扱われる場合もあります。
| アノーテーション | 概要 |
|---|---|
| @Component | DIコンテナにBeanとして登録するための最も基本的なアノテーションです。 |
| @Configuration | Bean定義をJavaベースで行うためのアノテーションです。 |
| @Repository | データの保存や読み込みなどを扱うためのクラスを示すアノテーションです。Spring Dataなど使いデータベースを利用する場合には、このアノテーションを指定することで自動的にテーブルにアクセスできるようにするなど、特別な意味を持つケースがあります。 |
| @Controller | MVCのコントローラクラスであることを示すアノテーションです。Spring MVCを使うWEBアプリケーションでは、このアノテーションを指定することでWebからのリクエストを処理するためのクラスとして利用されます。 |
| @Service | ビジネスロジックなどを扱うためのクラスを示すアノテーションです。 |
そして、各サブプロジェクトで特別なものとして、これらのアノーテーションを上書きして別のアノテーションが定義されます。例えば、サンプルアプリケーションでは表3のアノテーションを使っています。
| アノーテーション | 概要 |
|---|---|
| @SpringBootApplication | Spring Bootのアプリケーションのmainプログラムを指定するための慣習として利用されるアノテーションです。 |
| @RestController | REST用のコントローラとして登録するためのアノテーション。 |
| @RestControllerAdvice | 各コントローラで共通の入力データ形式の変換やエラー処理などの共通処理を定義するためのアノテーションです。 |
どんなアノテーションを利用すればよいのかといった情報は、公式ドキュメントなどを丁寧に読んでいけばわかりますが、実際には非常に大変です。
一方で、それぞれのSpringのサブプロジェクトにはどのようなアノテーションがあり、また、どのような意味を持つのか一覧として参照できる情報もありません。
そのため、網羅的にアノテーションの内容について理解することはなかなか大変な作業です。ただし、慣れてくれば利用するアノテーションはおおよそ同じものを使うことになるでしょう。
その際に、多少わからないアノテーションなどに遭遇した場合でも、よく利用されるアノテーションのセットであることが多いのでアノテーション内のコードを参照する方が早いでしょう。
例えば、@RestControllerのコードを参照すると、リスト4のようになっています。これらのコードより、@ControllerとしてのBean定義であり、@ResponseBodyも同時に定義したアノテーションであることがわかります。
package org.springframework.web.bind.annotation;
// (省略)
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
// (省略)
}
また、同一パッケージ内に同じ利用シーンで使われる別のアノテーションなども定義してあるので、これらのJavaDoc情報などを参照にすれば、どのようなアノテーションが他にあるのかなどもわかります。
Bean定義のインスタンスを利用する
Bean定義したクラスのインスタンスにアクセスする際には、@Autowiredというアノテーションを利用します。また、そのサンプルコードがリスト5です。
@RestController // (1)Bean定義である指定
@Scope("request")
@RequestMapping("/contact")
public class ContactController {
@Autowired // (2)Bean定義されたオブジェクトを利用する
ContactRepository contactRepository;
// : 省略
}
(1)は、先ほど紹介したBean定義をしているアノテーションです。(2)のように@Autowiredの指定をすればどのクラスでも利用できるわけではなく、必ず、利用する際にはBean定義されているクラス内でのみ利用できます。
従って、自分でnewによって作成したオブジェクトの場合には自分で設定しなければいけません。
設定ファイルを理解する
ある程度大きなアプリケーションを作成していると、必ずと言ってよいほど外部の設定から値を読む必要が発生します。
また、Spring Bootでは既存のミドルウェアの設定の変更がBean定義からも可能ですが、環境に依存する部分などは設定ファイルからも変更できるようになっています。
しかし、Spring Bootを使う上でアノテーションと同様にどのような設定項目があるのか知ることもなかなか難しいです。
今回、サンプルアプリケーションのために用意したリスト6の内容から設定がどのように行われているのかを理解していきましょう。
また、設定ファイルはデフォルトではクラスパス上のapplication.propertiesファイルからデータを取得します。
ただし、それ以外にもさまざまな方法が用意されていますので、より詳しく知りたい場合には、リファレンスを参考にしてください。
# サンプルアプリケーション内のコードで利用している設定 app.web.prefix = /web app.web.resource = classpath:/static/ # httpのサーバポートの指定 server.port = 8081 # JDBCの設定 spring.datasource.driver-class-name=org.h2.Driver spring.datasource.url=jdbc:h2:mem:contacts spring.datasource.username=h2user spring.datasource.password= # (省略)
