Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

컴포넌트 스캔, 필터 본문

인프런/[인프런] Spring 핵심원리 이해

컴포넌트 스캔, 필터

Seung__ 2021. 7. 28. 21:43
  • includeFilters : 스캔 대상 추가
    includeFilters = @ComponentScan.Filter(type = , classes = )
  • excludeFilters : 스캔 대상에서 제외
    excludeFilters = @ComponentScan.Filter(type = , classes = )

 

 

1. MyIncludeComponent Annotation


  • 해당 annotaion이 붙은 클래스는 컴포넌트 스캔에 포함
@Target(ElementType.TYPE) //TYPE : class레벨에 붙음
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyIncludeComponent {

    //얘가 붙은건 Component 스캔에 추가할 거임 ㅋㅋㅋㅋ
}

 

2. MyExcludeComponent Annotaion


  • 해당 annotation이 붙은 클래스는 컴포넌트 스캔에서 제외
@Target(ElementType.TYPE) //TYPE : class레벨에 붙음
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyExcludeComponent {

    //얘는 스캔에서 제외
}

 

3. BeanA, BeanB


  • BeanA : @MyIncludeComponent --> 스캔에 포함
  • BeanB : @MyExcludeComponent --> 스캔에서 제외
@MyIncludeComponent
public class BeanA {
}
@MyExcludeComponent
public class BeanB {
}

 

4. Test


  • BeanA는 스캔 대상에 포함되어 Bean으로 등록됨
  • BeanB는 스캔 대상에서 제외되어 Bean으로 등록되지 않음
public class ComponentFilterAppConfigTest {

    @Test
    void filterScan(){
        AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(ComponentFilterAppConfig.class);

        BeanA beanA = ac.getBean("beanA", BeanA.class);
        Assertions.assertThat(beanA).isNotNull();

        //BeanB beanB = ac.getBean("beanB", BeanB.class);
        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 {


    }
}

 

 

5. Filter Type 옵션


  • ANNOTATION : 기본값, @Annotation 인식해서 동작 --> 생략 쌉가능
  • ASSIGNABLE_TYPE : 지정한 타입과 자식 타입을 인색해서 동작 --> 클래스 직접 지정
  • ASPECTJ : AspectJ 패턴 사용 바로 찾아옴
    ex) org.exampl..*Service+
  • REGEX : 정규 표현식
    ex) org\.example\.Defulat.*
  • CUSTOM : TypeFilter라는 인터페이스 구현해서 처리
    ex) org.example.MyTypeFilter

 

6. GitHub : 210728 ComponentScan filter


 

GitHub - bsh6463/SpringCoreFunction

Contribute to bsh6463/SpringCoreFunction development by creating an account on GitHub.

github.com

 

Comments