Bean은 Spring IoC Container에 의해 관리되는 재사용 가능한 객체(POJO)를 의미합니다. 이러한 Bean들은 컨테이너에서 제공하는 구성 메타데이터(예를 들면 XML의 <bean/> 정의 형태)를 기반으로 생성됩니다.
Spring IoC Container에서 의존성 주입을 통해 Bean의 생명 주기를 관리하기 때문에 개발자가 객체의 생성과 소멸에 신경을 기울이지 않아도 됩니다. 이를 통해 구성 요소 간의 결합도를 낮추고, 어플리케이션을 보다 모듈화할 수 있습니다.
Bean Scope는 빈이 존재할 수 있는 범위를 의미하며 Singleton, Prototype, Request, Session 등이 있습니다.
주의할 점
Request, Session은 기본
ApplicationContext에서는 사용할 수 없고, web-awareApplicationContext(exXmlWebApplicationContext)에서만 지원됩니다.
Bean으로 등록될 준비를 마친 클래스들을 스캔하여 자동으로 등록해주는 것을 Component-Scan이라고 합니다.
Bean으로 등록될 준비를 마친 클래스들이라 함은 @Component 어노테이션과 이를 메타 어노테이션으로 포함한 모든 어노테이션이 붙어있는 클래스들을 의미합니다.
@Component@Component 어노테이션이 선언된 클래스들은 기본적으로 빈으로 등록됩니다.
@Controller, @Service 등의 어노테이션들은 내부에 @Component를 메타 어노테이션으로 포함하고 있음을 확인할 수 있습니다.
@Configuration, @Bean클래스에 @Configuration 어노테이션, 메서드에 @Bean 어노테이션을 선언해 자바 클래스에서 직접 빈을 등록합니다.
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
...
}
}
@Configuration과 CGLIB
@Configuration은 클래스의 CGLIB를 사용해 싱글톤을 보장합니다.
그러므로 SecurityConfig가 빈으로 등록될 때, SecurityConfig 대신 SecurityConfig를 상속받은 SecurityConfig$CGLIB 형태의 프록시 객체가 등록됩니다.
@Bean이 등록된 메소드마다 이미 스프링 빈이 존재하면 존재하는 빈을 반환하고, 스프링 빈이 없으면 생성해서 스프링 빈으로 등록하고 반환하는 코드가 동적으로 만들어져 덕분에 싱글톤이 보장됩니다.
@Bean Vs. @Component@Bean@Component
초기화 콜백
Bean이 InitializingBean을 구현하거나@PostConstruct어노테이션이 붙은 메서드가 있으면 해당 메서드 호출
소멸 전 콜백
Bean이 DisposableBean을 구현하거나@PreDestroy어노테이션이 붙은 메서드가 있으면 ApplicationContext가 종료될 때 호출