Spring/스프링 핵심 원리 - 기본편

[컴포넌트 스캔] 필터 - includeFilters, excludeFilters

alsruds 2023. 12. 7. 02:39
🧐강의🧐
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard

 

  • includeFilters : 컴포넌트 스캔 대상을 추가로 지정
  • excludeFilters : 컴포넌트 스캔 대상에서 제외할 대상 지정

 

TEST

☑️ 필터를 사용해 등록한 빈 확인하기

 

1. test/java/hello.core/scan/filter Package 생성

2. filter 패키지에 MyIncludeComponent Interface 생성

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public interface MyIncludeComponent { }

 

3. filter 패키지에 MyExcludeComponent Interface 생성

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public interface MyExcludeComponent { }

 

4. filter 패키지에 BeanA, BeanB Class 생성

· BeanA : 컴포넌트 스캔에 추가할 대상 클래스 (@MyIncludeComponent)

· BeanB : 컴포넌트 스캔에서 제외할 대상 클래스 (@MyExcludeComponent)

// BeanA
@MyIncludeComponent
public class BeanA { }

// BeanB
@MyExcludeComponent // 컴포넌트 스캔 대상에서 제외
public class BeanB { }

 

5. filter 패키지에 ComponentFilterAppConfigTest Class 생성

public class ComponentFilterAppConfigTest {

    @Test
    void filterScan() {
        ApplicationContext ac = new AnnotationConfigApplicationContext(ComponentFilterAppConfig.class);
        BeanA beanA = ac.getBean("beanA", BeanA.class);
        assertThat(beanA).isNotNull();

        assertThrows(
                NoSuchBeanDefinitionException.class,
                () -> ac.getBean("beanB", BeanB.class)
        );
    }

    @Configuration
    @ComponentScan(
            includeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = MyIncludeComponent.class),
            excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = MyExcludeComponent.class)
    )
    static class ComponentFilterAppConfig {}
}

➡️ includeFilters : BeanA 가 스프링 빈에 등록됨

➡️ excludeFilters : BeanB 는 스프링 빈에 등록되지 않음

 

FilterType 옵션

  • ANNOTATION : 기본값 & 애노테이션 인식 후 동작 (생략 가능)
  • ASSIGNABLE_TYPE : 지정한 타입 & 자식 타입 인식 후 동작
  • ASPECT J : AspectJ 패턴 사용
  • REGEX : 정규 표현식
  • CUSTOM : 인터페이스(TypeFilter) 구현에서 처리

 

참고
- includeFilters 를 사용할 일은 거의 없음 (@Component 가 해결)
- excludeFilters 간혹 사용
- 최근 스프링 부트 : 컴포넌트 스캔 (기본) → 스프링 기본 설정으로 사용하는 것 권장