스프링 IoC컨테이너가 관리하는 객체로 applicationContext가 만들어서 그 안에 담고 있는 객체
특정한 인스턴스를 스프링 컨테이너에서 어떻게 빈으로 만들수 있을까? 두 가지의 방법이 존재한다.
1) Component Scanning
2) 직접 xml이나 자바 설정 파일에 등록
어노테이션 프로세서 중에 IoC컨테이너를 만들고 그 안에 빈을 등록할 때 사용하는 여러가지 인터페이스를 '라이프 사이클 콜백'이라고 한다. 여러가지 라이프 사이클 콜백 중에는 @Component (@Repository, @Service, @Controller, @Configuration, 사용자 정의)가 있는데 해당 어노테이션이 붙어있는 모든 클래스를 찾아서, 그 클래스의 인스턴스를 만들어 빈으로 등록한다.
@Component 어노테이션을 어디서부터 찾아야 하는지는 @SpringBootApplication안의 @ComponentScan이라는 어노테이션이 알려준다. @SpringBootApplication이 붙은 클래스의 위치부터 하위 패키지에 있는 모든 클래스를 다 찾아보면서, @Component가 붙어있는 클래스를 모두 찾아 빈으로 등록하는 Component Scanning을 한다.
따라서, 직접 빈으로 등록하지 않아도 스프링이 IoC컨테이너가 알아서 자동으로 만들어 빈으로 등록해준다.
Component Scan을 한다고 해서 모든 어노테이션들을 처리하여 빈들로 등록해주는 것은 아니다. Filter로 어떤 어노테이션을 스캔할지 하지 않을지 걸러줄 수 있다.
@ComponentScan(excludeFilter = { @Filter(type = FilterType.CUSTOM.classes = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM.classes = AutoConfigurationExcluderFilter.class)}
@Configuration
public class SampleConfig{
@Bean
public SampleController sampleController(){
return new SampleController();
}
}
위의 코드는 자바 설정파일에 빈을 직접 등록하는 방법에 대한 것이다. @Configuration도 컴포넌트이기 때문에 Component Scanning이 가능하며 sampleController()가 리턴하는 객체 자체가 빈으로 등록이 된다. 이 때, @Controller를 붙이지 않아도 괜찮다.