IoC 컨테이너 4부 - @Component와 컴포넌트 스캔
참고문헌
컴포넌트 스캔 주요 기능
- 스캔 위치 설정
- 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
}