1. @Autowired + 필드명 사용
@Autowired 는 타입으로 먼저 주입을 시도하고 같은 타입의 Bean이 여러개라면 필드 이름 혹은 파라미터 이름으로 매칭한다.
public interface MyService { ... }
@Component
public class MyServiceImplV1 implements MyService { ... }
@Component
public class MyServiceImplV2 implements MyService { ... }
@Component
public class ConflictApp {
// 필드명을 Bean 이름으로 설정
@Autowired
private MyService myServiceImplV2;
...
}
2. @Qualifier 사용
bean 등록 시 추가 구분자를 붙여 준다.
생성자 주입과 setter 주입 시 사용 가능하다.
@Component
@Qualifier("firstService")
public class MyServiceImplV1 implements MyService { ... }
@Component
@Qualifier("secondService")
public class MyServiceImplV2 implements MyService { ... }
@Component
public class ConflictApp {
private MyService myService;
// 생성자 주입에 구분자 추가
@Autowired
public ConflictApp(@Qualifier("firstService") MyService myService) {
this.myService = myService;
}
// setter 주입에 구분자 추가
@Autowired
public void setMyService(@Qualifier("firstService") MyService myService) {
this.myService = myService;
}
...
}
3. @Primary 사용
@Primary로 지정된 bean이 우선 순위를 가진다.
@Component
public class MyServiceImplV1 implements MyService { ... }
@Component
@Primary
public class MyServiceImplV2 implements MyService { ... }
@Component
public class ConflictApp {
private MyService myService;
@Autowired
public ConflictApp(MyService myService) {
this.myService = myService;
}
...
}
그래서 언제 써요??
DB가 메인, 보조로 두개 존재하는 경우.
- 기본적으로 메인DB을 사용할 때 @Primary를 사용한다.
- 필요할 때 @Qualifier로 보조DB를 사용하도록 만들 수 있다.
- 동시에 사용되는 경우 @Qualifier의 우선순위가 높다.
'spring' 카테고리의 다른 글
| Validation, BindingResult, BeanVaildation, Validator (1) | 2025.02.05 |
|---|---|
| Bean 등록 수동 VS 자동 (0) | 2025.02.04 |
| 의존관계 주입 / @RequiredArgsConstructor (0) | 2025.02.04 |
| 수동등록 bean(@Configuration, @Bean)과 자동등록 bean(@ComponentScan, @Component)이 충돌할 경우 (0) | 2025.02.04 |
| MVC와 템플릿 엔진, API (0) | 2025.01.31 |