Spring/스프링 핵심 원리 - 기본편

[컴포넌트 스캔] @Component, @Autowired - 의존 관계 자동 주입

alsruds 2023. 12. 5. 01:59
🧐강의🧐
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard

 

🫧 @ComponentScan

☑️ @Component 가 붙은 모든 클래스를 스프링 빈으로 등록 (설정 정보 없이 스프링 빈 자동 등록)

 

· 스프링 빈 이름 기본 규칙 : 클래스명 (맨 앞글자만 소문자로 변경)

          》ex) MemberServiceImpl → memberServiceImpl

          》빈 이름 직접 지정 : @Component("memberService2")

 

🫧 @Autowired

☑️ 생성자에 @Autowired 지정 시, 스프링 컨테이너가 해당 스프링 빈 의존 관계 자동 주입

기본 조회 전략 : 타입이 같은 빈 탐색 후 의존 관계 주입
파라미터가 여러 개여도 괜찮음

 

TEST

☑️ @Component, @Autowired 애노테이션 지정으로 등록된 스프링 빈 의존 관계 확인하기

 

1. main/java/hello.core/AutoAppConfig Class 생성

@Configuration
@ComponentScan(
        // AppConfig 설정 정보 제외하기
        excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)
)
public class AutoAppConfig { }

 

2. 구현체에 @Component, @Autowired 애노테이션 지정

· MemoryMemberRepository : @Component

· RateDiscountPolicy : @Component

· MemberServiceImpl : @Component & @Autowired

· OrderServiceImpl : @Component & @Autowired

 

3. test/java/hello.core/scan Package 생성

 

4. scan 패키지에 AutoAppConfigTest Class 생성

public class AutoAppConfigTest {

    @Test
    void basicScan() {
        AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class);
        MemberService memberService = ac.getBean(MemberService.class);
        assertThat(memberService).isInstanceOf(MemberService.class);
    }
}

 

· 테스트 결과

잘 동작한다