애플리케이션이 ComponentScan을 가지고 있고, 기본값은 componentscan을 붙이고 있는 configuration부터 시작해서 이 애플리케이션 class가 component scan 시작지점이 된다.
이 애플리케이션 클래스와 이 애플리케이션을 담고있는 패키지부터 이 패키지 안의 모든 것부터 패키지 이하의 다른 패키지까지 전부 스캔한다.
하지만 이 패키지 밖의 것은 안된다.
중요한 설정으로 filter!!
componentscan을 한다고 모든 annotation을 처리해서 등록하는 것이 아니다,
걸러주는 옵션이 있어서 (Excludefilter, includeFilters), 어디부터 어디까지 스캔할지와, 어떤걸 거를지 이 두가지 설정이 있다.
기본적으로 이 컴포넌트라는 어노테이션을 들고 있는 것들이 bean으로 등록이 된다. 그래서 @Service도 컴포넌트 어노테이션, @Repository, @Controller도 마찬가지
이런 어노텡션들이 bean으로 등록되어있고, 단점으로는 이런 bean들을 applicationcontext같은 경우 single tone scope인 bean들의 경우 초기에 생성을 한다. 그렇기 떄문에 초기의 구동시간이 길 수 있다.
구동시간에 예민하다면 다른 방법을 고려할 수 있는데, 다른 방법중 하나다 functional이 있다. 이 경우 reflection, proxy 기법을 사용하지 않기 때문에 성능에 영향 X
Springboot로 애플리케이션 구동 방법 중 하나로
1) static
2) builder
3) 인스턴스를 만들어 사용
public static void main(String[] args){
var app = new SpringApplication(Demospring51Application.class);
app.addInitializers(new ApplicationContextInitializer<GenericApplicationContext);
@Override
public void initialize(GenericApplicationContext ctx){
ctx.registerBean(MyService.class);
}
});
app.run(args);
}
}
컴포넌트스캔의 역할 가장 중요한 속성 2가지
1) 스캔 위치 설정
2) 필터: 어떤 어노테이션을 스캔할지
컴포넌트 스캔되는 대상들
1) @Repository
2) @Service
3) @Controller
4) @Configuration
댓글