컴포넌트 스캔과 의존관계 자동 주입

박찬우·2023년 12월 16일
0

스프링

목록 보기
14/88

컴포넌트 스캔, 의존관계 자동 주입

  • 설정 정보가 없어도 자동으로 스프링 빈을 등록
  • 컴포넌트 스캔을 사용하려면 먼저 @ComponentScan 을 설정 정보에 붙여주면 된다.
  • @Component 애노테이션이 붙은 클래스를 스캔해서 스프링 빈으로 등록한다
  • @Autowired 애노테이션을 이용하여 의존관계를 자동 주입한다
  • AutoAppConfig
@Configuration
@ComponentScan(
        // 스프링 빈 등록시 제외할 것을 등록
        // @Configuration이 붙은 것은 제외
        excludeFilters = @ComponentScan.Filter(type= FilterType.ANNOTATION, classes = Configuration.class),
)
public class AutoAppConfig {

}
  • MemoryMemberRepository
@Component
public class MemoryMemberRepository implements MemberRepository{}
  • RateDiscountPolicy
@Component
public class RateDiscountPolicy implements DiscountPolicy{}
  • MemberServiceImpl
@Component
public class MemberServiceImpl implements MemberService{

    private final MemberRepository memberRepository;

    @Autowired
    public MemberServiceImpl(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }
}
  • OrderServiceImpl
@Component
public class OrderServiceImpl implements OrderService{

    //private final MemberRepository memberRepository = new MemoryMemberRepository();
    //private final DiscountPolicy discountPolicy = new FixDiscountPolicy();
    //private final DiscountPolicy discountPolicy = new RateDiscountPolicy();

    private final MemberRepository memberRepository;
    private final DiscountPolicy discountPolicy;

    @Autowired
    public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
        this.memberRepository = memberRepository;
        this.discountPolicy = discountPolicy;
    }
}
  • Test
    @Test
    void basicScan() {
        ApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class);
        MemberService memberService = ac.getBean(MemberService.class);

        // 정상적으로 잘 등록됨
        assertThat(memberService).isInstanceOf(MemberService.class);
    }

@ComponentScan

  • @Component 가 붙은 모든 클래스를 스프링 빈으로 등록
  • 스프링 빈의 기본 이름은 클래스명을 사용하되 맨 앞글자만 소문자를 사용
  • 빈 이름 기본 전략 : MemberServiceImpl -> memberServiceImpl
  • 빈 이름 지정 전력 : @Component("memberServiceImpl")

@Autowired

  • 생성자에 @Autowired 를 지정하면, 스프링 컨테이너가 자동으로 해당 스프링 빈을 찾아서 주입
  • 기본 조회 전략은 타입이 같은 빈을 찾아서 주입
  • getBean(MemberRepository.class) 와 동일
profile
진짜 개발자가 되어보자

0개의 댓글