language/Spring

[Java/Spring] 빈 객체 라이프 사이클

zincah 2022. 3. 20. 16:41
반응형
빈 객체 라이프 사이클

스프링 컨테이너에 저장되는 빈 객체는 최소한 생성, 초기화, 소멸의 라이프 사이클을 갖습니다.

BeanFactory에서 빈 라이프 사이클
  1. BeanNameAware.setBeanName()
  2. BeanFactoryAware.setBeanFactory()
  3. BeanPostProcessor의 초기화 전처리
  4. 커스텀 init-method
  5. InitializingBean.afterPropertiesSet()
  6. BeanPostProcessor의 초기화 후처리
  7. 빈 객체 얻고 사용
  8. DisposableBean.destroy()
  9. 커스텀 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 종료
	}

}

- 출력 결과

반응형