///////
Search
👩🏻

@Bean과 @Component은 각각 언제 사용되고 어떤 차이점을 가지나요?

@controller 같은 MVC 관련 애노테이션에는 @component 가 달려 있다.
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Component public @interface Controller { }
Java
복사
configuration 관련 객체들은 @Bean/@component 중 선택 하여 객체를 빈으로 등록 할 수 있다.
Bean - 외부 라이브러리 사용 할 때. 이 때, component 사용하면 의존관계 주입 및 컴파일 과정에서 에러남
Component - 외부 라이브러리 사용 안 할 때 == 사용자가 만든 임의의 클래스

@Bean

개발자가 컨트롤이 불가능한 외부 라이브러리들을 Bean으로 등록하고 싶은 경우에 사용된다.
메소드 또는 애노테이션 단위에 붙일 수 있다.

@Component

개발자가 직접 컨트롤이 가능한 클래스의 경우에 사용된다.
클래스 또는 인터페이스 단위에 붙일 수 있다.
스프링이 런타임시에 컴포넌트 스캔을 하여 자동으로 빈을 찾고 등록하게 한다.

코드로 살펴보기

// bean @Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Bean { @AliasFor("name") String[] value() default {}; @AliasFor("value") String[] name() default {}; boolean autowireCandidate() default true; String initMethod() default ""; String destroyMethod() default AbstractBeanDefinition.INFER_METHOD; }
Java
복사
// component @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Indexed public @interface Component { String value() default ""; }
Java
복사