백엔드/Spring

Spring - @Autowired의 참조 기준 | TIL_155

ran4 2022. 10. 22. 23:10

https://www.youtube.com/playlist?list=PLq8wAnVUcTFUHYMzoV2RoFoY2HDTKru3T

스프링 강의를 듣고 정리한 내용입니다

 

 


 

 

Dependency를 Injection 하는 어노테이션 @Autowired

스프링의 IoC 컨테이너에서 설정대로 객체를 생성하고, Injeciton 한다 

 

* 참고

<context:annotation-config />

설정을 따로 하지 않을 경우

@Autowired라는 어노테이션을 읽어들이지 않는다.

 

 

 

@Autowired 어노테이션의 문제점

@Autowired가 무엇을 근거로 참조했는지 여부를 알 수 없다

 

 

컨테이너에서 exam 객체를 찾아서 세팅을 할 때 @Autowired 된 객체를 찾는 기준 찾기

  1. 자료형을 기준으로 찾는다
  2. 변수명을 기준으로 찾는다

 

 

테스트

Program 클래스

ApplicationContext context =
new ClassPathXmlApplicationContext("spring/di/setting.xml");

ExamConsole console = (ExamConsole) context.getBean("console");
console.print();

 

 

InlineExamConsole 클래스

@Autowired
@Override
public void setExam(Exam exam) {
this.exam = exam;
}

 

 

변수명을 바꾸는 경우

<context:annotation-config />
<!-- exam에서 exam1으로 바꾼다 -->
<bean id="exam1" class="spring.di.entity.NewlecExam" p:kor="10" p:eng="10" />
<!-- id 자체를 지운다 -->
<bean class="spring.di.entity.NewlecExam" p:kor="10" p:eng="10" />

 

지정된 객체가 1개인 경우 변수명을 다르게 입력할 때는 에러가 나지 않는다

 

 

동일한 객체가 컨테이너에 존재하는 경우

<bean class="spring.di.entity.NewlecExam" p:kor="10" p:eng="10" />
<bean class="spring.di.entity.NewlecExam" p:kor="20" p:eng="20" />

 

Unsatisfied dependency 에러가 발생한다

▷ 1개의 객체가 발견되어야 하는데, 2개가 발견되었기 때문에 오류가 생긴다

 

 

 

해결방법

변수명을 지정한다

<bean id="exam" class="spring.di.entity.NewlecExam" p:kor="10" p:eng="10" />

 

-> 이 경우에는 id의 값이 변수명과 동일하지 않을 때 오류가 생긴다

-> @Qualifier로 불러올 객체를 지정한다

 

 

InlineExamConsole

@Autowired
@Qualifier("exam1")
@Override
public void setExam(Exam exam) {
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="10" p:eng="10" />

 

 

 

정리

보통은 자료형을 기준으로하며, 식별이 모호한 경우 객체의 변수명을 기준으로 한다

동일한 객체가 2개이상인 경우 @Qualifier로 객체를 지정해주어야 한다