chap 05 - 컴포넌트 스캔
초보 웹 개발자를 위한 스프링 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 {
.. 내용 생략 ..
}