0
0

More than 1 year has passed since last update.

Spring + lombokでコンストラクタインジェクションする際にBean名を指定する方法

Last updated at Posted at 2022-02-01

はじめに

Lombokの@AllArgsConstructorアノテーションや@RequiredArgsConstructorアノテーションを使用してコンストラクタインジェクションを行う際に、Springの@QualifierアノテーションでインジェクトするBean名を明示する方法について解説します。
すでに同様の内容を解説しているページがいくつかありますが、設定ファイルの配置位置や設定内容自体についての解説はあまり無く、追加で調べる必要があったので備忘録として残しておきます。

概要

コンストラクタインジェクションでインジェクトするBean名を明示したい場合は、以下のようにコンストラクタの引数に@Qualifierアノテーションを付与する必要があります。

MyController.java
@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.config
lombok.copyableAnnotations += org.springframework.beans.factory.annotation.Qualifier

このプロパティは、フィールドに付与されるアノテーションのうち、そのフィールドに対するセッターやコンストラクタの引数にも付与しておきたいアノテーションを指定するための項目です。このプロパティには複数のアノテーションを追加できるよう、=ではなく+=でアノテーションを指定します。
このプロパティに@QualifierアノテーションのFQCNであるorg.springframework.beans.factory.annotation.Qualifierを追加しておくと、インジェクト対象のフィールドに@Qualifierアノテーションを付与しておけば、Lombokにより生成されるコンストラクタの引数にも同じ内容の@Qualifierアノテーションが付与されます。

MyController.java(delombok前)
@RequiredArgsConstructor
@Controller
public class MyController {
    /* インジェクト対象フィールドに@Qualifierアノテーションを付与しておく */
    @Qualifier("myServiceImpl")
    private final MyService service;
}
MyController.java(delombok後)
@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;
    }
}

参考

ご意見・ご指摘等あればコメントいただけると幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0