DSlog

전체 글

Spring @Component vs @Bean

2021, Apr 22    



@Component 와 @Bean 의 차이를 간단하게 공부해보았습니다.


@Component 와 @Bean

스프링 컨테이너에 빈으로 등록하도록 하는 어노테이션입니다.

빈이란?
  • Spring IOC 컨테이너가 관리하는 자바객체를 말합니다.

@Component

개발자가 직접 작성한 클래스를 빈으로 등록시켜주는 어노테이션입니다.

예시


@Component(value="myexam1")
@RequiredArgsConstructor
public class ExamClass {
    private final RestTemplate restTemplate;
    private final HttpEntity<String> requestEntity;

    public String getExam(){
        ResponseEntity<String> responseEntity = restTemplate.exchange("url", HttpMethod.GET, requestEntity, String.class);
        String response = responseEntity.getBody();
        return "{data: " + response + "}";
    }
}
  • 빈으로 등록할 클래스에 @Component를 사용하면 됩니다
  • 빈의 id를 따로 설정하지 않으면 클래스 이름으로 등록이 됩니다.(camelCase)

Component.java

package org.springframework.stereotype;
...
...
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Indexed
public @interface Component {
...
	String value() default "";
}
  • @Target 을 보면 클래스에만 선언 할 수 있음을 알 수 있습니다. (class, interface, enum)


@Bean

개발자가 제어 불가능한 외부라이브러리를 빈으로 만드는 어노테이션입니다.

예시

// @Configuration :  컨테이너에게 1개 이상의 Bean을 등록하고 있는 클래스임을 명시해주는 것
@Configuration
@EnableAsync
public class AsyncThreadConfiguration {
    @Bean(name="myexam2")
    public Executor asyncThreadTaskExecutor() {
...
...
        return new ThreadPoolTaskExecutor();
    }
}
  • 객체를 반환하는 메소드를 만들고 메소드에 @Bean 을 붙여주면 됩니다.
  • 빈의 id를 따로 설정하지 않으면 메소드 이름으로 등록이 됩니다.(camelCase)


Bean.java

package org.springframework.context.annotation;
...
...
// @Target : 어노테이션을 작성할 위치입니다.
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Bean {

	@AliasFor("name")
	String[] value() default {};
...
...

  • @Target을 보면 메소드에 선언해야함을 알 수 있습니다.


Reference

Spring - @Bean 어노테이션과 @Component 어노테이션(DI) - 2