• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

@Autowired 로 가져오는 Bean은 ?

21.03.09 00:31 작성 조회수 156

2

@Component
public class AppRunner implements ApplicationRunner {

// @Autowired
// ApplicationContext applicationContext;

@Autowired
MessageSource messageSource;

@Override
public void run(ApplicationArguments args) throws Exception {
// System.out.println(applicationContext.getClass());
System.out.println(messageSource.getClass());

}

Autowired 로 가져오는 Bean 이 햇갈려서 질문드립니다.

위 코드에서 @Autowired을 통해서 주입받는 빈은  MessageSource 가 구현된 클래스인걸로 아는데요..

AnnotationConfigServletWebServerApplicationContext , ResourceBundleMessageSource 두개 모두 문서를 찾아보니 MessageSource 를 구현한 클래스입니다~!

그런데 왜 "ResourceBundleMessageSource "가 빈으로 등록되는지 궁금합니다. 

혹시  @Primary 같은 우선순위가 적용되서 그러는건가요 ? 

답변 1

답변을 작성해보세요.

4

좋은 질문 감사합니다. 둘 중에 빈 이름이 mssageSource인 빈을 주입해주기 때문에 ResourceBundleMessageSource가 의존성으로 주입된 겁니다.

스프링 부트가 제공하는 자동 설정중에 MessageSourceAutoConfiguration이라는 클래스에서 ResourceBundleMessageSource빈을 등록해 주는데 그때 빈 이름을 messageSource라는 이름으로 등록해 줍니다.

그리고 아마 다른 수업에서 설명했겠지만 @Autowired는 기본적으로 같은 타입의 빈이 여러개 있다면 그중에서도 같은 이름의 빈을 주입해 주죠. 같은 이름의 빈이 없다면 에러를 던지구요.