
【Spring】便利なアノテーションについて知ろう①
Java開発でフレームワークを使用する際、Springが選ばれることが多いと感じます。
Springで特徴的なのはアノテーションという@を使った記載になります。
そのアノテーションにはどういったものがあるか、どういった意味になるのかを調べてまとめてみました。
1. Springとは
まず一口にSpringといっても「Spring Framework」と「Spring Boot」が存在します。
それぞれの特徴や違いは以下になります。
1.Spring Framework
Spring Frameworkは、Rod Johnsonによって2003年6月に初めてリリースされた、Javaプラットフォーム上で動作するオープンソースのアプリケーションフレームワークになります。
Spring Frameworkは、軽量でモジュール化されたJava EEアプリケーションの開発に適しています。
Spring Frameworkには、DI(Dependency Injection)機能、AOP(Aspect Oriented Programming)機能、MVCフレームワーク、ORM(Object-Relational Mapping)フレームワークなど、様々な機能が提供されています。
これらの機能を使用することで、容易にJavaアプリケーションの開発やテストを実施することができます。
2.Spring Boot
Spring BootはSpring Frameworkの欠点である、機能の使い分けを解消するために作られたフレームワークです。
主な機能として、複数のフレームワークを使用する際に発生する、Bean定義やXML設定などを、可能な限り自動設定する機能が搭載されています。
このほか、コードを書かなくてもプログラムの処理が実行できるよう、Javadocと同じくアノテーション(注釈)が記述できる点も特徴です。
このSpring bootは、Spring MVCと呼ばれる別のフレームワークの仕様を踏襲して作られており、Spring Frameworkを構成するフレームワークの1つとして組み込まれています。
2. アノテーションとは

「アノテーション」は直訳すると「注釈・注記」になります。
Java開発でのアノテーションはコードに注釈として補足を加えることで、プログラムの動作を変更したり、開発時のルールを統一できたり、フレームワークに処理を指示したりできる仕組みです。
アノテーションには以下の種類が存在します。
1.マーカーアノテーション
文字通りクラスやメソッドなどに印を付けるために使うアノテーションです。データを持たせることはできないです。
2.単一値アノテーション
1つのデータを持つアノテーションです。メソッド名にはvalueという名前をつけるのが一般的な慣習になります。
3.フルアノテーション
複数(少なくとも二つ以上)のデータを持つアノテーションです。
4.メタアノテーション
アノテーションに付与するアノテーションです。アノテーションを独自で作る際に、保持や継承のルール等を定義できます。
3. アノテーションを使うメリットデメリット
1.アノテーションを使うメリット
・コード量の減少
・可読性の向上
2.アノテーションを使うデメリット
・どのアノテーションを使用したら良いか判断がつかない
・すべて覚える必要はないにしても学習コストがかかる
4. 便利なアノテーション一覧
1.【DIに関するアノテーション】
・@Autowired使いたいクラスをインスタンス化し、変数に設定してくれるアノテーションです。
・@Component
DIコンテナにBeanとして登録され、@Autowiredが付与されたフィールドにインスタンスが注入されます。
・@Controller
クライアントとのデータ入出力を制御する(画面からHTTPリクエストを受け付ける)クラスに付与します。
・@Service
業務ロジックを提供するクラスに付与します。
・@Repository
データベースとのやりとりを行うクラスに付与します。
・@Configuration
アノテーションを使ってのDIコンテナへのBean登録が複雑な場合、JavaConfigと呼ばれるBeanを生成するクラスを作成します。そのJavaConfigに付与するアノテーションです。
・@Bean
@Configurationが付与されたJavaConfig内のインスタンスを生成するメソッドに付与するアノテーションです。
<実装例>
@Configuration
public class TeatConfig {
// TestComponentクラスをDIコンテナに登録する
@Bean
public TestComponent testComponent() {
return new TestComponent();
}
}
・@Scope
インスタンスの生成・破棄のタイミングを指定するアノテーションです。
<実装例>
@Controller
// HTTPリクエストが送られてくるたびにインスタンスが生成される
@Scope("request")
public class Sample {
…
}
・@Primary
優先的にDIを行いたいクラスに付与するアノテーションです。
2.【Controllerに関するアノテーション】
・@RestControllerREST API 用のControllerクラスに付与するアノテーションです。
クラスにつけることでそのクラス内のメソッドの戻り値がHTTPのレスポンスボディとして返されます。
・@RequestMapping
リクエストURLに対して、どのクラス・メソッドが処理を実行するか定義するアノテーションです。クラスあるいはメソッドに付与します。
GET・POSTといったHTTPメソッドを指定する「method」属性とURLのパスを指定する「value」属性を指定できます。
<実装例>
// GETで"http://localhost:8080/sample" にアクセスすると、このメソッドが実行される
@RequestMapping(value = "sample", method = RequestMethod.GET)
public String sample() {
return "sample";
}
・@GetMapping
@RequestMappingのGETリクエスト用アノテーションです。
・@PostMapping
@RequestMappingのPOSTリクエスト用アノテーションです。
・@RequestParam
URLに含まれるクエリパラメータや、リクエストボディに含まれるパラメータを受け取るために使用するアノテーションです。
下記属性を指定できます。
name属性・value属性:リクエストパラメータを指定します。nameとvalueの役割に違いはありません。
required属性:パラメータはデフォルトでは必須になるため、パラメータの指定を任意にする場合、falseを指定します。
defaultValue属性:リクエストパラメータが指定されなかった時のデフォ