'뉴렉처' 님의 채널(www.youtube.com/user/newlec1)을 바탕으로 제작한 블로그 글입니다:)
DI를 하는 방법에는 이전 강의에서 다룬 것처럼
어노테이션이라는 방식을 사용하여 코드 내에 설정을 심는 방식과, @Autowired라는 방법을 사용한다고 했습니다.
이번 시간에는 @Autowired만으로는 동작하지 않는 상황들을 보고, @Qualifier는 무엇이고 왜 사용하는지에 대해서 알아보고자 합니다.
저번 시간에 작성했던 방식은, xml 안에 Animal이라는 객체를 이용해 생성된 bean이 하나만 있었기 때문에
@Autowired가 setter의 인자가 Animal인 것을 보고
xml의 유일한 Animal class형인 객체와 자동으로 연결해 준다고 했었습니다.
그렇다면 만약에 xml 안에 Animal class가 여러개 있다면 어떻게 될까요?
당연히 Autowired는 두 개의 Animal 객체가 있으니 어떤 것을 연결해야 할지 모르기 때문에 에러가 나게 됩니다.
따라서 우리는 Qualifier라는 옵션을 이용해서 어떤 것을 binding할지 알 수 있도록 해주려고 합니다.
Qualifier은 안에 xml 파일 내에 있는 bean 객체의 id를 적어줌으로써
내가 원하는 애를 정확하게 콕 찝어 바인딩 해줄 수 있도록 만들어줍니다.
아래와 같이 AnimalPrintName의 setAnimal 부분에 @Qualifier을 추가하여 코드를 수정해보겠습니다.
- AnimalPrintName.java
public class AnimalPrintName implements AnimalPrint {
Animal animal;
public AnimalPrintName() {
// TODO Auto-generated constructor stub
}
public AnimalPrintName(Animal animal) {
this.animal = animal;
}
@Override
public void print() {
System.out.printf("Name is %s", animal.getName());
}
@Autowired
@Qualifier("animal1")
@Override
public void setAnimal(Animal animal) {
this.animal = animal;
}
}
- setting.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd">
<context:annotation-config/>
<bean id = "animal1" class = "spring.entity.Animal" p:name="BINGO" p:age="10"/>
<bean id = "animal2" class = "spring.entity.Animal" p:name="COCO" p:age="5"/>
<bean id = "console" class = "spring.console.AnimalPrintName">
</bean>
</beans>
코드를 수정하면 아래와 같이 잘 실행되는 모습을 볼 수 있습니다.
'Spring > Dependency Injection' 카테고리의 다른 글
[Spring Framework] @Component와 @Value 사용하기 (0) | 2021.01.20 |
---|---|
[Spring Framework] @Autowired 사용 위치와 Required (0) | 2021.01.18 |
[Spring Framework] 어노테이션과 @Autowired 사용하기 (0) | 2021.01.15 |
[Spring Framework] collection 타입의 bean 생성 (0) | 2021.01.11 |
[Spring Framework] Spring Bean Configuration (DI 지시서) 작성법 (2) (0) | 2021.01.06 |