Spring/Spring_CoreTechnologies

SpringFrameWork CoreTechnition_section1_3부

whyWhale 2020. 11. 17.

@Component와 컴포넌트스캔.

 

주요기능

  • 스캔 위치(Basepackages 위치) 설정.(범위 : 기본적으로 같은 패키지 안에 있는 빈들은 가능 외부는 x. 따로 무엇인가 필요하다.)
  • 필터 : 어떤 어노테이션 스캘 할지 또는 안 할지.

=> 어디서 부터 어디까지 어떤 것을 걸러낼 것인지가 중요.

 

@Component : Bean 등록하는 것. <스캔 등록 대상.>

  •  Repository
  • Service
  • Controller
  • Configuration

* 단점이 있다면 ApplicationContext에서는 Singleton은 초기에 생성되는데, 양이 많을 시 구동 시간에 오래 걸릴 수가 있습니다. 하지만 구동 타임에서만 성능이 떨어지지만 그 후에 추가로 빈을 생성하는 데는 문제가 되지 않는다. 그래서 Function을 사용한 빈 등록하는 방법이 있습니다. Proxy | reflection 을 사용하지 않기에 성능에 영향을 주지 않습니다.

 

빌더와 인스턴스로 만드는 방법이 있습니다.

 

인스턴스 예시 

 

= Function bean 등록 방법.

 

=> 같은 패키지 안에 있지 않는 Myservice라는 빈을 등록하기 위한 과정입니다. 즉 외부 패키지 빈을 등록하기 위한 방법.

 

public static void main(String[] args) {
// SpringApplication.run(SpringframworkCoretechApplication.class,args);
var app=new SpringApplication(SpringframworkCoretechApplication.class);
app.addInitializers(new ApplicationContextInitializer<GenericApplicationContextApplicationContextInitializer <GenericApplicationContext>() {
@Override
public void initialize(GenericApplicationContext ctx) {
ctx.registerBean(MyService.class); // 외부 패키지의 MyService
ctx.registerBean(ApplicationRunner.class, new Supplier<ApplicationRunnerSupplier <ApplicationRunner>() {
@Override
public ApplicationRunner get() {
return new ApplicationRunner() {
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println("Functional Bean Def ");
}
};
}
});
}
});
app.run(args);

}

 

하지만 이런 식으로 ComponentScan을 버리고 하기엔 엄청나게 방대하게 코드가 쓰일 우려가 있으므로 하지 않는다.

어마어마한 설정 파일이 생깁니다. 직접 빈을 등록하는 경우에는 Functional 이 대체하기엔 좋을 듯합니다.

 

 

댓글