스프링은 의존성 주입(Dependency Injection)을 위해 다양한 방식을 지원한다. 생성자 주입(Constructor Injection)은 그 중 하나로, 스프링은 생성자의 매개변수를 보고 어떤 빈을 주입해야 할지를 결정한다. 주로 다음과 같은 기준을 통해 주입된다:
타입 일치 (Type Matching): 스프링은 생성자 매개변수의 타입을 확인하고, 동일한 타입의 빈이 등록되어 있다면 해당 빈을 주입한다.
public class MyService {
private final MyRepository myRepository;
public MyService(MyRepository myRepository) {
this.myRepository = myRepository;
}
}
위의 예제에서 MyRepository의 구현체가 등록되어 있다면, 해당 구현체가 MyService의 생성자에 주입된다.
한정자(qualifier) 및 이름 일치: 여러 개의 동일한 타입의 빈이 등록되어 있을 경우, 한정자나 빈의 이름을 기준으로 주입될 빈을 선택할 수 있다.
public class MyService {
private final MyRepository myRepository;
public MyService(@Qualifier("myRepositoryImpl") MyRepository myRepository) {
this.myRepository = myRepository;
}
}
위의 예제에서 myRepositoryImpl이라는 이름의 빈이 등록되어 있다면 해당 빈이 MyService의 생성자에 주입된다.
@Primary 어노테이션: 여러 개의 동일한 타입의 빈이 있을 때, @Primary 어노테이션이 부여된 빈이 주입된다.
@Service
@Primary
public class PrimaryMyRepository implements MyRepository {
// ...
}
@Service
public class SecondaryMyRepository implements MyRepository {
// ...
}
public class MyService {
private final MyRepository myRepository;
public MyService(MyRepository myRepository) {
this.myRepository = myRepository;
}
}
위의 예제에서 PrimaryMyRepository가 주입된다.
이러한 주입 방식은 스프링의 IoC 컨테이너가 빈을 생성하고 관리할 때 사용되며, 컴포넌트 스캔, 자동 구성, 어노테이션 기반 설정 등을 통해 빈들을 등록할 때 주로 사용된다.