[Spring] Bean 등록 방법(@Bean, @Component)
이 글은 공부를 하면서 알게 된 내용들을 기록하는 글 입니다. 오류나 고쳐야 할 사항들이 있다면 지적 부탁드립니다!
<순차>
1. @Configuration
2. @Bean을 통한 빈 등록
3. @ComponentScan, @Component를 통한 빈 등록
⛅️ @Configuration
스프링이 뜰 때에 스프링은 자동으로 @Configuration이 붙은 클래스를 찾아서 구성 정보로 사용한다.
이 클래스에서 Bean을 등록하고 의존관계주입을 처리할 수 있다.
AppConfig라는 클래스에 @Configuration 어노테이션을 붙여 구성 정보로 사용한다고 가정하자.
@Configuration을 붙이면, CGLIB 라이브러리가 AppConfig 클래스를 상속받아 싱글톤을 보장하는 클래스(AppConfig@CGLIB)를 생성한다.
(자세한 내용은 이전 포스팅(https://m42-orion.tistory.com/98)에서 알아보았다.)
빈을 스프링 컨테이너에 등록하는 방법에는 두 가지가 있다.
@Bean을 통해 직접 등록하는 방법과 @ComponentScan을 이용하여 자동으로 빈 등록하는 방법이 있다.
⛅️ @Bean을 통한 빈 등록
@Configuration
public class AppConfig {
@Bean
public MemberRepository memberRepository(){
return new MemoryMemberRepository();
}
}
@Configuration 구성 정보에 @Bean 어노테이션을 통해 스프링 컨테이너에 직접 빈으로 등록할 수 있다.
빈 객체로 등록하고 싶은 메서드의 위에 @Bean 어노테이션을 추가하면 된다.
스프링 컨테이너에 <key(빈 이름), value(빈 객체)> 쌍으로 저장한다.
key(빈 이름)에는 메서드의 이름(memberRepository)를, value(빈 객체)에는 실제 반환하는 객체를 담아 스프링 컨테이너에 저장한다.
⛅️ @ComponentScan, @Component를 통한 빈 등록
@Configuration이 붙은 클래스에 @ComponentScan를 붙여 @Component가 붙은 객체를 찾아 자동으로 빈 등록하는 방법이 있다.
1. 우선 AppConfig에 @ComponentScan 어노테이션을 추가로 붙인다.
@Configuration
@ComponentScan
public class AppConfig {
...
}
2. 빈 객체로 등록하고 싶은 클래스에 @Component 어노테이션을 추가한다.
@Component 어노테이션이 추가되면, 컴포넌트 스캔의 대상이 된다.
@Component
public class MemoryMemberRepository implements MemberRepository {
...
}
스프링은 @Configuration 어노테이션을 가진 클래스를 우선 찾는다.
해당 클래스에 @ComponentScan 어노테이션이 있다면 @Component 어노테이션이 있는 클래스들을 찾아 스프링 컨테이너에 빈으로 등록한다.