Spring에서 Bean을 등록하는 방법
스프링에서 Bean을 등록하는 방법은 일반적으로 두 가지 존재한다.
1. @Component, @Controller, @Service, @Repository와 같은 어노테이션을 클래스에 선언하는 방법.
@Component
public class TestBean{
public void print(){
System.out.println("빈 등록 테스트");
}
}
2. @Configuration을 클래스위에 선언하고, 해당 클래스 안에서 @Bean을 통해 등록하는 방법.
public class TestBean{
public void print(){
System.out.println("빈 등록 테스트");
}
}
---------------------------------------------------
@Configuraion
public class ConfTest{
@Bean
public TestBean testBean(){
return new TestBean();
}
}
@Configuration과 @Component류의 차이점
"What is the difference between @Configuration and @Component in Spring?"
StackOverflow에 올라온 답변에 의하면
@Configuration은 하나 이상의 @Bean 메소드를 선언하고, 해당 빈을 Spring 컨테이너에 의해 처리될 수 있음을 나타낸다.
@Component는 해당 클래스가 CompoentScan의 대상임을 표시하고, Spring 컨테이너에 등록된다고 한다.
@Configuration이란 무엇인가??
그렇다면, @Configuration에 대해 자세히 살펴보자.
@Configuration의 내부를 살펴보면 특이한 것을 발견할 수 있다.
@Configuration 안에는 결국 @Compenent가 선언되어 있다.
@Controller, @Service, @Repository 역시 같은 형태를 가지고 있다.
즉, @Configuration 역시 Spring 컨테이너에 등록되는 Bean 중 하나가 된다는 것이다.
@Bean이 선언된 메소드는 무엇을 리턴할까??
@Configuration도 결국 @Component를 통해 Spring 컨테이너에 등록된 Bean이라는 것을 확인했다.
그런데, 일반적으로는 @Configuration 클래스 안 메소드에 @Bean을 통해 Bean을 등록한다.
그렇다면 @Bean 메소드는 무엇을 리턴하는 것일까?
@Bean 메소드의 형태는 객체를 생성하여 리턴하는 것 처럼 보인다.
하지만, Spring에 등록된 Bean을 리턴한다.
@Bean 메소드의 리턴 값은 항상 Bean일까?
@Configuration으로 등록된 클래스의 @Bean 메소드 리턴 값은 Spring 컨테이너에 등록된 Bean이다.
그렇다면, 해당 클래스의 메소드는 항상 Bean을 리턴할까??
그렇지는 않다. Configuration으로 등록된 Bean에서 메소드를 호출할 때만 Bean을 리턴한다.
@Bean은 @Configuration에서만 등록이 가능할까??
Bean을 등록하는 것은 ComponentScan에 의해 @Bean이 선언된 메소드를 찾아 등록하는 것이기 때문에
@Component에서 @Bean을 이용한 Bean 등록이 가능하다.
다만, @Component로 Bean을 등록하는 메소드에서 리턴하는 값은 Bean이 아니다.
'Spring > Spring 팁' 카테고리의 다른 글
Kotlin과 all-open (0) | 2022.02.14 |
---|---|
Kotlin과 Spring Bean (0) | 2022.02.06 |
Spring Boot - Validation (0) | 2021.09.23 |
[ Spring Security ] Spring Security0 (2) | 2021.08.30 |
댓글