웹(Web)/백엔드(Backend)

스프링 어노테이션(Annotation), @AutoWired과 @Qualifer

SK_MOUSE 2021. 4. 16. 14:23
반응형

1. XML로 설정

소스코드를 바꿔야함. B2->B3

XML을 매번 바꿔야되므로 귀찮으니 발전해서 소스코드를 읽게해줌.

 

<설정을 분리하는 방식> -> <설정을 코드 내에서 인식>

따라서 java코드에서 @Component를 인식해서 객체화함

B2를 사용하다가
어노테이션을 이용해 B3로 변경
Xml에 있는 객체를 지우고

 

@Autowired를 통해 지워버린다

@Autowired를 통해서 Xml에 있던객체를, 코드에다가 객체를 모두 박아버리는것이다.

 

XML에 Autowired한걸 알아서 찾아보라는 내용을 지시서에 넣어주어야한다.

위 한줄만 추가해주면 된다.

=> 객체를 만들어놓고 "그 안을 들여다봐라" 라는 뜻

=> 그래야 @Autowired를 통해서 안을들여다보고 자동으로 설정

 

(추가해주지 않으면 탐색을 하지 않으므로 NullPointerError 뜬다.)

 


@Autowired : 자동으로 연결해준다는것은 문제가 될 수 있다.

@Qualifer : 객체가 여러개일때 식별이 모호할경우 명시해주기 위해 사용한다.

Qualifier에서 "exam2"를 찾는다.

bean에 모호한 exam이 여러개 등록되어있다.

id="exam"으로 하면 @Autowired되지만

id="exam1", id="exam2"로 설정해두면 어떤 객체를 선택해야될지몰라 오류가 난다.

 

따라서, @Qualifer를 통해서 정확한 id를 주어 객체를 Autowired할 수 있게 도와준다.

이때 사용하는것이 @Qualifier다.

 


@Autowired 위치

기본생성자 제거

그러면 바인딩이 되지않는다..!!

 

 

생성자 다 지움.

없다면, 기본 생성자를 알아서 만들어줌!!

 

 

 

추가적으로, @Qualifier를 직접 생성자에 넣어주는 방법도 보겠다.

매개변수로 여러개가 들어갈수있다고 판단하여 메소드 자체에는 Qualifer 불가.
필드에 Qualifier를 넣어주어야한다.

하나만 넣어줘도 된다.

 


Autowired를 했는데, 원하는 객체가 없을때?

 

아래와 같은 상황처럼 exam 객체가 null인경우는 다른 출력문을 출력해주려고한다.

@Autowired에서 없으면  exam에 null을 넣어줘야한다.

어떻게 하면 @Autowired에서 null을 반환받을까?

설정

Autowired에서 괄호를 열면 설정값을 지정할 수 있다.

 

@Autowired(required = false)로 설정해주면 된다.

반응형