컴포넌트 스캔

Mina Park·2023년 10월 11일

스프링빈을 등록하기 위해서 @Bean(자바코드), (XML) 등을 통해 설정정보에 등록하고싶은 스프링빈을 직접 코드로 작성하는 것 외에 다른 방법은 없을까?
-> 스프링은 자동으로 스프링빈을 등록하는 컴포넌트 스캔 기능을 제공


1. 컴포넌트 스캔
@Configuration
@ComponentScan( //@Component annotation이 붙은 클래스를 자동으로 스프링빈으로 등록
    excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)
)
public class AutoAppConfig {


}
@Component
public class MemoryMemberRepository implements MemberRepository {

    private static Map<Long, Member> store = new HashMap<>();

    @Override
    public void save(Member member) {
        store.put(member.getId(), member);
    }

    @Override
    public Member findById(Long memberId) {
        return store.get(memberId);
    }
}

  • @ComponentScan 은 @Component 어노테이션이 붙은 모든 클래스를 자동으로 스프링빈으로 등록해줌
    • 스프링빈의 이름은 기본적으로 클래스명을 사용(맨 앞글자만 소문자로)

2. 의존관계 주입
  • 설정정보가 없는 상태에서 그렇다면 의존관계 주입은 어떻게 할 수 있을까?
  • @Autowired 어노테이션을 통해 클래스 레벨에서 해결
@Component
public class OrderServiceImpl implements OrderService {

    private final MemberRepository memberRepository;
    private final DiscountPolicy discountPolicy;

    @Autowired
    public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
        this.memberRepository = memberRepository;
        this.discountPolicy = discountPolicy;
    }

    @Override
    public Order createOrder(Long memberId, String itemName, int itemPrice) {
        Member member = memberRepository.findById(memberId);
        int discountPrice = discountPolicy.discount(member, itemPrice);

        return new Order(memberId, itemName, itemPrice, discountPrice);
    }
}

  • @Autowired 어노테이션을 생성자에 붙이면 스프링 컨테이너가 자동으로 해당 스프링빈을 찾아서 의존관계를 주입해줌
    • 기본적으로 타입이 동일한 빈을 찾아서 주입
    • getBean(MemberRepository.class) 와 동일한 동작원리를 지니는 것

0개의 댓글