작성
·
196
0
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)
[질문 내용]
11분 48초를 보면,
스프링컨테이너를 생성할때 생성자 파라미터를 넘겨주는건 컴포넌트 스캔을 해주는것이고, 자동빈등록이 된다고 말씀하시는데
지금까지 설명해주신거를 바탕으로 되돌아보면 스프링컨테이너를 생성할때 생성자 파라미터로 넘겨주는건 직접 스프링빈으로 등록하는것이라고 알고있었는데,
왜 @Component가 없는데 왜 이게 컴포넌트 스캔을 해주는것이고 ,직접빈등록이 아닌 자동빈등록인건지 질문드립니다
답변 1
0
안녕하세요. gomdole03님, 공식 서포터즈 OMG입니다.
.
프로토타입 스코프(링크)
위 링크 9분부터 참고해보시겠어요?
영한님께서도 질문남기신 내용에 대해 @Component가 없어도, 컴포넌트 스캔(=자동빈등록) 처럼 동작한다고 말씀하시는데요. 제가 생각했을 때 "처럼" 이라는 말씀이 키워드가 될 것 같습니다.
강의에서 배웠던 자동 빈등록은 아니지만 내부적으로 그와 유사하게 동작하여 결국 스프링 빈으로 등록을 해준다 라고 이해하시면 될 것 같아요.
.
감사합니다.
이 부분은 AnnotationConfigApplicationContext 클래스 코드를 확인해 보면 감이 잡히실텐데요,
코드 안에 영한님이 하신 말씀과 왜 제가 "처럼"을 키워드라고 한지 알 수있습니다.
AnnotationConfigApplicationContext는 총 4개의 생성자를 가집니다.
기본 생성자를 제외한 3개 중 가운데인 Class<?>... componentClasses 로 스프링 컨테이너를 생성하는 건 이해하시리라 생각합니다.
생성자 코드를 보면,
1- 기본생성자를 호출하고
2- 인자로 받은 컴포넌트클래스를 등록하고 (ClientBean, ProtoTypeBean)
3- 리프레시
총 3라인의 코드가 실행됩니다.
빈 등록이 관심사이므로 3 리프레시를 제외하고 1,2 단계만 설명드리겠습니다.
(refresh의 동작이 궁금하실 경우 직접 분석해보시는 거도 실력 성장에 도움이 될거라 생각하오니 한번 보시길 권장드려요^^)
기본생성자에서 보셔야 할 것은 scanner를 생성하는 코드인데요,
registry로 스프링컨테이너 자신을 인자로하여 ClassPathBeanDefinitionScanner를 생성합니다.
인자로 받은 빈팩토리나, 스프링컨테이너를 클래스패스에서 빈으로 등록될 클래스를 감지합니다.
-
여기까지의 과정을 한줄로 정리하면 "인자로 받은 컴포넌트 클래스를 스캔 한다" 라고 할 수 있을 것 같은데요.
여기까지 각 클래스와 메서드의 역할만 보더라도 감이 오실거라 생각하고, 빈을 등록하는 코드는 간략히 설명드리겠습니다.
register()를 보면, 빈을 등록하는 코드들이 실행되는데요, 인자로 받은 componentClasses는
register에서는 @Configuration과 같은 자동 스캔의 대상이 되는 클래스로 인지하고 진행이 됩니다.
(밑의 javadoc 참고)
직접 빈으로 등록할 컴포넌트 클래스(ClientBean, ProtoTypeBean)들을 반복문을 돌며 등록을 하고,
등록하는 내부 코드는 registerBean() 의 doRegisterBean()에서 진행되므로 이 부분도 한번 직접 코드를 보시면 좋을 것 같습니다.
--
정리하면, 스프링 컨테이너에 직접 빈으로 등록하는 과정은 영한님이 말씀하신 것처럼
컴포넌트 스캔으로 @Component가 붙은 클래스들을 자동 컴포넌트의 스캔이 대상이되는 자동 빈등록이 진행되는 것은 아니지만 그것과 같은 것 처럼 동작한다고 보시면 될 것 같습니다.
상세한 설명 감사드립니다..
제가 이해한바가 맞는지 확인 부탁드립니다.
@Component가 없어도 스프링컨테이너를 생성할때 생성자의 파라미터로 넘겨주면 컴포넌트스캔(=자동빈등록) 처럼 동작해서 스프링빈으로 등록이된다.
이렇게 이해하면 될까요?
그럼 스프링컨테이너를 생성할때 생성자 파라미터를 넘겨주는건 자동빈등록처럼 스프링빈으로 등록되긴하지만 엄연히 말하면 자동등록하는게 아닌 직접등록(수동등록)하는건가요?