스프링부트는 컴포넌트 스캔 단계일 때, Service 객체를 IoC 컨테이너에 올려둔다. 이때, new 연산을 통해 기본 생성자로 객체를 생성하게 된다.
만약 기본생성자가 존재하지 않고, 특정 파라미터를 요하는 생성자만 존재한다면,
컴포넌트 스캔을 진행하면서 컨테이너에 로드 되어있는 객체를 사용하여 생성하게 된다. Autowired기능은 이러한 생성자를 만들어준다.
@Service
public class BoardService {
@Autowired
private BoardRepository boardRepository;
@Autowired
private UserRepository userRepository;
@Autowired
private ReplyRepository replyRepository;
Java
복사
//컴포넌트 스캔 시, BoardService 생성자에 IoC 컨테이너에 등록 되어있는 Bean들을 할당해준다.
@Service
public class BoardService {
public BoardService(BoardRepository bRepo, UserRepository uRepo, ReplyRepository rRepo) {
this.boardRepository = bRepo;
this.userRepository = uRepo;
this.replyRepository = rRepo;
}
Java
복사
//초기화되지 않은 final 변수를 사용하여 생성 시 할당을 강제한다.
//AllArgsConstructor가 final 변수들에 Bean을 할당하여 생성해준다.
@Service
@AllArgsConstructor
public class BoardService {
private final BoardRepository boardRepository;
private final UserRepository userRepository;
private final ReplyRepository replyRepository;
Java
복사
위의 코드들은 모두 같은 기능을 한다.
컴포넌트 스캔 단계에서 클래스에 속한 멤버를 분석하는 단계를 Reflection이라 한다. 이때, 메서드와 필드, 어노테이션을 스캔하여 컨테이너에서 객체의 타입을 기준으로 검색한다. 만약 인스턴스가 있다면 @Autowired 변수에 주입시키고, 없다면 null값을 준다.