Spring Bean Life-cycle : 해당 객체가 언제 어떻게 생성되어 소멸되기 전까지 어떤 작업을 수행하고 언제, 어떻게 소멸되는지 일련의 과정을 이르는 말.
Spring Bean Life Cycle 흐름
1) 스프링 컨테이너 생성
2) 스프링 빈 생성
3) 의존관계 주입
4) 초기화 콜백 : 빈이 생성되고, 빈의 의존관계 주입이 완료된 후 호출
5) 사용
6) 소멸전 콜백 :빈이 소멸되기 직전에 호출
7) 스프링 종료
의존성 주입 과정
Bean으로 등록할 수 있는 어노테이션들과 설정파일들을 읽어 IoC 컨테이너 안에 Bean으로 등록시킨다.
의존 관계를 주입하기 전에 준비 단계
•
이 단계에서 객체의 생성이 일어난다.
◦
생성자 주입 : 객체의 생성과 의존관계 주입이 동시에 일어남
▪
why? → 의존관계가 존재하지 않는다면 객체 생성이 불가능
◦
Setter, Field주입 : 객체의 생성 → 의존관계 주입으로 라이프 사이클이 나누어져 있음
Setter 주입
Car 객체를 만들 때 의존관계가 필요하지 않다.
public class Car {
private Tire tire;
public setTire(Tire tire) {
this.tire = tire;
}
}
Java
복사
IoC 컨테이너에서 의존성 주입
Bean 생명주기 콜백
1.인터페이스( InitializingBean, DisposableBean )
2.설정 정보에 초기화 메소드, 종료 메소드 지정
3.@PostConstruct, @PreDestroy 어노테이션 사용
인터페이스( InitializingBean, DisposableBean )
public class ExampleBean implements InitializingBean, DisposableBean {
@Override
public void afterPropertiesSet() throws Exception {
// 초기화 콜백 (의존관계 주입이 끝나면 호출)
}
@Override
public void destroy() throws Exception {
// 소멸 전 콜백 (메모리 반납, 연결 종료와 같은 과정)
}
}
Java
복사
•
InitalizingBean은 afterPropertiesSet() 메소드로 초기화를 지원한다. (의존관계 주입이 끝난 후에 초기화 진행)
•
DisposableBean은 destory() 메소드로 소멸을 지원한다. (Bean 종료 전에 마무리 작업, 예를 들면 자원 해제(close() 등))
단점
•
InitalizingBean, DisposableBean 인터페이스는 스프링 전용 인터페이스이다. 해당 코드가 인터페이스에 의존한다.
•
초기화, 소멸 메소드를 오버라이드 하기 때문에 메소드명을 변경할 수 없다.
•
코드를 고칠 수 없는 외부 라이브러리에 적용 불가능
인터페이스를 사용하는 초기화 및 종료 방법은 스프링 초창기에 나온 방법들이며, 지금은 거의 사용하지 않는다.
설정 정보에 초기화 메소드, 종료 메소드 지정
@Bean(initMethod = "초기화메서드명", destroyMethod="소멸메서드명")
public class ExampleBean {
public void initialize() throws Exception {
// 초기화 콜백 (의존관계 주입이 끝나면 호출)
}
public void close() throws Exception {
// 소멸 전 콜백 (메모리 반납, 연결 종료와 같은 과정)
}
}
@Configuration
class LifeCycleConfig {
@Bean(initMethod = "initialize", destroyMethod = "close")
public ExampleBean exampleBean() {
// 생략
}
}
Java
복사
장점
•
메소드명을 자유롭게 부여 가능하다.
•
스프링 코드에 의존하지 않는다.
•
설정 정보를 사용하기 때문에 코드를 커스터마이징 할 수 없는 외부라이브러리에서도 적용 가능하다.
단점
•
Bean 지정시 initMethod와 destoryMethod를 직접 지정해야 하기에 번거롭다.
특징
@Bean의 destoryMethod는 기본값이 inferred으로 등록 , close, shutdown이라는 이름의 메소드가 종료 메소드라고 추론하고 자동으로 호출해준다.
→ 종료 메소드를 따로 부여하지 않더라도 잘 작동한다.
추론 기능을 사용하기 싫다면 destroyMethod=""으로 지정해줘야 한다.
@PostConstruct, @PreDestroy 어노테이션 사용
•
@PostConstruct 를 지정하면 스프링 빈등록시 초기화 메서드로 수행된다.
•
@PreDestroy 를 지정하면 소멸 메서드로 지정된다.
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
public class ExampleBean {
@PostConstruct
public void initialize() throws Exception {
// 초기화 콜백 (의존관계 주입이 끝나면 호출)
}
@PreDestroy
public void close() throws Exception {
// 소멸 전 콜백 (메모리 반납, 연결 종료와 같은 과정)
}
}
Java
복사
장점
•
어노테이션 하나만 붙이면 되므로 매우 편리하다.
•
해당 어노테이션의 import패키지가 javax.annotation.xxx 이다. 스프링에 종속적인 기술이 아닌 JSR-250이라는 자바 표준이다. 따라서 스프링이 아닌 다른 컨테이너에서도 동작한다.
•
컴포넌트 스캔과 잘어울린다.
단점
•
코드를 고칠 수 없는 외부 라이브러리에 적용 불가능
◦
외부 라이브러리에서 초기화, 종료를 해야 할 경우 두 번째 방법, @Bean의 initMethod와 destoryMethod 속성을 사용하자.