필드 주입
@Service
public class UserService{
@Autowired
private UserRepository userRepository;
}
특징
- 가장 편리하게 의존성 주입이 가능
- 프레임워크 의존적
setter 주입
@Service
public class UserService{
private UserRepository userRepository;
@Autowired
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
특징
- 객체는 null이 가능하기 때문에 setter 주입의 경우에는 null 검증로직이 필요
- 일반적으로 DI는 어플리케이션 종료 시점까지 변경할 일이 없는데 java bean 규약에서 setter는 public이므로 언제든 변경이 가능하다.
생성자 주입
@Service
public class UserService{
private final UserRepository userRepository;
@Autowired
public UserService(UserRepository userRepository){
this.userRepository = userRepository;
}
}
특징
- 스프링 프레임워크에서 권장하는 방식
- 순환 참조가 발생할 경우 컴파일 단계에서 미리 알 수 있다.
- final 사용으로 인해 필드의 불변성을 보장할 수 있다.