개발 공부 중!/Spring
[스프링5 입문] Chap 05. 컴포넌트 스캔
김evelyn
2024. 1. 6. 18:23
📚 @Component 애노테이션
스프링이 검색해서 빈으로 등록이 가능하려면 클래스에 @Component 애노테이션을 붙여야 한다. @Component 애노테이션은 해당 클래스를 스캔 대상으로 표시한다.
@Component
public class MemberDao {
...
}
위 경우에는 Component 애노테이션에 값을 주지 않았다. 이 경우 클래스 이름의 첫 글자를 소문자로 바꾼 이름을 빈 애노테이션으로 사용한다. (memberDao)
@Component("infoPrinter")
public class MemberInfoPrinter {
...
}
위 경우는 Component 애노테이션에 값을 주었다. 클래스 이름은 MemberInfoPrinter이지만 빈 이름으로 “infoPrinter”를 사용한다.
📚 @ComponentScan 애노테이션
@Configuration
@ComponentScan(basePackages = {"spring"})
public class AppCtx {
...
}
위 경우의 @ComponentScan 애노테이션의 “basePackages” 속성값은 {”spring”}이다.
- basePackages란? 스캔 대상 패키지 목록을 지정하는 속성
@ComponentScan 애노테이션은 스캔 대상에 해당하는 클래스 중, @Component 애노테이션이 붙은 클래스의 객체를 생성해서 빈으로 등록한다.
📚 스캔 대상에서 제외하거나 포함하는 방법
1. 스캔 대상에서 제외하기
- excludeFilters 속성을 사용해 제외 대상을 지정할 수 있다.
1-1. REGEX를 사용해 제외 대상을 지정할 때
@Configuration
@ComponentScan(basePackages = {"spring"},
excludeFilters =@Filter(type= FilterType.REGEX, pattern = "spring//..*Dao"))
public class AppCtxWithExclude {
...
}
위 @Filter 애노테이션의
- type 속성값 : FilterType.REGEX
- 이는 정규표현식(REGEX)를 사용해 제외 대상을 지정한다는 것을 의미한다.
- pattern 속성 : FilterType에 적용할 것을 설정
- 위 설정에서는 “spring.”으로 시작하고 Dao로 끝나는 정규 표현식을 지정했다. (그러므로 spring.MemberDao를 컴포넌트 스캔 대상에서 제외한다.)
1-2. ASPECTJ를 사용해 제외 대상을 지정할 때
@Configuration
@ComponentScan(basePackages = {"spring"},
excludeFilters =@Filter(type= FilterType.ASPECTJ, pattern = "spring.*Dao"))
public class AppCtxWithExclude {
...
}
위 @Filter 애노테이션의
- type 속성값 : FilterType.ASPECTJ
- AspectJ 패턴은 이후 더 자세히 살펴볼 예정이다.
- 위 설정에서는 spring 패키지의 Dao로 끝나는 타입을 컴포넌트 스캔 대상에서 제외한다.
1-3. ANNOTATION을 사용해 제외 대상을 지정할 때
@Configuration
@ComponentScan(basePackages = {"spring"},
excludeFilters =@Filter(type= FilterType.ANNOTATION, classes = {NoProduct.class, ManualBean.class}))
public class AppCtxWithExclude {
...
}
위 @Filter 애노테이션의
- type 속성값 : FilterType.ANNOTATION
- classes 속성에 필터로 사용할 애노테이션 타입을 값으로 준다.
- 위 설정에서는 @NoProduct 나 @ManualBean 애노테이션을 붙인 클래스는 컴포넌트 스캔 대상에서 제외
1-4. 두 개 이상의 필터를 설정할 때
@Configuration
@ComponentScan(basePackages = {"spring"},
excludeFilters = {
@Filter(type= FilterType.REGEX, pattern = "spring//..*Dao"),
@Filter(type= FilterType.ANNOTATION, classes = ManualBean.class)
})
public class AppCtxWithExclude {
...
}
두 개 이상의 필터를 설정하고 싶다면, 위처럼 excludeFilters 속성에 배열을 사용해 @Filter 목록을 전달하면 된다.
2. 스캔 대상에 포함하기
- 아래 애노테이션을 붙인 클래스는 컴포넌트 스캔 대상에 포함된다.
- @Component
- @Controller
- @Service
- @Repository
- @Aspect
- @Configuration