1. 생성자 주입

- 생성자를 통해서 의존관계를 주입한다.

- 생성자 호출 시점에 딱 1번만 호출이 된다. 그렇기 때문에 불변, 필수 의존관계에서 사용된다.

- 생성자가 1개만 있을 경우 @Autowired 애노테이션을 생략해도 DI가 이뤄진다.

- 필드에 final 키워드를 사용할 수 있다. 그렇기 때문에 생성자에서 값이 설정되지 않는 오류를 컴파일 시점에서 확인할 수 있다. 참고로, 나머지 주입 방식은 모두 생성자 이후에 호출되기 때문에 final 키워드를 사용할 수 없다.

@Service
public class testService {
	private final TestRepository testRepository;
    
	@Autowired
	public testService(TestRepository testRepository) {
		this.testRepository = testRepository;
	}    
}

 

1.1 Lombok library가 제공하는 @RequiredArgsConstructor 애노테이션을 이용한 생성자 주입

- final 키워드 혹은 @NonNull 애노테이션이 붙은 필드를 모아서 생성자를 자동으로 만들어주고 의존관계를 주입한다.

@Service
@RequiredArgsConstructor
public class TestService {
	private final TestRepository testRepository;
}

 

2. 수정자(Setter) 주입

- 필드 값을 변경하는 수정자 메서드를 통해서 의존관계를 주입한다.

- 선택, 변경 가능성이 있는 의존관계에서 사용된다.

@Service
public class TestService {
	private TestRepository testRepository;

	@Autowired
	public void setTestRepository(TestRepository testRepository) {
		this.testRepository = testRepository;
	}
}

 

3. 필드 주입

- 필드에 바로 의존관계를 주입한다.

- 코드가 간결하다는 장점이 있지만, 외부에서 변경이 불가능하기 때문에 테스트가 어렵다는 단점 또한 존재한다.

@Service
public class TestService {
	@Autowired
	private TestRepository testRepository;
}

 

4. 일반 메서드 주입

- 일반 메서드를 통해서 주입한다.

- 한 번에 여러 필드를 주입할 수 있다.

@Service
public class TestService {
	private TestRepository testRepository;
	
	@Autowired
	public void init(TestRepository testRepository) {
		this.testRepository = testRepository;
	}
}

 

참고

- 『스프링 핵심 원리 - 기본편』