본문 바로가기

JAVA/Spring

[Spring] context:component-scan 사용법

component-scan 이란?

빈으로 등록 될 클래스들을 스캔하여 빈으로 등록해주는 것이다.

default - @Controller, @Service, @Component, @Repository  

 

기본적으로 @Component 를 빈 등록 대상으로 포함한다.

@Controller , @Service는 어떻게 인식하는 걸까?

@Controller, @Service 가 @Component를 포함하고 있기 때문이다.

 

1. xml 파일 설정

 

<context:component-scan base-package="com.example.demo"/>

 

base-package 기준으로 클래스들을 스캔하여 빈으로 등록한다.

여러개의 패키지를 쓸 수 있다.

ex)
	<context:component-scan base-package="com.example.demo, com.example.test"/>

 

위와 같이 설정하면 base-package 하위의 @Controller, @Service, @Component, @Repository  모두 빈으로 등록된다.

특정한 객체만 등록하고 싶다면 include-filter 혹은 exclude-filter 를 통해 설정할 수 있다.

 

 

1) include-filter - 특정 어노테이션만 스캔

 

<context:component-scan base-package="com.example.demo" use-default="false">
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

 

use-default="false"

> 기본 어노테이션 @Controller, @Component 등을 스캔하지 않는다는 의미.

이후 include-filter를 통해서 특정 어노테이션만 스캔할 수 있다.

 

 

2) exclude-filter - 제외하고 싶은 어노테이션 설정

 

<context:component-scan base-package="com.example.demo">
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

 

 

2. Java 파일 설정

 

@Configuration
@ComponentScan(basePackages = "com.example.demo")
public class ApplicationConfig {
}

 

@Configuration - xml을 대체하는 설정 파일임을 명시.

@ComponentScan - xml설정에서 사용하는 의미와 동일.

 

 

3. component-scan을 사용하지 않을 경우

 

<bean id="testDAO" class="com.example.demo.TestDAO"></bean>
		
		<!-- MemberList 객체에 대한 정보 전달 및 의존성 주입 -->
		<bean id="member" class="com.example.demo.MemberList">
			
			<!-- 속성의 이름을 지정하여 주입 -->
			<property name="dao">
				<ref bean="testDAO"/>
			</property>
		
		</bean>

 

빈으로 설정할 클래스들을 직접 xml 파일에 각각 등록해 주어야 한다.

TestDAO 와 MemberList 를 빈으로 등록 후 test를 주입한 것이다.

클래스 개별 추가로 인해 코드가 매우 길어지고 복잡해진다.

 

 

component-scan 동작 과정

 

1. ConfigurationClassParse : @Configuration 클래스 파싱.

2. ComponentScan 설정 파싱

   > base-package 기준으로 ComponentScanAnnotationParser가 스캔하기 위한 설정 파싱.

3. base-package 설정 기준으로 모든 클래스 로딩.

4. ClassLoader가 로딩한 클래스들을 BeanDefinition으로 정의 : 생성할 빈 정의

5. 생성할 빈에 대한 정의를 토대로 빈을 생성.

 

 

 

* 요즘은 java단에서 @(Annotation)을 이용해 정리하는 추세이지만,

Spring boot가 아닌 Spring MVC 를 사용하는 회사에서는 xml 설정을 주로 이용하여 정리해보았다.

불필요한 xml은 제거하여 사용하자.