1. Spring Bean이란?
Spring bean이란 Spring Ioc Container가 관리하는 자바 객체로 Container에 의해 생명주기가 관리되는 객체를 의미한다.
이 bean은 설정 메타 데이터(xml)에 의해 생성이 되기 때문에 일반적으로는 java코드 내에서 작성하지 않는다.
메타 데이터 파일에서 객체를 생성하면 해당 객체는 ApplicationContext.getBean()메소드를 사용하여 가져올 수 있다.
IceCreamController iceCreamController = new IceCreamController(); //직접 생성한 객체는 bean이 아님
IcemCreamController bean = applicationContext.getBean(IceCreamController.class); // ApplicationContext에서 가져온 객체이기 때문에 bean임
이처럼 spring에서 bean은 ApplicationContext가 생성하고 직접 관리해주는 객체를 의미한다.
2. Spring Bean의 생성주기
스프링 bean은 객체 생성 -> 의존 설정 -> 초기화 -> 사용 -> 소멸 순서의 라이프 사이클을 지닌다.
스프링 컨테이너가 초기화 될 때 먼저 빈 객체를 설정 정보에 맞추어 생성하고,
의존 관계를 설정한 뒤에 해당 프로세스가 완료되면 빈 객체가 지정한 메소드를 호출해서 초기화한다.
객체를 사용한 뒤 컨테이너가 종료 될 때 빈이 지정한 메소드를 호출해 소멸 과정을 진행한다.
스프링은 InitializingBean 인터페이스와 DisposableBean을 제공하고 있으며, 빈 객체의 클래스가 InitializingBean Interface 또는 DisposableBean을 구현하고 있으면 해당 인터페이스에 정의된 메서드를 호출해서 빈 객체의 초기화 및 종료를 진행할 수 있도록 한다.
public interface InitializingBean{ // 생성 관련한 인터페이스
void afterPropertiesSet() throws Exception;
}
public interface DispoasableBean{ // 소멸 관련한 인터페이스
void destroy() throws Exception;
}
public class sample implements InitializingBean, DisposableBean{
@Override
public void afterPropertiesSet() throws Exception{
//빈 생성후 메소드 호출
System.out.println("sample.afterPropertiesSet() 실행");
}
@Override
public void destroy() throws Exception{
// 소멸을 진행하는 메소드
System.out.println("sample.destroy() 실행");
}
}
3. Spring Bean Scope
Bean Scope는 기본적으로 빈이 존재하는 범위를 말한다.
Bean의 객체는 기본적으로 singleton의 범위를 가지며, singleton이란 스프링 컨테이너의 시작과 종료까지 단 하나의 객체만 사용하는 방식이다.
Bean객체의 범위를 prototype으로 지정하면 객체를 매번 새롭게 생성한다는 특징이 있다. 이와 같이 특정 Bean을 프로토타입으로 지정하려면 다음과 같이 @Scope애노테이션을 @Bean어노테이션과 함께 사용해야한다.
@Configuration
public class sample{
@Bean
@Scope("prototype")
public Tako tako(){
Tako tako = new Tako();
return tako;
}
@Bean
@Scope("singleton")
public Tako2 tako2(){
Tako2 tako = new Tako2();
return tako;
}
}
// 프로토타입의 경우 tako1 != tako2
Tako tako1 = ctx.getBean("tako",Tako.class);
Tako tako2 = ctx.getBean("tako",Tako.class);
// 싱글톤의 경우 tako1 == tako2
Tako tako1 = ctx.getBean("tako",Tako2.class);
Tako tako2 = ctx.getBean("tako",Tako2.class);
'Spring' 카테고리의 다른 글
ClassPathResource (0) | 2022.02.14 |
---|---|
thymeleaf에서 스프링 환경변수 사용하기 (0) | 2022.01.28 |
@JsonProperty (0) | 2022.01.28 |
Spring - @Autowired와 빈 객체 탐색 순서 (0) | 2021.05.29 |
스프링 - IOC와 DI (2) | 2021.05.13 |