티스토리 뷰

스프링 핵심 원리/컴포넌트 스캔

필터

jeongdalma 2020. 12. 27. 20:56
  • includeFilters : 컴포넌트 스캔 대상을 추가로 지정한다.
  • excludeFilters : 컴포넌트 스캔에서 제외할 대상을 지정한다.

 

MyIncludeComponent , MyExcludeComponent  (Annotation)

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


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

 

BeanA , BeanB

@MyIncludeComponent
public class BeanA {
}

@MyExcludeComponent
public class BeanB {
}

 

ComponentFilterAppConfigTest

public class ComponentFilterAppConfigTest {

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

        org.junit.jupiter.api.Assertions.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에 MyIncludeComponent 애노테이션을 추가해서 BeanA가 스프링 빈에 등록된다.
  • excludeFilters에 MyExcludeComponent 애노테이션을 추가해서 BeanB는 스프링 빈에 등록되지 않는다.

 

FilterType  옵션

  • ANNOTATION : 기본값 , 애노테이션을 인식해서 동작한다
    • 예) org.example.SomeAnnotation
  • ASSIGNABLE_TYPE : 지정한 타입과 자식 타입을 인식해서 동작한다.
    • 예) org.example.SomeClass
  • ASPECTJ : AspectJ 패턴 사용
    • 예) org.example..*Service+
  • REGEX : 정규 표현식
    • 예) org\.example\.Default.*
  • CUSTOM : TypeFilter라는 인터페이스를 구현해서 처리
    • 예) org.example.MyTypeFilter
@Component면 충분하기 때문에 includeFilters를 사용할 일은 거의 없다.
excludeFilters는 여러가지 이유로 간혹 사용할 때가 있지만 많지는 않다.

특히 최근 스프링 부트는 컴포넌트 스캔을 기본으로 제공하는데 ,
개인적으로는 옵션을 변경하면서 사용하기 보다는 스프링의 기본 설정에 최대한 맞추어 사용하는 것을 권장한다.

 

 

 

 

스프링 핵심 원리 - 기본편 - 인프런

스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다. 초급 프레임워크 및 라이브러리 웹 개발 서버 개발 Back-End Spring 객체지향 온

www.inflearn.com