@Bean이나 <bean>등을 통해 직접 등록할 스프링 빈을 나열했다.@Autowired라는 기능을 통해 자동으로 주입한다.코드로 컴포넌트 스캔과 의존관계 자동 주입을 알아보자. 먼저 기존 AppConfig.java는 과거 코드와 테스트 유지를 위해 남겨두고, 새로운 AutoAppConfig.java를 만들어서 진행한다.
package hello.core;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
@Configuration
//
@ComponentScan(
excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)
//뺄 내용을 지정. 기존에 만들어둔 Configuration을 중복등록하기 때문이다.
)
public class AutoAppConfig {
}
<aside> 💡 컴포넌트스캔을 사용하면 @Configuration이 붙은 설정 정보도 자동으로 등록되기 때문에, AppConfig, TestConfig 등 이전에 연습을 하며 만들어두었던 설정도 함께 등록되고 실행된다. 그래서 excludeFilters를 통해 기존 설정 정보는 스캔 대상에서 제외했다. 보통 설정 정보를 컴포넌트 스캔 대상에서 제외하지는 않지만, 예제 코드를 최대한 유지하고 남기자는 차원에서 이 방법 선택.
</aside>
@Component
public class MemoryMemberRepository implements MemberRepository {}
@Component
public class RateDiscountPolicy implements DiscountPolicy {}
@Component
public class MemberServiceImpl implements MemberService {
private final MemberRepository memberRepository;
@Autowired
public MemberServiceImpl(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
}
AppConfig에서는 @Bean 으로 직접 설정 정보를 작성했고, 의존관계도 직접 명시했다. 이제는 이런 설정 정보 자체가 없기 때문에, 의존관계 주입도 이 클래스 안에서 해결해야 한다.@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;
}
}