Free Lines Arrow
본문 바로가기
Spring/spring 기초 스터디

[Spring] ComponentScan2 - Annotation만들기

by skahn1215 2021. 5. 8.
728x90
반응형

Annontation 만들어 보기

 

나만의 Annontation을 만들어 class 에 Annontation을 달아보자

필터를 이용해서 Container에 등록할지 안할지 지정해보자.

 

ComponentScan 에서 사용할수 있는 필터 종류

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

 

Annotation1

package hello.core.scan.filter;

import java.lang.annotation.*;

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

 

 

 

Annotatnion2

package hello.core.scan.filter;

import java.lang.annotation.*;

//직접 Annotation을 만들어 해당 Annotation이 붙어 있으면 bean으로 등록한다.

// type 은 클래스에 붙음.
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyIncludeComponent {

}

 

 

 

Annotation 적용해보기

위에 두개의 Annotation을 만들었다.

만든 것을 적용해보자

  • MyIncludeComponent 는 bean에 등록할 목적으로 만들었다.
  • MyExcludeComponent 는 bean에  제외할 목적으로 만들었다.

 

BeanA class 는 bean으로 등록

package hello.core.scan.filter;
@MyIncludeComponent
public class BeanA {
}

 

BeanB class 는 Bean에서 제외

package hello.core.scan.filter;
@MyExcludeComponent
public class BeanB {
}

 

여기까지는 사실 아무런 구분이 없다 

구분이 없다는 것은 제외 할지 포함할지 정의가 되지 않았다는 것이다.

 

실제 적용해보기

package hello.core.scan.filter;

import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;

import static org.springframework.context.annotation.ComponentScan.*;

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

        BeanB beanB = ac.getBean(BeanB.class);
        Assertions.assertThat(beanA).isNull();

    }

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

    }
}

설명

필터 부분을 자세히 보자

 

    @ComponentScan(
            includeFilters = @Filter(type = FilterType.ANNOTATION, classes = MyIncludeComponent.class),
            excludeFilters = @Filter(type = FilterType.ANNOTATION, classes = MyExcludeComponent.class)
    )

 includeFilters 와 excludeFilters를 이용하여 제외 할지 포함할지 정의를 해주었다.

  • BeanA 에는 MyIncludeComponent 어노테이션이 달려있으니 Container에 등록이 될것이다.
  • BeanB 에는 MyExcludeComponent 어노테이션이 달려있으니 제외가 될것이다.

 

 

FilterType

FilterType은 5가지 옵션이 있다.

  • ANNOTATION: 기본값, 애노테이션을 인식해서 동작한다.
    ex) org.example.SomeAnnotation

 

  • ASSIGNABLE_TYPE: 지정한 타입과 자식 타입을 인식해서 동작한다.
    ex) org.example.SomeClass

 

  • ASPECTJ: AspectJ 패턴 사용
    ex) org.example..*Service+

 

  • REGEX: 정규 표현식
    ex) org\.example\.Default.*

 

  • CUSTOM: TypeFilter이라는 인터페이스를 구현해서 처리
    ex) org.example.MyTypeFilter

 

 

참고: 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/lecture/55370?tab=note

 

스프링 핵심 원리 - 기본편 - 인프런 | 학습 페이지

지식을 나누면 반드시 나에게 돌아옵니다. 인프런을 통해 나의 지식에 가치를 부여하세요....

www.inflearn.com

 

728x90
반응형

댓글