Back-end/Spring

[Spring] @Bean 과 @Component 차이

 

🧐 @Bean 과 @Component 사용하는 이유?

IoC Container는 @Configuration, @Bean, @Component, @Repository, @Service, @Controller가 달린 클래스를

감지하며 빈을 가져오기 위해 빈 스캐닝을 합니다.

 

대표적으로 빈으로 사용 할 수 있도록 해주는 어노테이션으로

@Bean@Component이 있다.

(@Configuration은 구성클래스를 만들 때 사용, @Repository, @Service, @Controller는 @Component에 속해있다.)

 

😊@Bean vs @Component

 

👉 @Bean

  •   @Bean은 개발자가 직접 제어가 불가능한 외부 라이브러리를 사용할 때 사용한다.
  •   @Configuration을 선언한 클래스 내부에서 사용해준다.
  •   즉, 개발자가 작성한 메소드를 통해 반환되는 객체를 Bean으로 만든다.

< 개발자가 직접 제어가 불가능한 외부 라이브러리를 사용한 경우 >

@Configuration
public class ExampleConfig {
	
    @Bean
    public ArrayList<String> array(){
    	return new ArrayList<String>();
    }
}

 

< 개발자가 만들어준 클래스를 import해 사용한 경우 >

@Configuration
public class ExampleConfig {
	
    @Bean(name="mybean")
  	public Product aaa(){
          Battery p1 = new Battery("AAA", 2.5);
          p1.setRechargeable(true);
          return p1;
   	}
}

 

  • name 속성을 주지 않으면 자동으로 빈의 이름(Bean id)으로 'aaa'가 생성된다(대문자 없애고 소문자로만.)
  • name 속성을 주면 자동으로 빈의 이름(Bean id)으로 2번째 예시와 같이 'mybean'이 생성된다.

 

👉 @Component

  • @Component는 개발자가 직접 작성한 Class를 Bean으로 등록 할 수 있게 만들어 준다.
  • 즉 개발자가 작성한 class를 Bean으로 만든다.
@Component(value="mybean")
public class Example {
	puiblic Example(){
    	System.out.println("Hello world");
    }
}

 

  • Bean id를 지정해줄 때는 name 속성이 아닌 value 속성을 사용해 Bean id를 지정해준다.

정리 

 

참고 문서 : 

스프링5 레시피 (마틴 데이넘, 다니엘 루비오, 조시 롱 저/이일웅 역)

 

 

 

반응형