본문 바로가기

IT/Spring

@Autowired 어노테이션/@Autowired란? -사좋배 공유

자동 주입 기능을 사용하는 것은 매우 간단하다. 다음의 두가지만 사용하면 된다.

 

1.자동 주입 대상에 @Autowired 어노테이션 사용.

2.XML 설정에<context:annotation-config/>설정 추가

 

위 두가지를 하면, @Autowired가 적용된 의존 주입 대상에 대해서는 <property>태그나 <constructor-arg>태그를 사용하지 않아도 스프링이 알맞게 의존객체를 주입한다.

 

ex)예시

위의 xml파일에 bean을 등록한것처럼 빈등록만 한다면 <property>태그나 <constructor-arg>태그를 사용하지 않아도 된다. 빈으로 등록한 memberDao를 이용하여 다른클래스에선 똑같이 그냥 빈만 등록하고 그 클래스에서 의존을 주입하고싶은 빈 대상이 있을경우 @Autowired로 자동 의존 주입하면 된다. 

1.

2.

 

 

 

여기서, 만약 동일한 타입을 가진 빈 객체가 두개가 있다면 @Autowired 어노테이션은 어떻게 작동할까?

appCtx.xml
MemberinfoPrinter

MemberInfoPrinter 클래스의 setPrinter()메서드는 Memberprinter타입의 의존 객체를 자동 주입 받기 위해 @Autowired를 사용했다. 그런데 설정을 보면 MemberPrinter타입의 빈이 두개가 존재한다. 이 경우,스프링은 "print1"빈과 "print2"빈중 어떤 빈 객체를 MemberInfoPrinter 빈에 주입해야 할지 알 수 없어서 스프링 컨테이너를 초기화하는 과정에서 익셉션을 발생시킨다.

이러한 문제를 해결하기위해 

@Qualifier 어노테이션을 지원한다.

다음 두가지의 작업을 통해서 @Qualifier 어노테이션을 사용할수있다.

1.

~~.xml

2.

다음과같이 설정을 해주면 @Qualifier의 값으로 "sysout"을 지정한다. 

@Qualifier어노테이션을 사용할때 주의할 점은 @Qualifier에 지정한 한정자 값을 갖는<bean> 객체가 존재하지 않으면 주입할 객체를 찾지 못해 익셉션이 발생한다는 점이다. 예를 들어, 앞서 @Qualifier 어노테이션을 이용해서 한정하는 값을 설정했는데, 다음설정과 같이 XML설정에서 일치하는 <qualifier>태그를 가진 빈 객체가 존재하지 않는경우 스프링 컨테이너를 생성하는데 실패하게 된다.

 

 

@Autowired 어노테이션의 적용 순서

지금까지 @Autowired 어노테이션을 적용했을 때 주입할 객체를 어떻게 찾는지 설명했는데, 실제 의존 객체를 찾는 순서를 정리해보면 다음과 같다.

 

1. 타입이 같은 빈 객체를 검색한다. 한개면 그 빈 객체를 사용한다. @Qualifier가 명시되어 있을 경우, @Qualifier와 같은 값을 갖는 빈 객체여야 한다.

 

2. 타입이 같은 빈 객체가 두 개 이상 존재하면, @Qualifier로 지정한 빈 객체를 찾는다. 존재하면, 그 객체를 사용한다.

 

3.타입이 같은 빈 객체가 두 개 이상 존재하고 @Qualifier가 없을 경우, 이름이 같은 빈 객체를 찾는다. 존재하면, 그 객체를 사용한다.