본문 바로가기
Framework/Spring

component-scan과 @Component

by 댓츠굿 2014. 9. 27.

component-scan과  @Component



base-package에 패키지를 어디부터 스캔할지 지정해주며, 자동으로 클래스를 검색하여 빈으로 등록해주는 것이다. 또한 스캔할 패키지를 여러개로 지정해줄 수도 있다.


지정된 패키지를 검색해서 @Component, @Controller 등 같은 컴포넌트 스캔대상의 어노테이션, 또는 하위 어노테이션이 적용된 클래스를 검색해서 빈으로 등록하여 준다. 그리고 stereotype 애노테이션(고정된 또는 일반적인 패턴 의미. 예를 들어, @Controller가 선언된 클래스를 Controller 클래스로 자동 인식)인 @Component, @Controller, @Service, @Repository로 등록된 빈은 디폴트로 스캔해준다. 다음은 각 어노테이션의 관계를 보여주는 그림이다.



@Component는 포괄적인 선언이고, @Repository, @Service, @Controller는 각각의 역할에 더욱 집중된 선언이다.


기존에 XML 설정 파일에 빈 정보를 일일히 등록해주어야 하는 번거로움이 있었지만, component-scan을 이용하면서 일일히 빈을 등록하지 않게 되었다. 기존에는 아래와 같이 XML 설정 파일에 빈을 등록해주었다.

 <bean id="testMainService" class="service.MainServiceImpl"></bean>



다음은 component-scan을 설정하는 예다.

   ex) component-scan 등록



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




@Component

  - Spring 컨테이너가 component-scan에 의해서 자동으로 bean을 등록할 대상으로 지정된다.

  - <context:component-scan base-package=""/> 태그를 사용해서 스프링이 클래스를 검색할 패키지를 지정한다.
  - 이 태그는 해당 패키지에서 @Component 어노테이션이(또는 하위 어노테이션) 적용된 클래스를 검색하여 빈으로 자동으로 등록한다.
  - 따라서 XML 설정 파일에 다향한 빈 정보를 추가하지 않아도 된다.

  - 이것은 applicaionContext.xml 혹은 application-config.xml 에 해당클래스의 bean이 생성되는 것을 의미한다.

  - 이 때 bean의 name(이름)을 지정할 수 있는데, 방법은 @Component("testMainService")처럼 @Component("bean의 이름")하면 된다.

  - name(이름)을 쓰지 않고 @Component만 쓸 경우 지정한 클래스(MainServiceImpl)의 이름에서 첫글자를 소문자로 바꾼 

    이름(mainServiceImpl)으로 bean이 생성된다.

  - 빈의 범위를 설정하고 싶다면 @Scope 를 이용한다.


ex)

MainServiceImpl.java

package service;

import org.springframework.stereotype.Component;

 

@Component("testMainService")

@Scope("prototype")

public class MainServiceImpl implements MainService {

  private String name = "test";

 

 @Override

 public String getClassName() {

   return "MainServiceImpl-" + name;

   }

}






반응형