【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);
}
}