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
728x90
반응형
'Spring > spring 기초 스터디' 카테고리의 다른 글
[Spring] 의존성 주입방법 2 (0) | 2021.05.17 |
---|---|
[Spring] 의존성 주입방법 1 (0) | 2021.05.15 |
[Spring] ComponentScan1 - 기초 (0) | 2021.05.08 |
[Spring] Configuration과 Singleton (0) | 2021.05.05 |
[Spring] 웹 애플리케이션과 싱글톤2 (0) | 2021.05.05 |
댓글