본문 바로가기

프로그래밍/Spring

[spring] 컴포넌트 스캔

Overview

요약

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

정의

자동 주입과 함께 사용하는 추가 기능이 컴포넌트 스캔이다. 컴포넌트 스캔은 스프링이 직접 클래스를 검색해서 빈으로 등록해주는 기능이다. 설정 클래스에 빈으로 등록하지 않아도 원하는 클래스를 빈으로 등록할 수 있으므로 컴포넌트 스캔 기능을 사용하면 설정 코드가 크게 줄어든다.

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

스프링이 검색해서 빈으로 등록할 수 있으려면 클래스에 @Component 애노테이션을 붙여야 한다. @Component 애노테이션은 해당 클래스를 스킨 대상으로 표시한다.

import org.springframework

//애노테이션 값을 주지 않으면 첫글자를 소문자로 바꾼 이름을 빈으로 사용(memnerDAO)
@Component 
public class MemberDAO{}

//information을 빈이름으로 사용
@Component("information")
public class MemberInformation{}

@ComponentScan 애노테이션으로 스캔 설정

@Component 애노테이셔늘 부틴 클래스를 스캔해서 스프링 빈으로 등록하려면 설정 클래스에 @Component 애노테이션을 적용해야 한다.

import org.springframework.comtext.annotation.ComponentScan

@Configuration
@ComponentScan(basePackages = {"spring"}) //스캔 대상의 패키지
public class TestApp{}

스캔 대상에서 제외하거나 포함하기

excludeFilters 속성을 사용하면 스캔할 때 특정 대상을 자동 등록 대상에서 제외할 수 있다.

import org.springframework.comtext.annotation.ComponentScan
import org.springframework.context.annotation.FilterType
import org.springframework.context.annotation.ComponentScan.Filter

//FilterType.REGEX
//정규표현식을 사용해 대상을  지정한다
//spring으로 시작하고 DAO로 끝나는 정규표현식을 지정하여 제외
@Configuration
@ComponentScan(basePackages ={"spring"},
	excludeFilters = @Filter(type = FilterType.REGEX, pattern ="spring\\..*DAO"))
public class TestExclude{}

//FilterType.ASPECTJ
//AspectJ 패턴을 사용하여 제외
@Configuration
@ComponentScan(basePackages ={"spring"},
	excludeFilters = @Filter(type = FilterType.ASPECTJ, pattern ="spring.*DAO"))
public class TestExclude{}

//Aspectj는 모듈 추가 필요
<dependency>
	<groupId>org.aspectj</groupId>
	<artifactId>aspectjweaver</artifactId>
	<version>1.8.13</version>
</dependency>

//특정 애노테이션을 붙인 컴포넌트 대사에서 제외
@Rentention(RUNTIME)
@Target(TYPE)
public @Interface NoProduct{}

@Rentention(RUNTIME)
@Target(TYPE)
public @Interface ManualBean{}

@Configuration
@ComponentScan(basePackages ={"spring", "spring2"},
	excludeFilters = @Filter(type = FilterType.ANOTATION, 
					classes = {NoProduct.class, ManualBean.class}))
public class TestExclude{}

//필터는 두 개 이상도 가능
@ComponentScan(basePackages ={"spring"},
	excludeFilters = {@Filter(type = FilterType.ASPECTJ, pattern ="spring.*DAO"))
				@Filter(type = FilterType.ANOTATION, 
					classes = {NoProduct.class, ManualBean.class}))}

컴포넌트 스캔에 따른 충돌 처리

컴포넌트 스캔 기능을 사용해서 자동으로 빈을 등록할 때에는 충돌에 주의해야 한다.

  • 빈 이름 충돌 spring 패키지와 spring2 패키지에 같은 클래스가 존재한다면 충돌이 일어나므로 둘 중 하나에 명시적으로 빈 이름을 지정해서 이름 충돌을 피해야 한다.
  • 수동 등록한 빈과 충돌

참고 서적

www.yes24.com/Product/Goods/62268795

 

스프링5 프로그래밍 입문

스프링 프레임워크의 버전업으로 개선된 내용을 담았다. 처음 스프링을 배우고자 하는 독자들이 입문할 때 필요한 것은 스프링의 방대한 내용이 아닌 기초와 전반적인 흐름을 잡아주는 것으로

www.yes24.com

 

'프로그래밍 > Spring' 카테고리의 다른 글

[Spring] AOP(Aspect Oriented Programming)  (0) 2021.05.20
[spring] 빈 라이프사이클과 범위  (0) 2021.04.15
[spring] 의존 자동 주입  (0) 2021.04.12
[spring] 의존 주입 DI  (0) 2021.04.12
[spring] 깃허브(GitHub) 연동  (0) 2021.02.03