4. 의존 자동 주입 #6 자동 주입과 명시적 의존 주입 간의 관계
2021. 7. 12. 17:15ㆍJAVA/Spring
본 글은 초보 웹 개발자를 위한 스프링5 프로그래밍 입문 도서의 내용을 복습하기 위해 작성된 글입니다.
6. 자동 주입과 명시적 의존 주입 간의 관계
스프링 설정 클래스의 자동 주입 대상인 빈 설정 메서드에서 명시적으로 세터 메소드를 수행하여 명시적으로 의존 주입을 했을때 어떻게 되는가?
AppCtx 클래스의 infoPrinter 메서드 변경
@Configuration
public class AppCtx {
@Bean
public MemberDao memberDao() {
return new MemberDao();
}
@Bean
public MemberRegisterService memberRegSvc() {
return new MemberRegisterService();
}
@Bean
public ChangePasswordService changePwdSvc() {
return new ChangePasswordService();
}
@Bean
@Qualifier("printer")
public MemberPrinter memberPrinter1() {
return new MemberPrinter();
}
@Bean
@Qualifier("summaryPrinter")
public MemberSummaryPrinter memberPrinter2() {
return new MemberSummaryPrinter();
}
@Bean
public MemberListPrinter listPrinter() {
return new MemberListPrinter();
}
@Bean
public MemberInfoPrinter infoPrinter() {
MemberInfoPrinter infoPrinter = new MemberInfoPrinter();
// 특이점
// 설정 클래스에서 명시적으로 memberPrinter2 빈 주입
infoPrinter.setPrinter(memberPrinter2());
return infoPrinter;
}
@Bean
public VersionPrinter versionPrinter() {
VersionPrinter versionPrinter = new VersionPrinter();
versionPrinter.setMajorVersion(5);
versionPrinter.setMinorVersion(0);
return versionPrinter;
}
}
명시적으로 printer 의존 객체의 빈 메소드 대상을 memberPrinter2()로 주입하는 것을 볼 수 있다.
MemberInfoPrinter 클래스의 setPrinter 메소드 내용
public class MemberInfoPrinter {
... 생략
@Autowired
@Qualifier("printer")
public void setPrinter(MemberPrinter printer) {
this.printer = printer;
}
}
위의 코드와 같이 자동 주입 대상이 "printer"인 것을 알 수 있다.
실행결과
위의 실행결과와 같이 회원의 전체 정보를 보여주는 것을 알 수 있다.이는 주입한 memberPrinter2 빈이(MemberSummaryPrinter 타입 객체가) 아닌 memberPrinter1 빈을 사용해서 회원정보를 출력한 것을 의미한다.
정리하며
설정 클래스에서 세터 메서드를 통해 의존을 주입해도 해당 세터 메서드에 @Autowired 애노테이션이 붙어 있으면 자동 주입을 통해 일치하는 빈을 주입한다. 따라서 @Autowired 애노테이션을 사용했다면 설정 클래스에서 객체를 주입하기보다는 스프링이 제공하는 자동 주입 기능을 사용하는 편이 낫다.
References
초보 웹 개발자를 위한 스프링5 프로그래밍 입문, 최범균 저
https://github.com/yonghwankim-dev/spring5/tree/master/sp5-chap04/src/main/java/chap04_06
'JAVA > Spring' 카테고리의 다른 글
7. AOP 프로그래밍 #2 프록시(Proxy)와 AOP (0) | 2021.07.27 |
---|---|
7. AOP 프로그래밍 #1 프로젝트 준비 (0) | 2021.07.27 |
4. 의존 자동 주입 #5 @Autowired 애노테이션의 필수 여부 (0) | 2021.07.12 |
4. 의존 자동 주입 #4 상위/하위 타입 관계와 자동 주입 (0) | 2021.07.12 |
4. 의존 자동 주입 #3-2 @Qualifier 애노테이션 적용을 통한 특정 빈 설정 메소드 수행 확인 (0) | 2021.07.12 |