DevBoi

[Spring] Autowired 어노테이션의 장점 본문

Develop/[Spring]

[Spring] Autowired 어노테이션의 장점

HiSmith 2022. 2. 25. 01:10
반응형

이전의 xml에서 설정을 해서 빈을 바꿔주었다.

그런데 이건 예전 방식이고, 어노테이션으로 DI로 많이 사용한다.

 

우선 property 를 사용해서, 특정 빈에서 다른 빈으로 DI를 하는 방식을 어노테이션으로 바꿔보자

저번의 set함수에서 오토와이얼드를 사용해서 주입을 하고, xml의 프로퍼티를 삭제 하였다.

추가로, xml에 context를 추가하여, 해당 어플리케이션에서는 @autowired어노테이션을 찾아줘라는 설정을 이렇게 한다.

근데 자동으로 주입해주는 빈의 기준은 뭘까??

왜냐면, 별도로 빈 id를 지정하지 않았기 때문에, 빈이 여러개라면 어떤 빈으로 주입이 될까?

우선 bean의 아디기준으로 바인딩 되는게 아니라, class 타입 기준으로 바인딩이 된다.

그러면 만약에 동일 빈이 아래와 같이 두개라면? 어떤걸 기준으로 할까?

<bean id = "exam2" class="com.spring.di.entity.LecsExam" p:kor="10" p:math="20"/>

<bean id = "exam3" class="com.spring.di.entity.LecsExam" p:kor="120" p:math="40"/>

 

이런경우에는 어떤식으로 set될까? 물론 오류가 난다.

@AutoWired를 하게 되면, 우선 해당 주입 받을 클래스 (인터페이스던, 인터페이스 구현체이던)를 찾고

변수명 이름이 같은지를 체크한다. 즉 사용하는 곳에서 쓰는 exam이라는 변수명과 bean id가 같은 것이 있는지를 체크한다.

이 두개가 뻑나면 오류가 발생한다.

 

이럴때 사용하는것이 Qualifier다. 해당 빈의 id를 가지고 특정 빈에 대한 명시를 하여, 여러개를 주입 받을 가능성이 있는 경우에

해당 빈에 대한 명시를 하게 해준다.

예)

 

AutoWired나 Quilifier는 setter, 생성자, 변수 명에 전부다 올수있다.

setter나 생성자는 해당 메소드가 실행될때, 주입이 되지만,

 

변수명에 해당 어노테이션을 붙일경우에는, 기본생성자가 실행될떄 해당 내용이 실행된다.

예)

@AutoWired

private Exam ex;

 

생성자에 해당 을 사용하려면 아래와 같이 사용해야한다.

이유로는 생성자는 여러개의 파라미터가 올수있는데, 단일 Qualifier는, 해당 파라미터의 전부를 대표할것인지? 등등에서의 문제가 있기 때문이다.

 

 

 

 

반응형