Spring BootでDI注入はアノテーションだけでできてしまう。DI注入の方法にはフィールド注入やセッター注入などがあるが一般的に最も推奨されているコンストラクタ注入の方法でDI注入する。

ControllerからServiceクラスを呼ぶケースを想定。

まずServiceクラスを作成する。

GreetingService.Java

package dev.itboot.mb.service;

import org.springframework.stereotype.Service;
import dev.itboot.mb.dto.GreetingRequestDto;
import dev.itboot.mb.dto.GreetingResponseDto;

@Service
public class GreetingService {

    public GreetingResponseDto generateGreeting(GreetingRequestDto requestDto) {
        String message = "Hello, " + requestDto.getName() + "!";
        return new GreetingResponseDto(message);
    }
}

このときにクラス名の前に@Serviceアノテーションをつける。@Serviceをつけたら自動保管してくれると思うが、import org.springframework.stereotype.Service;も忘れずに書く。

次にControllerクラス。constructorに@AutowiredをつけてここでServiceクラスを生成する。

GreetingController.Java

package dev.itboot.mb.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import dev.itboot.mb.dto.GreetingRequestDto;
import dev.itboot.mb.dto.GreetingResponseDto;
import dev.itboot.mb.service.GreetingService;

@RestController
@RequestMapping("/greeting")
public class GreetingController {

    private final GreetingService greetingService;

    @Autowired
    public GreetingController(GreetingService greetingService) {
        this.greetingService = greetingService;
    }

    @PostMapping
    public GreetingResponseDto greet(@RequestBody GreetingRequestDto requestDto) {
        return greetingService.generateGreeting(requestDto);
    }
}

何とこれだけ。新たにconfigファイルの作成も必要ない。(作成する方法もあるが)アノテーションを使うだけでDI注入ができる。

DI注入の対象は@Component, @Service, @Repository, @Controllerなどのアノテーションで登録されたBeanが対象となる。@Componentと@Serviceとかの違いはわかっていないが、ほぼ差がないと言う記事もちらほら見る。

ちなみに@Repositoryの場合はこんなイメージになる。(前提:GreetingRepositoryクラスには@Repositoryアノテーションをつけておく)

GreetingController.Java(Repositoryの注入例)

package dev.itboot.mb.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import dev.itboot.mb.dto.GreetingRequestDto;
import dev.itboot.mb.dto.GreetingResponseDto;
import dev.itboot.mb.service.GreetingRepository;

@RestController
@RequestMapping("/greeting")
public class GreetingController {

    private final GreetingRepository greetingRepository

    @Autowired
    public GreetingController(GreetingRepository greetingRepository) {
        this.greetingRepository = greetingRepository;
    }

    @PostMapping
    public GreetingResponseDto greet(@RequestBody GreetingRequestDto requestDto) {
        return greetingRepository.save();
    }
}