250x250
Notice
Recent Posts
Recent Comments
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags more
Archives
Today
Total
관리 메뉴

개린이 개발노트

[Spring] 스프링 빈(bean) 객체의 생명주기 본문

스프링Spring

[Spring] 스프링 빈(bean) 객체의 생명주기

개린이9999 2023. 1. 10. 08:18
728x90

Spring의 Bean은 다음과 같은 상황일 때 객체가 생성된다.

싱글톤인 경우 xml파일을 로딩할 때 객체가 생성된다.

싱글톤이고 lazy-unit 속성이 true일경우 getBean메서드를 사용할 때 객체가 생성된다.

prototype일 경우 getBean메서드를 사용할 때 객체가 생성된다.

 

Spring의 Bean은 다음과 같은 상황일 때 객체가 소멸된다.

IoC컨테이너가 종료 때 객체가 소멸된다. (==close 메서드를 호출할 때)

 

메서드가 없을 경우 

default-init-method 아무일도 발생 x

default destroy method 아무일도 발생x

init-method 오류발생

destroy 오류 발생

 

Spring 에서는 객체가 생성될 때 호출될 메서드가 소멸될 때 호출될 메서드를 지정할 수 있다. 

 

예제 ↓

package sanghoon.beans;


public class TestBean1 {
	
	public TestBean1() {
		System.out.println("TestBean1의 생성자 입니다.");
	}

	public void bean1_init() {
		System.out.println("TestBean1의 init메서드");
	}

	public void bean1_destroy() {
		System.out.println("TestBean1의 destroy 메서드");
	}
}
package sanghoon.beans;

public class TestBean2 {
	
	public TestBean2() {
		System.out.println("TestBean2의 생성자");
	}
	
	public void default_init() {
		System.out.println("TestBean2의 default_init");
	}
	
	public void default_destroy() {
		System.out.println("TestBean2의 default_destroy");
	}
	
}
package sanghoon.beans;

public class TestBean3 {

	public TestBean3() {
		System.out.println("TestBean3의 생성자");
	}
	
	public void default_init() {
		System.out.println("TestBean3의 default_init");
	}
	
	public void default_destroy() {
		System.out.println("TestBean3의 default_destroy");
	}
	
	public void bean3_init() {
		System.out.println("TestBean3의 init 메서드");
	}
	
	public void bean3_destroy() {
		System.out.println("TestBean3의 destroy 메서드");
	}
}
package sanghoon.beans;

public class TestBean4 {
	
	public TestBean4() {
		System.out.println("TestBean4의 생성자");
	}

}

위는 테스트클래스 1부터4까지 

메인클래스 ↓

package sanghoon.main;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import sanghoon.beans.TestBean1;
import sanghoon.beans.TestBean2;
import sanghoon.beans.TestBean3;
import sanghoon.beans.TestBean4;

public class MainClass {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
	ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("sanghoon/config/beans.xml");
	
	TestBean1 t1 = ctx.getBean("t1",TestBean1.class);
	System.out.printf("t1:%s\n", t1);
	
	System.out.println("----------------------------");
	
	TestBean2 t2 = ctx.getBean("t2",TestBean2.class);
	System.out.printf("t2:%s\n", t2);
	
	System.out.println("----------------------------");
	TestBean3 t3 = ctx.getBean("t3",TestBean3.class);
	System.out.printf("t3:%s\n", t3);
	
	System.out.println("----------------------------");
	TestBean4 t4 = ctx.getBean("t4",TestBean4.class);
	System.out.printf("t4:%s\n", t4);
	
	
	System.out.println("----------------------------");
	ctx.close();
	
	}

}

가장중요한 beans.xml !! 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	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"
	default-init-method="default_init"
	default-destroy-method="default_destroy">

	
	<!-- ↓객체가 생성될 때 생성자가 호출된 이후 init-method에 설정한 메서드가 자동으로 호출되고 IoC 컨테이너의 close 메서드를 호출하면
		객체가 소멸되며 destroy-method에 설정한 메서드가 자동으로 호출된다.↓   -->
	<bean id='t1' class='sanghoon.beans.TestBean1' lazy-init='true'
		init-method="bean1_init" destroy-method="bean1_destroy" />

	
	<!-- ↓init-method와 destroy-method가 설정되어 있지 않다면 위의 default-init-method, default-destroy-method에
	설정되어있는 메서드를 호출한다.↓   -->
	<bean id='t2' class='sanghoon.beans.TestBean2' lazy-init='true' />

	
	<!-- ↓init-method와 destroy-method, default-init-method 와 default-destroy 에 등록되어있는 메서드가 모두 있을경우↓   
		init-method와 destroy-method에 설정되어있는 메서드가 호출된다.// 즉 전체적인 것보다 자기자신에게 설정되어있는 것을 우선시-->
	<bean id='t3' class='sanghoon.beans.TestBean3' lazy-init='true'
		init-method='bean3_init' destroy-method="bean3_destroy" />

		<!-- default-init-method, default-destroy-method: 설정한 메서드가 존재하지않으면 무시된다.  
		init-method,destroy-method: 설정한 메서드가 없으면 오류가 발생한다.↓-->
		
		<bean id='t4' class='sanghoon.beans.TestBean4' lazy-init='true' />
	
</beans>

 

728x90