•
@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
복사