4. 의존 자동 주입 #6 자동 주입과 명시적 의존 주입 간의 관계

2021. 7. 12. 17:15JAVA/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