@Configuration
public class AppConfig {
@Bean
public MemberRepository memberRepository(){
return new MemoryMemberRepository();
}
@Bean
public MemberService memberService(){
return new MemberServiceImpl(memberRepository());
}
}
기존에 AppConfig 팩토리 빈 내에서 빈으로 등록할 클래스를 등록하고 직접 수동으로 의존관계 주입
@Configuration
@ComponentScan(
excludeFilters = @ComponentScan.Filter(
type = FilterType.ANNOTATION, classes = Configuration.class)
)
public class AutoAppConfig {
}
AutoAppConfig에는 기존의 AppConfig와의 충돌을 막기위해 @ComponenetScan
의 filter를 사용했다.
이 팩토리 빈에는 빈으로 등록할 객체의 정보도 없고 의존관계에 대한 정보 또한 존재하지 않는다.
그렇기 떄문에 빈으로 등록할 클래스에 @Component
라고 명시를 하고, 생성자에 @Autowired
라고 명시해 스프링 컨테이너에서 해당 타입에 맞는 빈을 자동주입한다.
@Component
public class MemoryMemberRepository implements MemberRepository{
...
@Component
public class MemberServiceImpl implements MemberService{
private final MemberRepository memberRepository;
@Autowired
public MemberServiceImpl(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
...
당연히 의존관계로 주입될 객체(MemoryMemberRepository
) 또한 빈에 등록이 되어 있어야하기 때문에 @Component
를 붙여야 한다.
@ComponentScan
은 @Component
가 붙은 모든 클래스를 스프링 빈으로 등록한다.
빈 이름의 기본 전략은 memoryMemberRepository, memberServiceImpl 와 같다.
빈 조회의 기본 전략은 자료형을 우선한다.