Spring을 사용시 다양한 어노테이션을 지원한다.
그 중 Spring을 이용한 DI를 편리하게 설정하는 어노테이션도 지원하는데
그게 바로 @Autowired 이다.
기존 DI의 결합도를 낮추기 위해 인터페이스를 호출하고 해당 구현체들의 클래스를 어떤 구분 값으로
외부 설정 파일(XML,TXT 등)을 통해 Class를 바꿔끼워주었다.
setting.txt
com.study.di.A1
FileinputStream fis = new FileinputStream("/com/study/di/setting.txt")
String className = fis.readLine();
A a = Class.forName(className)
Spring에서도
ApplicationContext 객체를 통해 외부 Xml에서 작성한 bean설정들을 호출해 결합도를 해소할 수 있지만
@Autowired 어노테이션을 통해 DI를 간편하게 설정할 수 있게 지원한다.
@Autowired는
주입 받는 객체의 타입에 참조가 가능한 빈을 찾아서 자동으로 주입해준다.
예를들어 Book Interface룰 주입받는 lib 클래스에서
setter를 통해 book을 주입받을때
@Autowired
public void setBook(Book book){
this.book = book;
}
application-context
...
<bean class="package..book1/>
bean 의 특정 id가 아닌 Book 터페이스에 참조가능한 클래스인지를 확인하는 것이다.
그렇다면 book의 구현체가 book1뿐만아니라 book2도 있는 경우에는 어떻게 될까?
application-context
...
<bean id ="book" class="package..book1/>
<bean id ="book1" class="package...book2/>
이런 경우에는 자동적을 DI가 불가능하므로 에러가 발생한다.
이처럼 DI가 가능한 빈들이 여러개일 경우
id로 특정할 수 있게하는 어노테이션이
@Qualifer이다.
lib 클래스에서
book을 주입받는 setter메소드에
@Qualifer("bean id")를 작성하면
해당 id를 가진 bean을 Autowired한다.
@Autowired
@Qualifer("book1")
public void setBook(Book book){
this.book = book;
}
해당 코드인경우 'book1' 인 빈을 book필드에 주입한다.
'프로그래밍 > Spring' 카테고리의 다른 글
[Spring] 유효성 검증 - Validation (0) | 2023.11.13 |
---|---|
[Spring] REST API 테스트 코드 작성하기 (0) | 2023.11.06 |
[Spring] 테스트 코드에서 JPA metamodel must not be empty! 예외가 발생할 때 (0) | 2023.11.04 |
[Spring] spring-data-jpa Auditing 사용하기 (2) | 2023.11.01 |
[Spring] DI 지시서 작성 (Spring Bean Configuration) (0) | 2022.07.24 |