[Spring] 스프링 빈(Bean) 초기화, 소멸 시 특정 작업을 하는 방법

2021. 4. 22. 01:09 Spring Framework/Spring Core

 

[Spring] 스프링 빈(Bean)이 초기화, 소멸 시 특정 작업을 하는 방법

방법 1: InitializingBean, DisposableBean 인터페이스 구현
방법 2: 스프링 XML 설정 사용

 

1. 인터페이스 구현

Spring에서 제공하는 InitializingBean, DisposableBean 인터페이스를 구현한다.

public class BookDao implements InitializingBean, DisposableBean {

	@Override
	public void afterPropertiesSet() throws Exception {
		// 빈 초기화 시 코드 구현
	}

	@Override
	public void destroy() throws Exception {
		// 빈 소멸 시 코드 구현
	}
}

InitializingBean 인터페이스의 afterPropertiesSet() 메소드에 빈 객체 초기화 시 필요한 코드를 구현하고 DisposableBean 인터페이스의 destroy() 메소드에 빈 객체 소멸 시 필요한 코드를 구현한다.

 

2. 스프링 XML 설정

XML 설정 파일

<bean id="bookRegisterService" class="com.brms.book.service.BookRegisterService" 
	init-method="initMethod" destroy-method="destroyMethod"/>

 

<bean> 태그의 init-method, destroy-method 속성을 사용해서 1번 방법과 동일한 기능을 구현할 수 있다.

init-method에 빈 객체 초기화 시 호출할 메소드 이름을, destroy-method 속성에 빈 객체 소멸 시 호출할 메소드 이름을 설정한다.

 

자바 코드

public class BookRegisterService {

	public void initMethod() {
		// 빈 초기화 시 코드 구현
	}
	
	public void destroyMethod() {
		// 빈 소멸 시 코드 구현
	}
}

해당하는 클래스에서 init-method, destroy-method 속성에 설정한 각 메소드를 구현한다.

 

3. default-init-method와 default-destroy-method

스프링 XML 설정에서 <beans> 레벨에 설정할 수 있는 속성이다.

init-method와 destroy-method 속성이 설정되어 있지 않으면 해당 빈의 생성, 소멸 시 기본적으로 호출할 메소드를 설정한다.

 

자바 코드

public class BookRegisterService {

	public void defaultInitMethod() {
		// 빈 초기화 시 코드 구현
	}
	
	public void defaultDestroyMethod() {
		// 빈 소멸 시 코드 구현
	}
}

 

XML 설정

 
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"
       default-init-method="defaultInitMethod" default-destroy-method="defaultDestroyMethod">

 

<beans>에 default-init-method, default-destroy-method 속성을 추가하고 메소드 이름을 설정한다.

모두 설정되어 있다면 <bean>의 init-method, destroy-method가 우선시된다.

 

4. BeanPostProcessor

빈 객체 생성

⬇️

[ BeanPostProcessor.postProcessBeforeInitialization ]

⬇️

init-method

⬇️

[ BeanPostProcessor.postProcessAfterInitialization ]

 

Spring은 객체가 생성될 때 init-method로 지정된 메서드가 호출되기 , 에 추가적인 다른 메서드를 호출할 수 있도록 지원한다.

이 기능은 BeanPostProcessor 인터페이스를 구현하여 사용할 수 있다.

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

public class TestBeanPostProcessor implements BeanPostProcessor {

    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        // 코드 구현...
        
        return bean;
    }

    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        // 코드 구현...
        
        return bean;
    }
}

 

메소드 아규먼트로 빈 객체와 빈 이름을 받아서 빈 객체마다 다른 처리를 할 수 있다.

두 메소드 모두 빈 객체를 리턴하여 마무리한다.

 

출처 : atoz-develop.tistory.com/entry/Spring-%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B9%88Bean-%EC%B4%88%EA%B8%B0%ED%99%94-%EC%86%8C%EB%A9%B8-%EC%8B%9C-%ED%8A%B9%EC%A0%95-%EC%9E%91%EC%97%85%EC%9D%84-%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95?category=869243