Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

Component 스캔, @Autowired 본문

인프런/[인프런] Spring 핵심원리 이해

Component 스캔, @Autowired

Seung__ 2021. 7. 28. 20:37
  • 이 전 까지는 스프링 빈을 등록하기 위해서 @Bean을 사용하여 직접 나열했다.
  • 근데 너무 귀찮지 않음?????
  • 스프링에서는 자동으로 등록하는 Component 스캔기능을 제공함
  • 또한 의존관계를 자동으로 주입하는 @Autowired로 제공

 

1. @ComponentScan


  • 컴포넌트 스캔을 사용하기 위해 @ComponentScan를 적용
  • @Component가 붙은 클래스를 찾아서 bean으로 등록함
  • @Configuration
    @ComponentScan(
            //스캔에서 제외할 것 -->@Configuration @Component임, AppConfig나 TestConfig제외하기 위해.
            excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)
    )
    public class AutoAppConfig {
    
    
    }
  • excludeFilters를 적용하면 컴포넌트 스캔 시 제외할 annotaion을 지정할 수 있다.
  • 여기서는 @Configuration도 @Component이기 때문에, @Configuration이 적용된, AppConfig 등을 제외위한 목적. 
  • 일반적으로 @Configuration 제외하지 않는다!
  • 이전에 AppConfig처럼 하나하나 나열하지 않아도 된다
  • @ComponentScan은 @Component붙은 모든 클래스를 스프링 빈으로 등록
  • 이 때 스프링 빈의 기본 이름은 클래스 명을 사용! 하지만 맨 앞글자는 소문자로 사용함.
    ex) MemberServiceImpl --> memberServiceImpl

 

2.@Component 붙여주자.


@Component
public class MemberServiceImpl implements MemberService{
@Component
public class RateDiscountPolicy implements DiscountPolicy{
@Component
public class MemoryMemberRepository implements  MemberRepository{
  • 흠 그런데... 의존관계를 어떻게 주입하지...?
  • AppConfig에는 생성자를 통해 의존관계를 주입할 수 있었다.
  • ComponentScan을 사용하면 AppConfig와 같이 설정 정보 자체가 없다.
  • 따라서 @Autowired를 통해 의존관계를 주입해줘야 한다.

 

3. @Autowired


  • 생성자에 @Autowired를 붙여주면 스프링이 자동으로 의존관계 주입.
  • 스프링 컨테이너가 생성자에 필요한 같은 타입의 스프링 빈을 찾아서 주입해줌.
    @Component
    public class OrderServiceImpl implements OrderService{
    
        private final MemberRepository memberRepository;
        //private final DiscountPolicy discountPolicy = new RateDiscountPolicy();
        private final DiscountPolicy discountPolicy; //이렇게하면 인터페이스에만 의존함.
    
        @Autowired
        public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
            this.memberRepository = memberRepository;
            this.discountPolicy = discountPolicy;
        }​

4. Test


  • AnnotationConfigAppplicationContext 사용하는 것은 동일
  • 단 설정 정보로 AutoAppConfig를 넘겨준다.
public class AutoAppConfigTest {

    @Test
    void basicScan(){
        AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class);

        MemberService memberService = ac.getBean(MemberService.class);
        Assertions.assertThat(memberService).isInstanceOf(MemberService.class);
    }
}

 

 

4. GitHub : 210728 ComponentScan


 

 

GitHub - bsh6463/SpringCoreFunction

Contribute to bsh6463/SpringCoreFunction development by creating an account on GitHub.

github.com

 

Comments