19
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Java】springのコンストラクタインジェクションをLombokで省略する方法

Last updated at Posted at 2017-12-28

職場の先輩が使っていたテクニックをメモ

追記:全部こちらのブログ様に載っていた
http://pppurple.hatenablog.com/entry/2016/12/29/233141

1. Lombokとは

ボイラープレートコード(言語仕様上省く事ができない定型的なコード)をコンパイル時に自動生成してくれる便利なライブラリです。
例えるとJavaBeanのgetter/setter等をアノテーションで済ませられます。

2. コンストラクタインジェクションをしてみる

HogeLogicFugaLogicを利用していて、DIコンテナから取得したいものとします。

2-1. 一般的なSpringのコンストラクタインジェクション

通常のSpringのコンストラクタインジェクションを書いてみます。

サンプルA
@Component
public class HogeLogic {

  private final FugaLogic fugaLogic;

  @Autowired // <- 4.3以降は省略可
  public HogeLogic(FugaLogic fugaLogic) {
    this.fugaLogic = fugaLogic;
  }

  // some method
}

重要なのは、spring4.3以降はコンストラクタが1件の場合@Autowiredを省略できることです。

2-2. Lombokで省略したコンストラクタインジェクション

Lombokで省略したコンストラクタインジェクションを書いてみます。
@RequiredArgsConstructorをクラスにアノテートするだけです:angel:

サンプルB
@RequiredArgsConstructor // <-ここ
@Component
public class HogeLogic {

  private final FugaLogic fugaLogic;

  // some method
}

Tips. delombokしてみる

自動生成されるコードを見てみると以下のようになります。

サンプルC
@Component
public class HogeLogic {

  private final FugaLogic fugaLogic;

  public HogeLogic(FugaLogic fugaLogic) {
    this.fugaLogic = fugaLogic;
  }

  // some method
}

サンプルA@Autowiredナシ版が出来上がっています。

3. つまりどういうこと?

@RequiredArgsConstructor
初期化が必要なフィールド(finalフィールドなど)の初期化パラメータを引数に持つコンストラクタを生成するためのアノテーション。
TERASOLUNA Server Framework for Java (5.x) Development Guideline | 11.2. ボイラープレートコードの排除(Lombok)

@RequiredArgsConstructorの効果によりコンストラクタが生成され、
コンストラクタが1件であるため@Autowiredを省略したことになり、
自動的にコンストラクタインジェクションされた...というわけです。

複合技すごい。

19
16
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
19
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?