스프링은 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 @ComponentScan이라는 기능을 제공한다.
또한 의존관계도 자동으로 주입하는 @Autorwired라는 기능을 제공한다.
생성자에 @Autowired를 넣어 의존관계를 주입해보자💨
@Component
public class MemberServiceImpl implements MemberService{
private MemberRepository memberRepository;
@Autowired
public MemberServiceImpl(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
[ComponentScan]
스프링 컨테이너가 @Component 어노테이션이 붙은 빈들을 찾는다.
생성자의 파라미터 타입(위의 경우 MemberRepository)을 찾아서 가져온다.
같은 타입이 여러개 있으면? 충돌이 나게 된다 :(
<스프링 빈의 충돌>
같은 이름의 자동 생성 빈 vs 자동 생성 빈일 경우 충돌이 난다
그러나 같은 네임의 자동 생성 빈 vs 수동 생성 빈은 덮어쓰게 되나 잡기 어려운 버그가 만들어진다.
그래서 최근에는 스프링 부트에서 자동 생성 빈과 수동 생성 빈이 충돌될 경우 오류가 나도록 설정되었다.
1. basePackages
basePackages = "탐색 패키지 위치 지정" -> 모든 자바 코드, 라이브러리를 탐색시 시간 낭비..
지정하지 않으면 ComponentScan이 붙은 설정 클래스가 포함된 패키지 위치로 지정된다.
@ComponentScan(
excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = {Configuration.class}),
basePackages= "hello.core",
basePackageClasses = AutoAppConfig.class
)
[ComponentScan의 대상]
@Component / @Controller / @Service / @Repository / @Configuration
2. Filters
excludeFilters / includeFilters
아래와 같이 사용한다.
@ComponentScan(includeFilters = @Filter(type = FilterType.ANNOTATION, classes = MyIncludeComponent.class),
excludeFilters = @Filter(type = FilterType.ANNOTATION, classes = MyExcludeComponent.class))
@Configuration
static class ComponentFilterAppConfig {
}
<FilterType>
ANNOTATION: annotation을 인식해서 실행(default) (주로 사용)
ASSIGNABLE_TYPE: 지정한 타입과 자식 타입을 인식해서 동작
ASPECTJ : AspectJ 패턴 사용
REGEX : 정규 표현식
CUTSOM : TypeFilter이라는 인터페이스를 구현해서 처리한다.
'Spring' 카테고리의 다른 글
스프링 핵심 원리 - 기본편(빈 스코프) (0) | 2022.04.28 |
---|---|
스프링 핵심 원리 - 기본편(빈 생명주기 콜백) (0) | 2022.04.27 |
스프링 핵심 원리 - 기본편(의존관계 자동 주입) (0) | 2022.04.27 |
스프링 핵심 원리(기본편) - 스프링 컨테이너와 스프링 빈 (0) | 2022.04.18 |
스프링 핵심 원리(기본편) - 객체 지향 원리 적용 (0) | 2022.04.17 |