@ComponentScan

wangjh789·2022년 7월 24일
0

수동 주입

@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 와 같다.
빈 조회의 기본 전략은 자료형을 우선한다.

profile
기록

0개의 댓글