You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
bean 어노테이션과 component 어노테이션 모두 빈 등록을 할 경우 사용하는 어노테이션으로 알고 있는데 어떤 차이가 있는지 궁금해서 질문 드립니다.
bean 어노테이션은 configuration 어노테이션이 있는 클래스의 메소드에 사용하여 해당 메소드에서 생성되는 객체를 빈으로 등록 component 어노테이션은 compoenetScan에서 지정한 패키지 안에 있는 클래스들 중 해당 어노테이션을 가지고 있으면 모두 빈으로 등록하는 방식으로 알고 있습니다.
제가 이해한 방식이 맞는지 위의 차이말고도 다른 차이가 있을 지 궁금합니다.
또한 두 가지 방법 모두 사용하여 빈을 생성할 경우 어떤 빈이 먼저 생성될 지 궁금합니다.
The text was updated successfully, but these errors were encountered:
이해하신 방식이 맞다고 생각합니다. 제가 찾아봤을 때, 위에 적어놓으신 부분은 두 애노테이션의 등록 방식의 차이를 설명하신 것 같습니다.
그 이외에도 @Bean은 메서드 레벨에서 사용되고, 주로 명시적으로 빈을 정의하고자 할 때 사용되지만, @Component는 클래스 레벨에서 사용되고, 주로 클래스 자체가 빈으로 등록되어야 할 때 사용된다는 차이가 있다고 찾았습니다.
Spring 컨테이너는 @Bean 메서드를 통해 정의된 빈을 우선적으로 처리한 후, @Component로 정의된 빈을 처리한다고 합니다.
관련해서 GPT가 만들어준 예제 코드를 가져왔습니다.
@ConfigurationpublicclassAppConfig {
@BeanpublicMyServicemyService() {
returnnewMyServiceImpl();
}
}
@ComponentpublicclassMyServiceImplimplementsMyService {
// 클래스 내용
}
앞에서 설명한 것 처럼, 위 코드에서는 @Bean으로 정의된 MyServiceImpl 빈이 우선적으로 등록되고, 그 다음에 @Component로 정의된 MyServiceImpl가 처리된다고 합니다.
ConfigurationClassParser 가 Configuration 클래스를 파싱한다. @configuration 어노테이션 클래스를 파싱하는 것이다.
⬇
ComponentScan 설정을 파싱한다.
base-package 에 설정한 패키지를 기준으로
ComponentScanAnnotationParser가 스캔하기 위한 설정을 파싱한다.
⬇
base-package 설정을 바탕으로 모든 클래스를 로딩한다.
⬇
ClassLoader가 로딩한 클래스들을 BeanDefinition으로 정의한다.
생성할 빈의 대한 정의를 하는 것이다.
⬇
생성할 빈에 대한 정의를 토대로 빈을 생성한다.
bean 어노테이션과 component 어노테이션 모두 빈 등록을 할 경우 사용하는 어노테이션으로 알고 있는데 어떤 차이가 있는지 궁금해서 질문 드립니다.
bean 어노테이션은 configuration 어노테이션이 있는 클래스의 메소드에 사용하여 해당 메소드에서 생성되는 객체를 빈으로 등록 component 어노테이션은 compoenetScan에서 지정한 패키지 안에 있는 클래스들 중 해당 어노테이션을 가지고 있으면 모두 빈으로 등록하는 방식으로 알고 있습니다.
The text was updated successfully, but these errors were encountered: