파게로그
Annotation을 이용할 때의 장점과 @Autowired 를 이용한 DI 본문
Spring docs - Annotation-based container configuration
docs.spring.io/spring-framework/docs/5.3.x/reference/html/core.html#beans-annotation-config
Annotation으로 설정할 때의 모듈 변경 방법
UI --- S --- <<interface>> B --- B2 (implements B)
여기서 B2 대신 B3를 사용하고자 한다면, data.B2를 data.B3로 바꾸기만 하면 된다.
이렇게만 해도 충분히 편하지만, annotation을 통해 코드에 메타 데이터를 심으면 보다 편리하다.
B2가 @Component
annotation을 통해 객체화되고 있을 때, 이를 지우고 B3로 대체하게 되면, @Component
를 가진 클래스는 B3밖에 없으므로 B3 객체가 생성된다. 요컨대, 설정 파일이 따로 없어도, 객체만 바꿔버리면 코드와 설정이 바뀐다.
@Autowired
<bean id="exam" class="admin.school.entity.MidTermExam" p:kor="80" p:eng="100" p:math="90" p:com="60" />
<bean id="console" class="admin.school.ui.InlineExamConsole">
<property name="exam" ref="exam" />
</bean>
일단, @Autowired
를 통해 3라인을 먼저 지워보자.
InlineExamConsole.java
@Autowired // 생성하고자 하는 객체는 @Autowired가 달린 setter를 자동으로 찾아서 바인딩됨
@Override
public void setExam(Exam exam) {
this.exam = exam;
}
한편, XML에는, 객체를 생성할 때 객체 내부에 @Autowired
가 있는지 확인하고 참조하도록 명령해야 한다.
1. setting.xml에서 아래를 추가한다.
🍰 <beans>에 아래를 추가
xmlns:context="http://www.springframework.org/schema/context"
🍰 <beans>의 xsi:schemaLocation 속성에 아래를 추가
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
2. 객체들이 annotation을 가지고 있다는 것을 알려준다.
🍰 <bean> 태그들 위에 아래를 추가
<context:annotation-config />
🥝 @Autowired는 뭘 기준으로 찾나?
setter의 파라미터의 타입을 확인한다.
여기선 파라미터(exam)의 타입 Exam과 빈의 타입 admin.school.entity.MidTermExam을 확인해서 바인딩한다.
🥝 만약 IoC Container에 객체가 두개라면?
@Autowired가 작동하지 않는다.
ERROR: ...expected single matching bean but found 2...
<bean>에 id 속성 지정함으로써 해결할 수 있다. 이 때에는 파라미터의 변수명과 같은 id를 가진 객체를 찾는다.
🥝 하지만 bean 객체 이름이나 파라미터의 이름을 일일이 바꾸는 것은 말이 안 되지 않나?
예를 들어, setter와 <bean>이 다음과 같이 정의되어 있을 때에 이들을 계속해서 수정할 수는 없다.
- setter
setExam(Exam exam)
- <bean> 객체
<bean id="exam1" ... />
<bean id="exam2" ... />
→ @Qualifier("exam1") 을 통해 연결할 수 있음
@Autowired의 위치와 Required 옵션
1. setter 위
2. constructor 위
생성자의 파라미터가 2개 이상일 수 있어서 @Qualifier는 에러가 발생한다. 그래서 파라미터에다가 @Qualifier를 설정할 수 있다.
3. field 위
기본 생성자에서 객체를 바인딩(기본 생성자를 호출하면서 의존성 주입이 이루어짐. 기본 생성자가 없으면 에러가 발생한다.)한다.
만약 XML에서 객체를 찾지 못했을 때에도 오류가 아니라 어떤 작업을 처리해주려고 하면?
@Autowired(required = false)
위와 같이 속성을 지정하면 에러가 발생하지 않는다.
'콤퓨타 왕기초 > Spring' 카테고리의 다른 글
XML Configuration을 Java Configuration으로 변경하기 (0) | 2021.04.20 |
---|---|
annotation을 이용한 객체 생성 (0) | 2021.04.20 |
Spring Bean configuration (0) | 2021.04.14 |
Spring 없이 직접 DI를 한다면? Spring의 역할 (0) | 2021.04.14 |
Dependency Injection, IoC Container (0) | 2021.04.12 |