본문 바로가기
Spring|Spring-boot

[Spring ] 빈 객체의 초기화와 소멸

by oncerun 2021. 1. 25.
반응형

스프링 컨테이너는 빈 객체의 라이프사이클을 관리한다.

 

객체 생성 -> 의존 설정 -> 초기화 -> 소멸 단계를 거친다.

 

스프링 컨테이너를 초기화 활 때 스프링 컨테이너는 가장 먼저 빈 객체를 생성하고 의존 주입을 한다. 의존 자동 주입을 통한 의존 설정이 이 시점에 실행되며, 모든 의존 설정이 완료되면 빈 객체를 초기화하기 위해 스프링은 빈 객체의 지정된 메서드를 호출한다.

 

스프링 컨테이너가 close() 메서드로 종료될 시점에 컨테이너는 빈 객체의 소멸을 처리한다. 이때에도 지정된 메서드를 호출한다.

 

지정된 메서드는 다음과 같다.

org.springframework.beans.factory.InitializingBean , org.springframework.beans.factory.DisposableBean

 

빈 객체가 InitializingBean 인터페이스를 구현하면 스프링 컨테이너는 초기화 과정에서 afterPropertiesSet() 메서드를 실행한다. 초기화 과정이 필요한 경우 해당 인터페이스를 상속받아 메서드를 구현하 된다.

 

빈 객체가 DisposableBean 인터페이스를 구현한 경우 소멸과정에서 빈 객체의 destory() 메서드를 실행한다.

 

해당 메서드가 필요한 경우가 바로 데이터베이스 커넥션 풀이다. 커넥션 풀을 위한 객체는 초기화 과정에서 데이터베이스와 연결을 생성하며 사용하는 동안에는 연결을 유지하다 빈 객체를 소멸할 때 연결을 종료해야 한다.

 

코드는 다음과 같다.

package chap06;

import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;

public class Client implements InitializingBean, DisposableBean{
	
	private String host;
	
	
	
	public Client() {
		System.out.println("객체 생성");
	}

	public void setHost(String host) {
		this.host = host;
	}

	@Override
	public void afterPropertiesSet() throws Exception {
	 System.out.println("초기화후 실행");
	}

	public void send() {
		System.out.println("Clinet.send() to " +  host);
	}
	
	@Override
	public void destroy() throws Exception {
		System.out.println("객체 소멸");
	}

}

 

package chap06.main;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;

import chap06.Client;
import chap06.config.AppCtx;

public class Main {

	public static void main(String[] args) {

		AbstractApplicationContext ctx = new AnnotationConfigApplicationContext(AppCtx.class);
		
		Client client = ctx.getBean(Client.class);
		client.send();
		
		ctx.close();
	}

}

콘솔 창에는 다음 순서이다 생성 -> 초기화 후 실행 -> send() 메서드 실행 -> 객체 소멸

 

이러한 초기화 메서드와 소멸 메서드도 커스텀이 가능한데 설정 파일에서 @Bean 속성을 이용한다.

package chap06.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import chap06.Client;

@Configuration
public class AppCtx {

	
	@Bean(initMethod = "초기화 후 실행될 메서드명", destoryMethod = "소멸과정시 실행될 메서드명")
	public Client client() {
		Client client = new Client();
		client.setHost("host");
		return client;
	}
}

이 경우 메서드에는 파라미터가 존재한다면 익셉션을 발생시킨다.

 

반응형

'Spring|Spring-boot' 카테고리의 다른 글

Spring Transaction  (0) 2021.04.03
Spring Security(3)  (0) 2021.03.28
[Spring] 의존 자동 주입 대상의 필수 유무설정  (0) 2021.01.25
JWT(2)  (0) 2020.08.18
Json Web Tokens(1)  (0) 2020.08.14

댓글