https://www.youtube.com/playlist?list=PLq8wAnVUcTFUHYMzoV2RoFoY2HDTKru3T
스프링 강의를 듣고 정리한 내용입니다
Dependency를 Injection 하는 어노테이션 @Autowired
스프링의 IoC 컨테이너에서 설정대로 객체를 생성하고, Injeciton 한다
* 참고
<context:annotation-config />
설정을 따로 하지 않을 경우
@Autowired라는 어노테이션을 읽어들이지 않는다.
@Autowired 어노테이션의 문제점
@Autowired가 무엇을 근거로 참조했는지 여부를 알 수 없다
컨테이너에서 exam 객체를 찾아서 세팅을 할 때 @Autowired 된 객체를 찾는 기준 찾기
- 자료형을 기준으로 찾는다
- 변수명을 기준으로 찾는다
테스트
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로 객체를 지정해주어야 한다
'백엔드 > Spring' 카테고리의 다른 글
Spring - 어노테이션으로 객체 생성 | TIL_157 (0) | 2022.10.26 |
---|---|
Spring - @Autowired(required) | TIL_156 (0) | 2022.10.24 |
Spring - 어노테이션의 장점 | TIL_154 (0) | 2022.10.20 |
Spring - Collection 생성&목록 DI | TIL_153 (0) | 2022.10.17 |
Spring - 생성자 DI | TIL_152 (0) | 2022.10.12 |