의존성 관리에 용이함
기본적으로 싱글톤으로 등록됨
싱글톤
- 객체를 하나만 등록한다는 뜻
- 스프링 컨테이너는 Bean을 싱글톤으로 등록함으로써 Bean을 재사용하여 메모리를 절약함
스프링 컨테이너에 Bean을 자동으로 등록함
하위 어노테이션으로는 @Configuration, @Controller, @RestController, @Service, @Repository 등이 있음
@ComponentScan을 사용하여 @Component가 부여된 클래스를 자동으로 Bean 등록함
스프링은 @ComponentScan을 이용한 자동 Bean 등록 방식을 권장함
언제 사용하는가?
- 어플리케이션 전범위로 사용되는 클래스를 등록할 때
- 개발자가 직접 제어 불가능한 외부 라이브러리를 Bean으로 등록할 때 사용함 (MultipartResolver, Docket 등)
어떻게 사용하는가?
- 대게 ApplicationConfiguration.java 에 Bean을 설정함
- @Configuration 으로 Bean 설정 파일임을 가시적으로 보여줌
@Configuration public class ApplicationConfig { @Bean public MultipartResolver multipartResolver() { ... } }
@Configuration과 싱글톤
- @Configuration은 CGLIB로 프록시 패턴을 적용하여 수동으로 등록되는 스프링 Bean이 반드시 싱글톤으로 생성되도록 함
- Bean을 싱글톤으로 생성하기 위해 CGLIB는 바이트 코드로 런타임 시 자바 클래스를 상속하여 동적 프록시 객체를 만듦
- @Configuration(proxyBeanMethods = false)로 설정할 경우, 프록시가 적용되지 않아 Bean 메서드를 호출할 때 마다 새로운 객체를 생성함
- 즉, 평소에는 싱글톤을 보장하기 위해 proxyBeanMethods = true가 디폴트 값임