SW/Java

Java : Spring: Bean 생성, 소멸 시 메소드 호출 방법 : 예제, 구현

얇은생각 2020. 4. 14. 19:30
반응형

Java : Spring: Bean 생성, 소멸 시 메소드 호출 방법 : 예제, 구현

 

Bean 객체의 생명주기

spring의 bean은 다음과 같은 상황일 떄 객체가 생성됩니다. 싱글톤인 경우 xml 파일을 로딩할 떄 객체가 생성됩니다. 싱글톤이고 lazy-init 속성이 true인 경우 getBean 메서드를 사용할 떄 객체가 생성됩니다. 또 prototype일 경우 getBean 메서드를 사용할 때 객체가 생성됩니다. spring bean은 다음과 같은 상황 일 떄 객체가 소멸됩니다. 즉, IoC 컨테이너가 소멸될 때, bean의 객체가 소멸이 됩니다.

 

 

 

객체 생성과 소멸 시 호출될 메서드 등록

객체가 생성되면  가장 먼저 생성자가 호출됩니다. 

init-method : 생성자 호출 이후 자동으로 호출됩니다.
destroy-method : 객체가 소멸될 떄 자동으로 호출됩니다.
default-init-method : init-method를 설정하지 않은 경우 자동으로 호출됩니다.
default-destroy-method : destory-method를 설정하지 않은 경우 자동으로 호출됩니다.

 

 

 

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>kr.co.softcampus</groupId>
	<artifactId>BeanLifeCycle</artifactId>
	<version>0.0.1-SNAPSHOT</version>

	<!-- xml에서 사용할 속성들 -->
	<properties>
		<!-- 자바 버전 -->
		<java-version>1.8</java-version>
		<!-- 스프링 버전 -->
		<org.springframework-version>5.1.9.RELEASE</org.springframework-version>
		<!--<org.springframework-version>4.3.25.RELEASE</org.springframework-version> -->
		<org.slf4j-version>1.7.26</org.slf4j-version>
		<ch.qos.logback-version>1.2.3</ch.qos.logback-version>
	</properties>

	<!-- 프로젝트에서 사용할 라이브러리 정보 -->
	<dependencies>
		<!-- spring context -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
		<!-- slf4j -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>${org.slf4j-version}</version>
		</dependency>
		<!-- logback -->
		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-classic</artifactId>
			<version>${ch.qos.logback-version}</version>
			<exclusions>
				<exclusion>
					<groupId>org.slf4j</groupId>
					<artifactId>slf4j-api</artifactId>
				</exclusion>
			</exclusions>
			<scope>runtime</scope>
		</dependency>

	</dependencies>
</project>

 

 

TestBean1.java

package kr.co.softcampus.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 메서드");
	}
}

 

 

TestBean2.java

package kr.co.softcampus.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");
	}
}

 

 

TestBean3.java

package kr.co.softcampus.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 메서드");
	}
}

 

 

TestBean4.java

package kr.co.softcampus.beans;

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

 

 

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='kr.co.softcampus.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='kr.co.softcampus.beans.TestBean2' lazy-init='true'/>
	
	<!-- 만약 init-method, destroy-method와 default-init-method, default-destroy-method에 등록되어 있는 메서드가 모두 있을 경우
		init-method, destroy-method에 설정되어 있는 메서드가 호출된다.-->
	<bean id='t3' class='kr.co.softcampus.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='kr.co.softcampus.beans.TestBean4' lazy-init='true' init-method='bean4_init' destroy-method='bean4_destroy'/>
</beans>

 

 

MainClass.java

package kr.co.softcampus.main;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import kr.co.softcampus.beans.TestBean1;
import kr.co.softcampus.beans.TestBean2;
import kr.co.softcampus.beans.TestBean3;
import kr.co.softcampus.beans.TestBean4;

public class MainClass {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("kr/co/softcampus/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();
	}

}

 

 

이번 예제에서는 bean이 생성이 될 떄, 호출할 메소드와 소멸이 될 떄 호출할 메소드를 정의하는 방법에 대해서 알아보았습니다. 또한, 언제 생성이 되고, 언제 소멸이 되는 지에 대한 시점 역시 알 수 있었습니다. 프레임워크가 지정만 해놓는다면, 이렇게 알아서 메소드를 호출할 수 있다는 것이 상당히 인상적이었습니다. 

반응형