Kim Hyeong
DI의 Life Cycle 본문
DI의 Life Cycle
Bean 객체의 생성과 소멸
생성 시점에 작업 처리하기
- 생성자가 호출되는 시점에 필요한 작업을 처리할 수 있다.
- InitializingBean 을 implements 하고 추상 메서드 afterPropertiesSet() 를 이용해 필요한 작업을 처리할 수 있다.
- 또 다른 방법으로 @PostConstruct 어노테이션을 이용하는 방법, xml파일에 -nit-method 를 사용하는 방법이 있다.
- 생성자까지 포함해서 생성시 작업을 할 수 있는 방법은 총 4가지가 존재.
- 생성자 -> PostConstruct -> afterPropertiesSet -> xml의 init-method 순서로 호출됨
- @PostConstruct 어노테이션을 이용하려면 xml namespace에 context를 체크해주고 , context:annotation-config 을 xml에 작성 해주어야함.
소멸 시점에 작업 처리하기
- 자바는 C언어와 달리 소멸자가 없으므로 ctx.close()시점 즉 Spring Container가 종료되는 시점에 남은 처리를 잡아서 수행한다.
- DisposableBean 을 implements 하고 추상 메서드 destroy() 를 이용해 구현한다.
- 또 다른 방법으로 @PreDestroy 어노테이션을 이용하는 방법, xml파일에 destroy-method 를 사용하는 방법이 있다.
- 소멸 작업을 할 수 있는 방법은 총 3가지가 존재.
생성, 소멸 예제 코드
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:context="http://www.springframework.org/schema/context"
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-3.2.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd">
<context:annotation-config />
<!-- Spring 컨테이너에 의해 3개의 책 DTO가 생성. -->
<!-- scope는 디폴트로 singleton, 싱글톤이란 객체가 딱 하나만 존재하는것 -->
<bean id = "book1"
class = "exam_02_04_BookShelf.dto.BookDTO"
scope="singleton"
init-method="myInit"
destroy-method="myDestroy">
<!-- init-method는 초기화메서드를 추가로 지정 -->
<property name ="btitle">
<value> 젊은 베르테르의 슬픔</value>
</property>
<property name="bauthor">
<value>괴테</value>
</property>
</bean>
</beans>
package exam_02_04_BookShelf;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
import exam_02_04_BookShelf.dto.BookDTO;
public class Main {
public static void main(String[] args) {
String config = "classpath:applicationCtx.xml";
//Spring Container 생성
GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();
//xml문서 불러들이는 부분
ctx.load(config);
//load 메서드로 xml을 불러올 경우 반드시 refresh() 메서드를 수행해야함.
//xml 적용
ctx.refresh();
//Bookshelf 클래스 타입인 shelf 객체를 끄집어냄
BookShelf shelf = ctx.getBean("shelf",BookShelf.class);
System.out.println("책장 title : " + shelf.getTitle());
System.out.println("책장 price : " + shelf.getPrice());
//shelf에서 getList를 통해 ArrayList를 뽑아내고 그 ArrayList 안에서 인덱스 1인 BookDTO를 뽑아내서
//title값을 알아낸다.
System.out.println(shelf.getList().get(1).getBtitle());
//shelf에서 getMap을 통해 HashMap을 뽑아내고 그 HashMap 안에서
//key 값이 2인 BookDTO를 찿아서 책의 제목을 출력
System.out.println(shelf.getMap().get(2).getBtitle());
ctx.close();
}
}
package exam_02_04_BookShelf.dto;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
public class BookDTO implements InitializingBean , DisposableBean{
//필드는 특별한 이유가 있지 않는한 information hiding때문에
//private으로 설정한다.
private String btitle;
private String bauthor;
//생성자 -> PostConstruct -> afterPropertiesSet -> xml의 init-method 순서로 호출됨
//기본 constructor는 사용하던 사용하지 않던간에 반드시 명시를 해 주세요!!
public BookDTO()
{
//instance가 생성되면 호출
//bean 객체를 초기화 할때 여기에서 작업해 주면 된다.
System.out.println("BookDTO 생성자 호출");
}
@Override
public void afterPropertiesSet() throws Exception {
//bean 객체를 초기화 할때 여기에서 작업해 주면 된다.
System.out.println("afterPropertiesSet 메서드 호출");
}
//PostConstruct 는 <context:annotation-config/> 를 xml파일에 추가해줘야 사용가능 , namespace에 context 추가
@PostConstruct
public void initBean()
{
System.out.println("initBean 메서드 호출");
}
public void myInit()
{
System.out.println("myInit 메서드 호출");
}
@Override
public void destroy() throws Exception {
System.out.println("destroy 메서드 호출");
}
@PreDestroy
public void destroyBean()
{
System.out.println("destroyBean 메서드 호출");
}
public void myDestroy()
{
System.out.println("myDestroy 메서드 호출");
}
//private 필드에 대한 getter/setter
public String getBtitle() {
return btitle;
}
public void setBtitle(String btitle) {
this.btitle = btitle;
}
public String getBauthor() {
return bauthor;
}
public void setBauthor(String bauthor) {
this.bauthor = bauthor;
}
}
package exam_02_04_BookShelf;
import java.util.ArrayList;
import java.util.HashMap;
import exam_02_04_BookShelf.dto.BookDTO;
public class BookShelf {
private String title; //책장명
private int price; //책장가격
private ArrayList<BookDTO> list;
private HashMap<Integer,BookDTO> map;
//기본 생성자는 쓰든 쓰지 않든 무조건 명시해주자.
public BookShelf()
{
}
//생성자 injtection 방식으로 2개의 필드 설정
public BookShelf(String title, ArrayList<BookDTO> list)
{
this.title = title;
this.list = list;
}
public void setPrice(int price) {
this.price = price;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public ArrayList<BookDTO> getList() {
return list;
}
public void setList(ArrayList<BookDTO> list) {
this.list = list;
}
public int getPrice() {
return price;
}
public HashMap<Integer, BookDTO> getMap() {
return map;
}
public void setMap(HashMap<Integer, BookDTO> map) {
this.map = map;
}
}
'Spring' 카테고리의 다른 글
스프링 MVC 흐름과 주요 구성 컴포넌트 (0) | 2018.08.16 |
---|---|
Spring Framework의 기본적인 개념 (0) | 2018.08.10 |
지금까지 배운 DI 와 IoC 정리 (0) | 2018.08.10 |
Spring Framework 실습 - Java Class를 이용한 방식 (0) | 2018.08.10 |
Spring Framework 실습 - XML을 이용한 방식 (1) | 2018.08.10 |
Comments