【Java】Springフレームワークのアノテーションについて

ということで職場のコードを見るときに、Springのアノテーションを調べていたので、備忘録を残しておきます。

Springにおけるアノテーションの役割


Javaフレームワークを使用してアプリを作る場合、データ・ファイルを連携するために設定情報を記述する必要があります。


1つの方法として設定ファイルに記述するというのもありますが、設定ファイルに記述するとSpringの場合は設定ファイルが多くて分かりづらいのでこれ以上は増やしたくはありません。


Spinrgの場合は、ソースコード内のアノテーションを利用してデータ・ファイルを連携させる情報を記述させます。


@Autowired

インスタンス変数の前にこの@Autowiredアノテーションを付けておくと、@Componentアノテーションのついたクラスから該当するクラスをnewしてインスタンスを入れてくれる。

■TestAnnotationController.java

@Controller
public class TestAnnotationController {
   @Autowired
   private TestAnnotation testannotation;

}


■TestAnnotation.java

@Service
public class TestAnnotation {
   ...略
}


@Componentアノテーションはそのまま使われることは基本ありません。


@Controllerまたは@Serviceまたは@Repositoryが使われます。


TestAnnotationController.javaのtestannotationインスタンスには、@Component(Controller,Service,Repository)アノテーションが付いているクラスの中からTestAnnotationクラスを探し出して、newしてインスタンスを入れてくれます。


このような仕組みを依存性の注入といいます。
※DI(Dependency Injection)と略されます。


シンプルにまとめれば、記述するだけで他のクラスを呼び出すことができる。


このアノテーションを使わない場合は、毎回newをすることになる。

@ModelAttribute

@ModelAttributeアノテーションは2つの使い方があります。

パラメータ内にアノテーションがある場合
@RequestMapping(...)
public xxx TestAnnotation(@ModelAttribute Testobject obj, xxxx) {
                                          //ここのアノテーション
   ...
}

のようなケースは「パラメータ内にアノテーションがある場合」になります。


このケースはリクエストで送られてきたフォームからデータを受け取る時に利用されます。


上記のコードだと、「obj変数にフォームの値を入れる」という挙動になります。
※GETリクエストのようにデータが送られてこない場合は、「new Testobject()」の空オブジェクトを生成します。

メソッドのアノテーションの場合
@ModelAttribute  //ここのアノテーション
public xxx CreateTestObject() {
     return new TestObject                                    
}

のようなケースは、「メソッドのアノテーションの場合」になります。

@Contolor内の@RequestMappingのメソッドの実行前にこのメソッドは呼び出されます。

CreateTestObjectメソッドがTestObjectオブジェクトを返すため、@RequestMapping内のメソッドでこの処理を利用する
というイメージです。

※生成されたオブジェクトをModelに自動的に付与されます。
View側で使用することができます。

@SessionAttributes

セッションに格納する型を指定するアノテーション


アノテーションのtypes属性にセッションに格納するオブジェクトの型を指定して利用する。

@ModelAttributeアノテーションか、ModelのaddAttributeメソッドを使用して、Modelオブジェクトに追加されたオブジェクトの中から、この@SessionAttributesで指定した型と一致するものがセッションに格納される仕組み

@Controller
@RequestMapping("wizard")
@SessionAttributes(types = { Watablog.class, Engineerblog.class  } )  // 型を指定する
public xxx TestSpringController() {
    // ...                                  
}

この例だと、WatablogクラスとEngineerblogのオブジェクトがセッションに格納されるということ。

Bean

SpringのapplicationContext.xmlという設定ファイルで管理している、クラスを定義する「bean」をアノテーションを使う事で定義する。

@Component

SpinrgのDIコンテナにbeanとして登録したいクラスにアノテーションを付けます。
@Controller、@Service、@Repositoryは@Componentを継承している。

@Configuration

XMLに記入する設定を、ソースコードに書きたい時にこのアノテーションを使います。
@beanを付与したメソッドで構成されています。

@Controller

画面遷移、Service層(メインロジック)の呼び出しを行うアノテーションです。
一般的に、Thymeleafでレンダリングしたものがレスポンスになる。

このアノテーションを付けると、Springのコンポーネントとして認識されるので、ApplicationContextに登録されます。

@RestController

APIのコントローラに付与する。
戻り値をStringにしたデータがレスポンスになります。

@Respnsebody

メソッドに付与すると戻りがそのまま返る

@RequestMapping

コントローラに付与するアノテーション
リクエストURLに対してどのメソッドの処理を実行するかを定義する。

@GetMapping

GETリクエストを処理する@RequestMappingの簡略アノテーション

@PostMapping

Postリクエストを処理する@RequestMappingの簡略アノテーション

@RequestParam

URLに含まれるクエリパラメータや、メッセージボディに含まれるポストパラメータを受け取ることができる。

@Data

対象クラスにgetter/setterでアクセスすることを可能とする。
equals()メソッドやtoString()メソッドが使えるようになる。

@Service

ビジネスロジックの処理を提供する。
このアノテーションを付与するとSpringのコンポーネントとして認識される。ApplicationContextに登録されます。

バリデーション系のアノテーション

バリデーションは対象のクラスでアノテーションを付けることでパラメータチェックができます。
最大値やNullなどの入力値のチェックが可能です。

@Validated

このアノテーションを付与すると自動的にバリデーションを行ってくれます。

@AssertTrue

Trueかどうかをチェックする

@AssertFalse

Trueかどうかをチェックする

@Null

オブジェクトの値がNULLであることをチェックする

@NotNull

オブジェクトの値がNULLではないことをチェックする
※フォーム未入力は空文字になってNULLではないので注意

@NotBlank

文字列に半角スペース、タブ文字などの空白文字以外が含まれているかチェックする

@Max(value)

valueで指定した最大値以下かどうかチェックする。

指定する値はlong型になる。

@Min(value)

valueで指定した最小値以下かどうかチェックする。

指定する値はlong型になる。

@DecimalMax(value,inclusive)

値が指定した最大値以下であるか、チェックする。

第二引数のinclusiveをfalseとすると値が指定した最大値未満で判定される。

@DecimalMin(value,inclusive)

値が指定した最小値以下であるか、チェックする。

第二引数のinclusiveをfalseとすると値が指定した最小値超過で判定される。

@DateTimeFormat

引数として渡された日付に対して形式通りかチェックする。

@Size(最大値or最小値=value)

文字数が指定の範囲かチェックする。



さいごに

最後まで読んでいただき、ありがとうございました。


もし、記載している内容が間違えていれば遠慮なくコメントしてください!


私自身の勉強になりますし、他の人がこの記事を見た時に間違えた情報を見ることになってしまうので💦