language/Spring
[Java/Spring] 빈 객체 라이프 사이클
zincah
2022. 3. 20. 16:41
반응형
빈 객체 라이프 사이클
스프링 컨테이너에 저장되는 빈 객체는 최소한 생성, 초기화, 소멸의 라이프 사이클을 갖습니다.
BeanFactory에서 빈 라이프 사이클
- BeanNameAware.setBeanName()
- BeanFactoryAware.setBeanFactory()
- BeanPostProcessor의 초기화 전처리
- 커스텀 init-method
- InitializingBean.afterPropertiesSet()
- BeanPostProcessor의 초기화 후처리
- 빈 객체 얻고 사용
- DisposableBean.destroy()
- 커스텀 destroy-method
BeanFactory 라이프 사이클 예제
- 인터페이스 작성 : MyLifeBean.java
package zinc.spring.lifecycle;
public interface MyLifeBean {
void sayHello();
}
- 인터페이스 구현 클래스 : MyLifeBeanImpl.java
Bean factory life cycle을 확인할 수 있는 클래스
package zinc.spring.lifecycle;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
public class MyLifeBeanImpl implements MyLifeBean, BeanNameAware, BeanFactoryAware, InitializingBean, DisposableBean {
private String greeting;
private String beanName;
private BeanFactory beanFactory;
public MyLifeBeanImpl() { // 생성자
System.out.println("1. 빈 생성자 실행");
}
public void setGreeting(String greeting) {
this.greeting = greeting;
System.out.println("2. 빈 setter 메소드 실행");
}
@Override
public void setBeanName(String beanName) {
System.out.println("3. 빈 이름 설정");
this.beanName = beanName;
System.out.println("--->" + this.beanName);
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
System.out.println("4. 빈 팩토리 설정");
this.beanFactory = beanFactory;
System.out.println("---> " + this.beanFactory.getClass());
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("6. Property 설정 완료");
}
public void init() {
System.out.println("7. 초기화 메소드 수행");
}
@Override
public void sayHello() {
System.out.println(greeting + beanName + "!!!");
}
@Override
public void destroy() throws Exception {
System.out.println("종료");
}
}
* MyLifeBean, BeanNameAware, BeanFactoryAware, InitializingBean, DisposableBean 상속
- BeanPostProcessor 인터페이스를 구현한 클래스 : CustomBeanPostProcessor.java
package zinc.spring.lifecycle;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
public class CustomBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("5. 초기화 전에 빈에 대한 처리를 실힝");
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("8. 초기화 후 빈에 대한 처리를 실행");
return bean;
}
}
- 설정파일 : /src/main/resources/applicationContext.xml
<bean id="myLifeBean" class="zinc.spring.lifecycle.MyLifeBeanImpl" init-method="init">
<property name="greeting"><value>Hello, </value></property>
</bean>
<bean class="zinc.spring.lifecycle.CustomBeanPostProcessor"/>
<beans> 태그 내부에 작성 해주면 됩니다.
- 테스트 클래스 : MyLifeBeanMain.java
package zinc.spring.lifecycle;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
public class MyLifeBeanMain {
public static void main(String[] args) {
AbstractApplicationContext factory =
new GenericXmlApplicationContext("applicationContext.xml");
// spring container 작동
MyLifeBean bean = (MyLifeBean) factory.getBean("myLifeBean");
// myLifeBean 이라는 이름으로 bean 가져오기
// applicationContext BeanPostProcessor를 자동으로 등록
bean.sayHello(); // 메소드 실행
factory.close(); // spring container 종료
}
}
- 출력 결과
반응형