SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Spring Bootで作るマイクロサービス

Spring Bootで使われる基本的なアノーテーションと設定の仕組み

Spring Bootで作るマイクロサービス 第3回


Beanを登録するためのアノテーション

 Spring BootにおいてBean定義は、既存のサービスなどの設定でもあり、今回のAPI部分の実装などのロジックの実装でもあります。そのため、どのようなBean定義をしているのかを理解することは大変重要になります。

 また、Bean定義をする際にはアノテーションを利用するので、どのようなアノテーションを使えばよいのか知る必要があります。

 アノテーションは用途別に大きく分類され、また、各用途に応じて上書きするアノーテションが作られています。

 例えば、サンプルアプリケーションで利用しているBean定義のためのアノテーションの構造は3のようになっています。

図3:サンプルアプリケーションで利用しているアノテーションの構造
図3:サンプルアプリケーションで利用しているアノテーションの構造

 Bean定義に利用されるアノテーションは、表2に示すorg.springframework.stereotypeに定義してあるものが最も基本です。基本的にはこれらのアノテーションに機能的な違いはなく、管理上の慣習として使い分けが行われています。

 ただし、例外的にSpring MVCやSpring Dataなどのサブプロジェクトによっては特別な機能を持つクラスとして扱われる場合もあります。

表2:SpringフレームワークでBean定義のために使用する基本アノテーション
アノーテーション 概要
@Component DIコンテナにBeanとして登録するための最も基本的なアノテーションです。
@Configuration Bean定義をJavaベースで行うためのアノテーションです。
@Repository  データの保存や読み込みなどを扱うためのクラスを示すアノテーションです。Spring Dataなど使いデータベースを利用する場合には、このアノテーションを指定することで自動的にテーブルにアクセスできるようにするなど、特別な意味を持つケースがあります。
@Controller  MVCのコントローラクラスであることを示すアノテーションです。Spring MVCを使うWEBアプリケーションでは、このアノテーションを指定することでWebからのリクエストを処理するためのクラスとして利用されます。
@Service  ビジネスロジックなどを扱うためのクラスを示すアノテーションです。

 そして、各サブプロジェクトで特別なものとして、これらのアノーテーションを上書きして別のアノテーションが定義されます。例えば、サンプルアプリケーションでは表3のアノテーションを使っています。

表3:サンプルアプリケーションで利用している個別のアノテーション
アノーテーション  概要 
@SpringBootApplication  Spring Bootのアプリケーションのmainプログラムを指定するための慣習として利用されるアノテーションです。
@RestController  REST用のコントローラとして登録するためのアノテーション。
@RestControllerAdvice  各コントローラで共通の入力データ形式の変換やエラー処理などの共通処理を定義するためのアノテーションです。

 どんなアノテーションを利用すればよいのかといった情報は、公式ドキュメントなどを丁寧に読んでいけばわかりますが、実際には非常に大変です。

 一方で、それぞれのSpringのサブプロジェクトにはどのようなアノテーションがあり、また、どのような意味を持つのか一覧として参照できる情報もありません。

 そのため、網羅的にアノテーションの内容について理解することはなかなか大変な作業です。ただし、慣れてくれば利用するアノテーションはおおよそ同じものを使うことになるでしょう。

 その際に、多少わからないアノテーションなどに遭遇した場合でも、よく利用されるアノテーションのセットであることが多いのでアノテーション内のコードを参照する方が早いでしょう。

 例えば、@RestControllerのコードを参照すると、リスト4のようになっています。これらのコードより、@ControllerとしてのBean定義であり、@ResponseBodyも同時に定義したアノテーションであることがわかります。

[リスト4]@RestControllerのコード
package org.springframework.web.bind.annotation;
// (省略)
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
  // (省略)
}

 また、同一パッケージ内に同じ利用シーンで使われる別のアノテーションなども定義してあるので、これらのJavaDoc情報などを参照にすれば、どのようなアノテーションが他にあるのかなどもわかります。

Bean定義のインスタンスを利用する

 Bean定義したクラスのインスタンスにアクセスする際には、@Autowiredというアノテーションを利用します。また、そのサンプルコードがリスト5です。

[リスト5]@Autowiredの利用例(java/src/main/java/com/coltware/contacts/controller/ContactController.javaの抜粋)
@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ファイルからデータを取得します。

 ただし、それ以外にもさまざまな方法が用意されていますので、より詳しく知りたい場合には、リファレンスを参考にしてください。

[リスト6]設定ファイルの内容
# サンプルアプリケーション内のコードで利用している設定
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=

# (省略)

次のページ
設定ファイルの値を個別にコード内の変数にマッピングする

この記事は参考になりましたか?

Spring Bootで作るマイクロサービス連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 小林 昌弘(コバヤシ マサヒロ)

WINGSプロジェクト について> 有限会社 WINGSプロジェクト が運営する、テクニカル執筆コミュニティ(代表 ...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/11509 2020/06/01 18:57

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー