Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
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 28 29 30
Archives
Today
Total
관리 메뉴

프로그래밍 끄적끄적

[SpringBoot] 자동주입(@Autowired) 본문

백엔드/스프링

[SpringBoot] 자동주입(@Autowired)

soeunkk 2021. 9. 7. 17:49

🌳 자동주입 누락 옵션

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를 쓰도록 하자!

 

Comments