참고문헌

컴포넌트 스캔 주요 기능

  • 스캔 위치 설정
    • image
    • basePackage 밖의 클래스들은 빈으로 스캔되지 않는다.
  • 필터: 어떤 애노테이션을 스캔 할지 또는 하지 않을지

@Component

  • @Repository
  • @Service
  • @Controller
  • @Configuration

동작 원리

  • @ComponentScan은 스캔할 패키지와 애노테이션에 대한 정보
  • 실제 스캐닝은 ConfigurationClassPostProcessor라는 BeanFactoryPostProcessor에 의해 처리 됨.

function을 사용한 빈 등록

  • reflection이나 프록시 기반 라이브러리를 사용하지 않기 때문에, 구동시간을 줄일 수 있다.
  • 거의 사용되진 않음 (일일이 등록이 너무 힘들기 때문) : 왜 컴포넌트 스캔 방식이 나왔는지의 이유임. 불편하기 때문
public static void main(String[] args) {
 new SpringApplicationBuilder()
 .sources(Demospring51Application.class)
 .initializers((ApplicationContextInitializer<GenericApplicationContext>)
applicationContext -> {
 applicationContext.registerBean(MyBean.class);
 })
 .run(args);
 }
  • 위 : 빌더패턴
  • 아래 : 일반

@SpringBootApplication
public class DemospringApplication {
   @Autowired
   MyService myService;

   public static void main(String[] args) {
       var app new SpringApplication(DemospringApplication.class);
       app.addInitializers((ApplicationContextInitializer<GenericApplicationContext>) ctx -> {
           if (조건문) {
               ctx.registerBean(Myservice.class);
           }

           //Supplier 등록
           ctx.registerBean(ApplicationRunner.class, () -> args1 -> System.out.println("Funtional Bean Definition!!"))

       });

       app.run(args);
   }//main
}