Component Scan
-
[SPRING] Component scan2023.03.03
[SPRING] Component scan
기존엔 Appconfig.class에서 Spring bean으로 사용하려면 @Bean을 붙여줬지만 Component Scan을 사용하면 @Bean 없이 자동적으로 bean이 추가되도록 할수있다.
@Configuration
@ComponentScan(
basePackages = "hello.core.member"
)
public class AutoAppConfig {
}
@Component
public class MemberServiceImpl implements MemberService{
...
@Component Scan을 설정정보에 붙이면 ComponentScan을 사용할수 있게 된다.
이렇게 되면 @Component설정정보를 가진 모든 클래스들이 (ex)MemberServiceImpl...) bean으로 등록된다.
❗❗이때 @Configuration설정정보가 들어있는것들은 모두 Component Scan의 scan대상이된다. 이 이유는 @Configuration소스코드를 열어보면 @Component 어노테이션이 붙어있기 때문이다.
@Component
public class OrderServiceImpl implements OrderService {
...
@Autowired
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy
discountPolicy) {
...
}
}
이때 의존관계주입은 @Autowired를 사용하면된다
여기까지 정리를 해보자면 Component Scan에 의해 Component가 붙은 클래스를 bean으로 등록을 해준다 (bean의 이름은 맨앞글자만소문자+기존이름 ex)OrderServiceImpl -> orderServiceImpl) 의존관계 주입을 할때는 @AutoWired를 사용한다.
✔탐색 위치와 기본 스캔 대상
우리가 Component Scan을 사용한다 가정했을때 스캔할 범위를 지정해줘야한다. (매번 모든 클래스를 스캔하기엔 비효율 적이기 때문에)
@ComponentScan(
basePackages = "hello.core",
}
basePackages : "hello.core" 를 포함한 하위 패키지까지
basePackageClasses: 클래스를 포함하는 패키지랑 하위 패키지 까지
default: @ComponentScan이 붙은 클래스의 패키지부터
따라서 default를 최상단 패키지에두면 편하며 이 방법 사용을 권장한다.
📌추가적으로 스프링 부트를 사용하면 스프링 부트의 대표 시작 정보인 @SpringBootApplication 를 이 프로젝트 시작 루트 위치에 두는 것이 관례이다
✔ 필터
@Configuration
@ComponentScan(
basePackages = "com.example.package",
includeFilters = {
@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = MyComponent.class)
@ComponentScan.Filter(type = FilterType.REGEX, pattern = ".*AnotherComponent$")
},
excludeFilters = {
@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = ExcludeComponent.class),
@ComponentScan.Filter(type = FilterType.CUSTOM, value = MyFilter.class)
}
)
public class AppConfig { // ... }
includeFilters : 컴포넌트 스캔 대상을 추가로 지정할때 사용한다.
excludeFilters : 컴포넌트 스캔에서 제외할 대상을 지정할때 사용한다.
ANNOTATION
: 지정된 어노테이션이 포함되는 클래스를 스캔합니다. (기본값 생략가능)ASSIGNABLE_TYPE
: 지정된 타입과 호환되는 클래스를 스캔합니다.ASPECTJ
: AspectJ 패턴을 사용하여 클래스를 스캔합니다.REGEX
: 정규식 패턴을 사용하여 클래스를 스캔합니다.CUSTOM
: 사용자 정의 필터를 지정합니다.
✔중복 등록과 충돌
경우의수1) 자동 빈 등록 vs 자동 빈 등록 (스프링에서 오류발생 ConflictingBeanDefinitionException)
경우의수2) 수동 빈 등록 vs 자동 빈 등록 (이 경우 수동 빈 등록이 우선권을 가진다.) 수동 빈이 자동 빈을 오버라이딩 해버린다
🙏Reference
'Spring' 카테고리의 다른 글
[SPRING] Bean Scope (0) | 2023.03.05 |
---|---|
[SPRING] Bean Life cycle, call back (0) | 2023.03.05 |
[SPRING] 의존관계 자동 주입 (1) | 2023.03.05 |
[SPRING] Singleton (0) | 2023.02.26 |
[SPRING] Spring Container, Bean (0) | 2023.02.05 |