id : 등록할 빈의 이름 class : 패키지명을 포함한 빈으로 정의할 클래스 scope : 빈의 스코프(singleton, prototype, reqeust...), 설정하지 않으면 기본적으로singleton이 적용된다. autowired : 기본적으로 타입과 이름, 생성자등이 있다.(autowired방법)
constructor-arg : 생성자 주입을 할 경우 사용한다. 생성자의 매개변수를 등록해야한다.
constructor-arg를 사용하는 빈들은 아래와 같이 생성자 주입이 들어있다.
//[MemberServiceImpl]
public class MemberServiceImpl implements MemberService{
private final MemberRepository memberRepository;
public MemberServiceImpl(MemberRepository memberRepository){
this.memberRepository = memberRepository;
}
...
}
//[OrderServiceImpl]
public class OrderServiceImpl implements OrderService{
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy){
this. memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
...
}
XML 설정 테스트
public class XmlAppContext {
@Test
void xmlAppContext(){
ApplicationContext ac = new GenericXmlApplicationContext("appConfig.xml");
MemberService memberService = ac.getBean("memberService", MemberService.class);
assertThat(memberService).isInstanceOf(MemberService.class);
}
}
XML문서는 길어지면 가독성이 떨어지고 String형 문서이기때문에 오타를 확인하거나 디버깅하기가 어렵다.
Java 설정 방식은 컴파일러의 도움을 받기 때문에 설정 정보 오류를 미리 알 수 있다.
1번에서 작성한 xml config파일을 java설정으로 바꿀 수 있다.
@Configuration
public class AppConfig {
@Bean
public MemberService memberService(){
return new MemberServiceImpl(memberRepository());
}
@Bean
public MemberRepository memberRepository(){
return new MemoryMemberRepository();
}
@Bean
public OrderService orderService(){
return new OrderServiceImpl(memberRepository(), discountPolicy());
}
@Bean
public DiscountPolicy discountPolicy(){
return new RateDiscountPolicy();
}
}
컴포넌트 안에 작성된 @Bean을 등록시켜 준다.
4. @SpringBootApplication
Spring boot를 사용하면 최상단에 @SpringBootApplication이 붙은 클래스가 하나 생성된다.
@SpringBootApplication은 @Configuration과 @ComponentScan을 가지고 있기 때문에 개발자가 특별한 선언을 하지 않아도 해당 클래스의 하위 패키지에 Component관련 애노테이션만 추가하면 auto-scan되어 빈이 등록된다.
@Component, @Bean의 차이점
Component와 Bean을 사용하여 등록하는 방법의 차이점을 알아보았다.
1. @Component
개발자가 직접 컨트롤이 가능한 class들을 등록할 때 사용된다.
Class Level에서 적용된다.
2. @Bean
개발자가 컨트롤이 불가능한 외부 라이브러리들을 Bean으로 등록하고 싶은 경우에 사용된다.