공부/Spring / / 2021. 6. 13. 08:05

[Spring] Chapter 05 - 컴포넌트 스캔

300x250

 

Chapter 5 내용

  • 컴포넌트 스캔

 

※ 정리

  • 컴포넌트 스캔은 스프링이 직접 클래스를 검색해서 빈으로 등록해 주는 기능이다. 설정 클래스에서 컴포넌트 스캔을 해주면, 컴포넌트 어노테이션 태그가 있는 클래스들은 모두 빈으로 등록된다.
  • excludeFilters 필터를 사용하면 스캔 대상에서 제외 할 수 있다.
  • Component만 스캔 대상이 아니고, Contoller, Service,Repository이 붙은 클래스도 스캔 대상이 된다.

 

@Component


 

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

 - 스프링이 검색해서 빈으로 등록할수 있으려면 @Component 애노테이션으로 등록해야한다.

 

@Component //스프링이 직접 클래스를 검색해서 빈으로 등록해주는 기능
public class MemberDao {
    private static long nextId = 0;


    private Map<String, Member> map = new HashMap<>(); //Java Map은 리스트나 배열처럼 순차적으로 해당 요소 값을 구하지 않고 key를 통해 value를 얻는다.

    public Member selectByEmail(String email){
        return map.get(email); //키값을 통해 email 가져오기
    }

    public void insert(Member member){
        member.setId(++nextId);
        map.put(member.getEmail(),member);
    }

    public void update(Member member){
        map.put(member.getEmail(),member);
    }

    public Collection<Member> selectAll(){
        return map.values();
    }
}

 

- 값을 주었는지에 따라 빈으로 등록할 때 사용할 이름이 결정된다.

- 값을 주지 않으면 첫 글자를 소문자로 바꾼 값으로 등록되며,  값을 주면 그 값으로 검색한다. 

 

@Component("listPrinter") //listPrinter로 bean 등록
public class MemberListPrinter {
    private MemberDao memberDao;
    private MemberPrinter printer;
}

 

ㅁ @ComponentScan으로 스캔 

 

설정 클래스에서 @ComponentScan을 사용하면 @Component 어노테이션을 붙인 클래스들을 스캔해서 Bean 으로 등록한다. 

 

@Configuration
@ComponentScan(basePackages = {"chap05.spring"})
public class AppCtx {

	@Bean
	@Qualifier("printer")
	public MemberPrinter memberPrinter1() {
		return new MemberPrinter();
	}
	
	@Bean
	@Qualifier("summaryPrinter")
	public MemberSummaryPrinter memberPrinter2() {
		return new MemberSummaryPrinter();
	}
	
	@Bean
	public VersionPrinter versionPrinter() {
		VersionPrinter versionPrinter = new VersionPrinter();
		versionPrinter.setMajorVersion(5);
		versionPrinter.setMinorVersion(0);
		return versionPrinter;
	}
}

 

MemberListPrinter 클래스의 Bean을 @Component("listPrinter")으로 하면 설정 클래스 파일에서  listPrinter로 등록 된 객체를 구할 수 있다.

 

 

  private static void processListCommand() 
  {
        MemberListPrinter listPrinter = ctx.getBean("listPrinter", MemberListPrinter.class);
       listPrinter.printAll();
  }
    

 

 스캔 대상에서 제외 (excludeFilters 속성 )

 

1) REGEX

//spring으로 시작하고 Dao로 끝나는 정규식이 제외됌
@ComponentScan(basePackages = {"chap05.spring"},
        excludeFilters = @ComponentScan.Filter(type = FilterType.REGEX, pattern = "spring\\..*Dao")) 
​

 

2) ASPECTJ 필터타입

 

 -  aspectjweaber모듈 추가해서 사용

 

implementation group: 'org.aspectj', name: 'aspectjweaver', version: '1.6.10'

 

@ComponentScan(basePackages = {"chap05.spring"},
        excludeFilters = @ComponentScan.Filter(type = FilterType.ASPECTJ, pattern = "spring\\..*Dao")) 
​

 

3)  특정 어노테이션을 붙인 타입 제외

@ComponentScan(basePackages = {"chap05.spring" },
excludeFilters = {
@ComponentScan.Filter(type = FilterType.ANNOTATION, classes = ManualBean.class )})

 

ManualBean이 붙은 클래스는 모두 제외 한다.

 

- ManualBean 생성

package chap05.config;

import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

import java.lang.annotation.Retention;
import java.lang.annotation.Target;

@Retention(RUNTIME)
@Target(TYPE)
public @interface ManualBean {

}

 

 

 

- @MemberDao에 @ManualBean 어노테이션을 제외 대상에 추가했으므로 MemberDao는 스캔 대상에서 제외된다.

 

 

4) 설정할 필터가 두개 이상

 

설정할 필터가 두개 이상이면 속성에 배열을 사용해서 목록을 전달하면 된다

 

기본 스캔대상

  • Component
  • Controller
  • Service
  • Repository

 

@Component만 스캔 대상이 되지 않으며 위의 애노테이션을 붙인 클래스가 컴포넌트 스캔 대상에 포함된다.

 

 

REFERENCE


 초보 웹 개발자를 위한 스프링 5 프로그래밍 입문(최범균)

300x250
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유