스프링빈을 등록하기 위해서 @Bean(자바코드), (XML) 등을 통해 설정정보에 등록하고싶은 스프링빈을 직접 코드로 작성하는 것 외에 다른 방법은 없을까?
-> 스프링은 자동으로 스프링빈을 등록하는 컴포넌트 스캔 기능을 제공
@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 어노테이션이 붙은 모든 클래스를 자동으로 스프링빈으로 등록해줌
- 스프링빈의 이름은 기본적으로 클래스명을 사용(맨 앞글자만 소문자로)
@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) 와 동일한 동작원리를 지니는 것