클래스와 메서드에 추가하여 다양한 기능을 부여하는 역할
<context:annotation-config/>
추가@Autowired를 통해 필요한 객체를 스프링이 알아서 주입해준다.
console.java
@Autowired
@Override
public void setExam(Exam exam) {
System.out.println("setter");
// TODO Auto-generated method stub
this.exam = exam;
}
setting.xml
<bean id="exam1" class="spring.di.entity.NewlecExam" p:kor="10" p:eng="10" p:math="10" p:com="10"/>
알아서 주입해주는 것 까진 좋은데 뭘 기준으로 가져올까?
아이디를 생성자의 변수 이름과 다르게 바꾸거나 지워도 주입이 잘 되는 것을 알수 있었다.
@Autowired
@Override
public void setExam(Exam exam) {
// TODO Auto-generated method stub
this.exam = exam;
<bean class="spring.di.entity.NewlecExam" p:kor="10" p:eng="10"/>
모호하기 때문에 자동으로 주입이 불가능하다는 내용
expected single matching bean but found 2:
<bean id="exam" class="spring.di.entity.NewlecExam" p:kor="10" p:eng="10"/>
<bean class="spring.di.entity.NewlecExam" p:kor="20" p:eng="20"/>
변수명과 같게 이름을 만들어주었더니 실행이 가능했다.
<bean class="spring.di.entity.NewlecExam" p:kor="10" p:eng="10"/>
<bean id="exam2" class="spring.di.entity.NewlecExam" p:kor="20" p:eng="20"/>
하지만 변수명과 다르게 이름을 만들어주었더니 실행이 불가능했다.
참고할 아이디를 정해줄 순 없는 걸까?!
-> @Qualifier 사용
InlineExamConsole.java
@Autowired
@Qualifier("exam2") // Qualifier에 해당되는 ID를 선택해 직접 연결해 줄 수 있다.
@Override
public void setExam(Exam exam) {
// TODO Auto-generated method stub
this.exam = exam;
}
setting.xml
<bean id="exam1" class="spring.di.entity.NewlecExam" p:kor="10" p:eng="10"/>
<bean id="exam2" class="spring.di.entity.NewlecExam" p:kor="20" p:eng="20"/>
InlineExamConsole.java
@Autowired
@Qualifier("exam2")
private Exam exam;
setter 함수가 아닌 private한 필드에 해당 어노테이션을 사용하면 어떻게 될까?
-> 해당 객체의 기본 생성자만 호출하게된다. 기본 생성자에 사용해도 마찬가지.
그렇다면 오버로드된 생성자에 사용하면?
-> 오버로드된 생성자에는 인자가 2개 이상일 수 있다. 이럴 경우 지정된 @Qualifier를 어떤 인자에 사용할 지 모호하기 때문에 직접 필드에 사용하여 해결한다.
오류가 발생하는 모습
public InlineExamConsole(@Qualifier("exam2")Exam exam) {
System.out.println("overloaded constructor");
this.exam = exam;
}
해당하는 객체가 존재하지 않을 때를 가정하고 싶을 떄
@Autowired(required=false)를 사용하면 null값으로도 사용이 가능하다