はじめに
Lombokの@AllArgsConstructor
アノテーションや@RequiredArgsConstructor
アノテーションを使用してコンストラクタインジェクションを行う際に、Springの@Qualifier
アノテーションでインジェクトするBean名を明示する方法について解説します。
すでに同様の内容を解説しているページがいくつかありますが、設定ファイルの配置位置や設定内容自体についての解説はあまり無く、追加で調べる必要があったので備忘録として残しておきます。
概要
コンストラクタインジェクションでインジェクトするBean名を明示したい場合は、以下のようにコンストラクタの引数に@Qualifier
アノテーションを付与する必要があります。
@Controller
public class MyController {
private final MyService service;
public MyController(@Qualifier("myServiceImpl")MyService service) {
this.service = service;
}
}
しかし、Lombokの@AllArgsConstructor
アノテーションや@RequiredArgsConstructor
アノテーションを使用してコンストラクタを自動生成する場合、そのままでは引数に@Qualifier
アノテーションは付与されません。
このような場合、lombok.config
ファイルを作成することで、自動生成されるコンストラクタに@Qualifier
アノテーションが付与されるよう設定することができます。
lombok.configファイルの作成・配置
lombok.config
ファイルは、Lombokの挙動をデフォルトから変更したい場合に作成する設定ファイルです。通常は、プロジェクトルートやソースフォルダのルートにlombok.config
ファイルを作成します。
lombok.config
ファイルによる設定内容は、lombok.config
ファイルを配置したディレクトリ内と、そのサブディレクトリ内に存在するソースコードに適用されます。また、サブディレクトリ内に別のlombok.config
ファイルを配置することで、そのディレクトリとそのサブディレクトリに対して適用される設定を変更することも可能です。
lombok.configファイルの記述
今回は、設定項目のひとつであるlombok.copyableAnnotations
プロパティに設定を行います。
lombok.copyableAnnotations += org.springframework.beans.factory.annotation.Qualifier
このプロパティは、フィールドに付与されるアノテーションのうち、そのフィールドに対するセッターやコンストラクタの引数にも付与しておきたいアノテーションを指定するための項目です。このプロパティには複数のアノテーションを追加できるよう、=
ではなく+=
でアノテーションを指定します。
このプロパティに@Qualifier
アノテーションのFQCNであるorg.springframework.beans.factory.annotation.Qualifier
を追加しておくと、インジェクト対象のフィールドに@Qualifier
アノテーションを付与しておけば、Lombokにより生成されるコンストラクタの引数にも同じ内容の@Qualifier
アノテーションが付与されます。
@RequiredArgsConstructor
@Controller
public class MyController {
/* インジェクト対象フィールドに@Qualifierアノテーションを付与しておく */
@Qualifier("myServiceImpl")
private final MyService service;
}
@Controller
public class MyController {
@Qualifier("myServiceImpl")
private final MyService service;
/* 生成されたコンストラクタの引数にも@Qualifierアノテーションが付与された */
@java.lang.SuppressWarnings("all")
public MyController(@Qualifier("myServiceImpl") final MyService service) {
this.service = service;
}
}
参考
- https://projectlombok.org/features/configuration
- https://qiita.com/hrkt/items/e7c67c4d4de53bcb613b
- https://stackoverflow.com/questions/38549657/is-it-possible-to-add-qualifiers-in-requiredargsconstructoronconstructor
ご意見・ご指摘等あればコメントいただけると幸いです。