@bean vs @component
들어가기전에
@Component
public class Pizza{
........
}
- Spring ApplicationContext : Spring이 관리하는 객체(bean이라고도함)을 들고 있는 곳
- Inversion of Control Principle(제어의 역전)에 의해 Spring은 bean객체를 모아서 필요한 곳에서 bean 객체를 사용한다. 즉 객체의 생성과 사용자의 제어권을 스프링에게 넘기는 것.
@Bean
@Configuration
class AppConfiguration{
@Bean
public User getUse(){
return new User();
}
}
- 메소드에 사용됨
> spring이 이 메소드의 결과를 Spring bean으로 저장한다.
- spring 3.0에 소개됨
@Component
- Spring이 자동적으로 탐지할 수 있는 커스터마이징된 bean
> Spring이 자동적으로 @Component로 되어 있는 클래스를 스캔하여
> 객체화한다음에 특정 의존성을 주입하여 언제든지 사용하게 해준다.
- @Controller, @Service, @Repository 모두 @Component에 포함된다
> 그럼 세가지를 쓰고 @Componenet를 안 써도 괜찮을까? 아니다. 각각 특성이 있다.
@Controller : @RequestMapping을 같이 스캔할 수 있다.
@Repository : 플랫폼 고유의 예외를 받아서 통합된 예외를 던질 수 있다.
@Service : 아직까지는 없다.
- spring 2.5에 소개됨
@Bean vs @Component
Bean | Component | |
자동 탐지 | 특정 빈을 생성하게끔 할 수 있다. | 스프링이 자동으로 탐지한다. |
스프링 컨테이너 | 스프링 컨테이너 밖에 있어도 생성 가능 | 스프링 컨테이너 밖에 있음 생성 못함 |
클래스/메소드 레벨 | 메소드에 사용 | 클래스에 사용 |
@Configuration | @Configuration으로 생성된 클래스 내부에서만 사용 [참고] 찾아보니 @Configuration 없어도 사용은 가능한데,그럴 경우매번 객체를 생성하게 되므로 권장하지 않음. |
@Configuration으로 생성된 클래스 아니더라도 사용 가능함 |
유스케이스 | - 개발자가 컨트롤이 불가능한외부 라이브러리 사용 (= 소스코드가 없어서 클래스로 정의 못할때) |
- 개발자가 직접 컨트롤이 가능한내부 클래스에 사용 |
참고링크
- @Configuration 안에 @Bean을 사용해야 하는 이유 https://mangkyu.tistory.com/234
- Difference between @Bean and @Component annotation in Spring. https://www.tutorialspoint.com/difference-between-bean-and-component-annotation-in-spring
- Spring @Component Annotation https://www.baeldung.com/spring-component-annotation
- What's the difference between @Component, @Repository & @Service annotations in Spring? https://stackoverflow.com/questions/6827752/whats-the-difference-between-component-repository-service-annotations-in