-
컴포넌트 스캔스프링/스프링 기본이론 2023. 1. 30. 22:58
컴포넌트 스캔이란 빈을 따로 등록하지 않아도 @Component라는 어노테이션이 붙은 객체들을 스프링 컨테이너가 관리해주는 기능이다.
@Configuration @ComponentScan( excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class) ) public class AutoAppConfig { }
classes = Configuration.class는 AppConfig를 빼주는 용도이다. 보통 설정 정보를 컴포넌트 스캔 대상에서 제외하지 않지만 기존 예제 코드를 유지하기 위해서 이 클래스에서 제외하는 것을 했다.
코드를 보면 알겠지만 @Bean으로 따로 빈을 등록해주지 않았다.
- 참고로 스프링 부트의 대표 시작 정보인 @SpringBootApplication안에 @ComponentScan이 들어있다. 스프링부트를 사용할 때에는 @ComponentScan을 따로 해줄 필요가 없다.
@Component도 따로 해줄 필요가 없는데, 왜냐면 @Controller, @Service, @Repository, @Configuration에 이미 들어가 있기 때문이다. @Autowired도 @RequiredArgsConstrucotr라는 롬복에서 지원하는 어노테이션으로 자동 주입이 가능하긴 하다. 그래도 사용하는 기능의 원리는 이해해야하기 때문에 공부는 꼭 필요하다.
@Component
@Component public class MemoryMemberRepository implements MemberRepository{ .... } @Component public class MemberServiceImpl implements MemberService { .... } @Component public class RateDiscountPolicy implements DiscountPolicy { .... }
사용하는 구현체들의 선언부에 @Component라는 어노테이션을 붙인다. 하지만 이러한 방식은 스프링 빈에 등록해줄뿐, 의존관계 주입은 해주지 않는다.
@Autowired
@Component public class MemberServiceImpl implements MemberService { @Autowired public MemberServiceImpl(MemberRepository memberRepository) { this.memberRepository = memberRepository; } .... }
생성자에 @Autowired라는 어노테이션을 넣으면 해당하는 memberRepository의 구현체를 자동으로 의존관계 주입시켜준다.
@Component public class OrderServiceImpl implements OrderService{ @Autowired public OrderServiceImpl(MemberRepository memberRepository, @MainDiscountPolicy DiscountPolicy discountPolicy) { this.memberRepository = memberRepository; this.discountPolicy = discountPolicy; } .... }
OrderServiceImpl에도 @Autowired를 통해서 자동으로 의존관계 주입을 해준다.
'스프링 > 스프링 기본이론' 카테고리의 다른 글
빈이 2개 이상일 경우에 의존관계 주입 (0) 2023.02.01 의존관계 자동 주입 (0) 2023.01.31 @Configuration과 싱글톤 패턴 (0) 2023.01.30 스프링을 이용한 싱글톤 패턴 (0) 2023.01.30 싱글톤 패턴의 개념 (0) 2023.01.28