【Spring】Lombokでコンストラクタインジェクションを簡潔に書く

コンストラクタインジェクションのメリット

SpringではDIを行う際にはコンストラクタインジェクションを使用することが推奨されています。

  • テスト時にDIの対象クラスをモックオブジェクトに変更しやすい。
  • DI対象のフィールド変数をfinalにすることができる。

コンストラクタインジェクションの例

コンストラクタインジェクションは以下のコード例のようにコンストラクタに対して@Autowiredを付けます。コンストラクタインジェクションではフィールドインジェクションに比べて必要なコード量が増えてしまうことがデメリットです。

サービスクラス

@Service
public class ItemService {

   // DI対象 
    private final ItemRepository itemRepository;
    
    // コンストラクタインジェクション
    @Autowired
    public ItemService(ItemRepository itemRepository) {
        this.itemRepository = itemRepository;
    }
    
    public Item findById(int id) {
        return return itemRepository.findById(id);
    }
}

リポジトリクラス

@Repository
public class ItemRepository {

    public Item findById(int id) {

        // DBから指定されたidを持つItemを検索して返す
        return item;
    }
}

Spring 4.3からクラス中のコンストラクタが1つの場合は@Autowiredを省略できるようになりました。これとLombokの@RequiredArgsConstructorアノテーションを組み合わせることでコンストラクタを記述することなくコンストラクタインジェクションを行うことができるようになります。

上記のサービスクラスを変更すると以下のようになります。

@RequiredArgsConstructor
@Service
public class ItemService {

    private final ItemRepository itemRepository;

    public Item findById(int id) {

        return itemRepository.findById(id);
    }
}