Spring 컴포넌트 스캔

이주희·2022년 8월 4일
0

spring

목록 보기
6/16

@Component 에노테이션

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

설정 클래스(@Configuration)에서 빈으로 등록할 필요 없이 클래스 코드에서 빈 등록까지 하게 되므로 코드가 많이 줄게 된다.

package new3;

import org.springframework.stereotype.Component;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

// 리스트 만든다
@Component
public class MemberDao {
    // id 순차 저장해둠
    private static long nextId = 0;
.
.
.

해당 클래스 한줄 위에 @Component를 붙여준다.

Component 에노테이션에 속성값을 줄 수 있는데, 속성값을 주지 않는다면 클래스 이름 첫 글자를 소문자로 바꾼 이름을 자동으로 빈 이름으로 사용하게 된다
(위의 예시와 같은 경우 빈 이름은 memberDao가 됨)
@Component("infoList")와 같은 방식으로 사용하게 된다면 빈의 이름을 지정해 줄 수 있다...

@ComponentScan 애노테이션

AppCtx.java

@Configuration // 스프링 설정 클래스를 의미
@ComponentScan(basePackages = {"new3"})
public class AppCtx {

위의 컴포넌트 애노테이션을 붙인 클래스를 스캔해서 등록하려면 설정 클래스에서 이 애노테이션을 사용해야 함

뒤의 속성 {"new3"}은 스캔할 패키지를 설정

new3 하위 패키지의 @Component가 붙은 클래스를 빈으로 등록함

스캔 대상에서 제외시키기

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

위의 ComponentScan 속성에 excludeFilters 속성을 추가해줌

type

  • FilterType.REGEX -> 정규 표현식 사용
  • FilterType.ASPECTJ -> ASPECTJ 패턴 사용
  • FilterType.ANOTATION -> 애노테이션을 필터로 사용
  • FilterType.ASSIGNALBE_TYPE -> 특정 타입, 그 하위 타입을 대상으로 함

pattern

제외할 대상을 선택

FilterType.REGEX -> "spring\..Dao"
FilterType.ASPECTJ -> "spring.
Dao"

classes

ex) classes = {NoProduct.class}
NoProduct 애노테이션을 붙인 클래스를 모두 선택

exclude 필터에 @Filter값을 배열로 사용하면 두개 이상의 필터 동시에 사용 가능

Component 충돌

  • 같은 이름으로 Component 이용해 빈에 등록하면 에러 발생
  • Component로 자동등록하고 동시에 직접 같은 이름으로 @Bean을 이용해서 수동등록하면 수동등록이 우선시됨
  • 같은 클래스를 Component 이용 동시에 다른 이름으로 수동등록하면 둘다 빈에 추가됨

0개의 댓글