티스토리 뷰

study/Spring

chap 05 - 컴포넌트 스캔

xoxowo 2023. 1. 5. 18:07

초보 웹 개발자를 위한 스프링 5 프로그램 입문을 보고 복습 겸 개인 학습 정리입니다. (windows 기준)

 

 

컴포넌트 스캔

자동 주입과 함께 사용되는 추가기능

스프링이 직접 클래스를 검색하여 빈으로 등록해주는 기능

 

@Component 애너테이션으로 스캔 대상 지정

@Component 애너테이션은 해당 클래스를 스캔 대상으로 표시하기 때문에 스프링이 클래스를 검색하여 빈으로 등록하게하려면 이 클래스에 @Component 애너테이션을 붙여야한다.

@Component 애너테이션에 속성값을 줄 수 있다. 속성값을 주면 그 값을 빈 이름으로 사용한다.

import org.springframework.stereotype.Component;
// 속성값을 붙이면 빈 이름은 속성값이 빈 이름이다. 
@Component("infoprinter")
public class MemberInfoPrinter {
	private MemberDao memDao;
	private MemberPrinter printer;
	.. 내용 생략...   
}

속성값을 주지 않았다면 클래스 이름의 첫 글자를 소문자로 바꾼 이름을 빈 이름으로 사용한다.

import org.springframework.stereotype.Component;
// 속성값이 없으면 빈 이름은 클래스의 이름의 첫 글자를 소문자로 바꾼 이름을 빈 이름이된다
@Component
public class MemberDao {
	... 내용 생략...
}

 

+ 기본 스캔 대상

@Component 애너테이션을 붙인 클래스 외 다른 애노테이션을 붙인 클래스도 컴포넌트 스캔 대상에 포함된다.

 

@Component(org.springframework.stereotpye 패키지)

@Controller(org.springframework.stereotpye 패키지) ← 웹 MVC와 관련있음

@Service(org.springframework.stereotpye 패키지)

@Repository(org.springframework.stereotpye 패키지) ← DB 연동과 관련있

@Aspect(org.aspectj.lang.anntation 패키지)

@Configuration(org.springframework.context.annotation 패키지)

 

 

 

@ComponentScan 애너테이션으로 스캔 대상 설정

@Component 애너테이션을 붙인 클래스를 스캔하여 빈으로 등록하게하려면 설정 클래스에 @ConponentScan 애노테이션을 적용해야한다.

 

아래 설정 클래스에 붙인 @ComponentScan 애너테이션의 basePackages 속성값은 {"spring"}인데, 이 속성은 스캔 대상 패키지 목록을 지정한다. 즉, spring 패키지와 그 하위 패키지에 속한 클래스를 스캔 대상으로 설정하는 것.

스캔 대상에 해당하는 클래스 중에서도 @Component 애노테이션이 붙은 클래스의 객체를 생성하여 빈으로 등록한다.

import org.springframework.context.annotation.ComponentScan;
... 생략 ...
@Configuration
@ComponentScan(basePackages = {"spring"})
public class AppCtx {

    @Bean
    public MemberDao memberDao() {
        return new MemberDao();
    }
    ... 생략 ...   
}

 

스캔 대상에서 제외 또는 포함

excludeFilters 속성을 사용하여 특정 대상을 스캔 대상에서 제외시킬 수 있다.

 

@Fliter 애노테이션의 tpye 속성값으로 제외할 대상을 어떤 식으로 지정할 건지 설정할 수 있다.

type 속성값으로 정규표현식, AspectJ 패턴, 특정 애노테이션 등 필터 타입을 설정할 수 있다.

(FilterType.REGEC, FilterTpye.ASPECTJ, FilterType.ANNOTATION...)

 

두 개 이상의 필터를 설정할 시 excludeFilter 속성에 배열을 사용하면된다.

 

※ patterns 속성은 String[] 타입이므로 배열을 이용해서 패턴을 한 개 이상 지정할 수 있다.

 

※ AspectJ 패턴이 동작하려면 의존 대상에 aspectjweaver 모듈을 추가해야한다. 

@Configuration
@ComponentScan(basePackages = {"spring"}
/*
1.excludeFilters = @Filter(type = FilterTpye.REGEX, pattern = "spirng\\..*Dao")
                	정규표현식을 사용해서 제외 대상을 지정
2.excludeFilters = @Filter(type = FilterTpye.ASPECTJ, pattern = "spirng.Dao")
                	AspectJ 패턴을 사용해서 제외 대상을 지정
3.excludeFilters = @Filter(type = FilterTpye.ANNOTATION, 
             classes = {Noproduct.class, ManualBean.class}))                                 
                	특정 Annotation을 붙인 클래스를 제외 대상으로 지정
4.excludeFilters = {
			@Filter(type = FilterTpye.REGEX, pattern = "spirng\\..*Dao")
			@Filter(type = FilterTpye.ANNOTATION, classes = Noproduct.class) 
}}			두 개 이상일 경우 배열로 묶어 준다
*/
public class AppCtxWithExclude {
	.. 내용 생략 ..
}
댓글