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 프로그래밍 입문(최범균)
'공부 > Spring' 카테고리의 다른 글
[Spring] Chapter 07 - Spring AOP (0) | 2021.06.13 |
---|---|
[Spring] Chapter 06 - 빈라이클사이클과 범위 (0) | 2021.06.13 |
[Spring] Chapter 04 - 의존 자동 주입 (0) | 2021.06.13 |
[Spring] Chapter 03 - 스프링 DI(Dependency Injection) (0) | 2021.06.13 |
[Spring]Chapter 02 - 스프링 시작하기 (1) | 2021.06.13 |