프로그래밍 끄적끄적
[SpringBoot] 자동주입(@Autowired) 본문
🌳 자동주입 누락 옵션
1. @Autowired(required=false): 자동 주입할 대상이 없으면 메서드가 호출되지 않는다.
2. org.springframework.lang.@Nullable: 자동 주입할 대상이 없으면 null이 입력된다.
3. Optional<>: 자동 주입할 대상이 없으면 Optional.empty 가 입력된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
public class AutowiredTest {
@Test
void AutowiredOption() {
ApplicationContext ac = new AnnotationConfigApplicationContext(TestBean.class);
}
//현재 Bean 에 등록된 게 아무것도 없기 때문에 Autowired 로 제대로 된 객체를 주입할 수 없음(Config 를 등록하지 않았으므로)
static class TestBean {
@Autowired(required = false)
public void setNoBean1(Member noBean1) {
System.out.println("noBean1 = " + noBean1); //호출되지 않으므로 출력 X
}
@Autowired
public void setNoBean2(@Nullable Member noBean2) {
System.out.println("noBean2 = " + noBean2); //null 이 출력됨
}
@Autowired
public void setNoBean3(Optional<Member> noBean3) {
System.out.println("noBean3 = " + noBean3); //Optional.empty 가 출력됨
}
}
}
|
cs |
🌳 자동주입 충돌 해결
1. @Autowired 필드명 매칭
▪ @Autowired는 결과가 여러 개여서 타입 매칭에 실패하면, 필드/파라미터 이름과 같은 빈을 매칭한다.
2. @Qualifier 매칭
▪ 빈을 등록하는 부분에 @Qualifier("[한정자 이름]")을 지정하고, 자동주입 부분(필드 앞 또는 파라미터 앞)에 똑같이 기입하면 된다.
▪ 찾는 한정자 이름이 없을 경우, 해당 이름으로 등록된 빈을 찾아 매칭한다. (비추천)
▪ 구분할 수 있는 옵션을 하나 더 제공하는 것 뿐, 빈 이름을 변경하는 것은 아니다.
3. @Primary 사용 (많이 쓰임)
▪ @Primary가 명시된 빈이 우선권을 갖는다.
* @Qualifier가 @Primary보다 우선순위가 높다. 따라서 메인은 @Primary로 작성하되, 특수한 경우 @Qualifier를 쓰도록 하자!
'백엔드 > 스프링' 카테고리의 다른 글
[SpringBoot] 빈 생명주기 (0) | 2021.09.13 |
---|---|
[SpringBoot] 롬복(Lombok) (0) | 2021.09.08 |
[SpringBoot] 의존관계 주입 (0) | 2021.09.07 |
[SpringBoot] 컴포넌트 스캔 필터링 (0) | 2021.09.03 |
[SpringBoot] 컴포넌트 스캔과 자동 주입 (0) | 2021.09.03 |
Comments