반응형
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이 생성이 될 떄, 호출할 메소드와 소멸이 될 떄 호출할 메소드를 정의하는 방법에 대해서 알아보았습니다. 또한, 언제 생성이 되고, 언제 소멸이 되는 지에 대한 시점 역시 알 수 있었습니다. 프레임워크가 지정만 해놓는다면, 이렇게 알아서 메소드를 호출할 수 있다는 것이 상당히 인상적이었습니다.
반응형
'SW > Java' 카테고리의 다른 글
Java : Spring : 의존성 주입(Dependency Injection) : 개념, 예제, 구현 (0) | 2020.04.20 |
---|---|
Java : Spring : BeanPostProcessor : 개념, 방법, 예제, 구현 (0) | 2020.04.15 |
Java : Spring: bean : 객체 생성, 태그 : 개념, 예제, 구현 (0) | 2020.04.13 |
Java: Spring : IoC 개념 : ApplicationContext, BeanFactory : 예제, 구현 (0) | 2020.04.12 |
Java : Spring : bean : 사용방법, 예제, 관련 개념, 필요성 (0) | 2020.04.07 |