SpringBootApplication이 동작하는 방식
- run 메서드 안에 파라미터로 집어넣으면 스프링 빈으로 등록된다.
- run 메서드 내부적으로 ConfigurableApplicationContext를 생성한다. 이것이 스프링 컨테이너 자체이다.
- ComponentScan을 사용하려면 해당 어노테이션이 붙어있는 클래스가 스프링 빈으로 등록되야 한다.
- 빈을 찾으려면 따로 DL 기능을 제공하는 ObjectProvider를 사용하기
- ObjectProvider로 찾아올때 객체의 생성, 의존관계 주입 및 초기화 까지는 스프링 컨테이너가 제공해준다. 그 뒤 반환하고 나면 컨테이너가 관리하지 않는다.
싱글톤 방식 정리
- ComponentScan은 무조건 객체를 스프링 빈으로 싱글톤 등록해준다. 설정 정보에 @Configuration이 붙어있는지는 관심없다.
- Configuration이 붙어있는지 여부는 수동 등록시에 @Bean 메서드를 사용할때이다.
- 사실 스프링 빈으로 등록되는 객체는 모두 싱글톤이다.
- 단지 처음 빈 등록 과정에서 @Bean이 의존관계 주입으로 인해 여러번 호출된다면 BeanMethodMap에 모두 등록 된 뒤, 원 메서드만 스프링 빈으로 등록되고, 나머지 의존관계 주입으로 들어가는 객체들은 모두 일반 객체로 생성된다.
- @Configuration으로 등록하면 이 과정에서 CGLIB를 통해 하나의 싱글톤 객체만 생성되게 해주는 것이다.