Component Scan

[SPRING] Component scan

2023. 3. 3. 03:41
728x90

기존엔 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

728x90

'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

+ Recent posts