티스토리 뷰
반응형
이전 글에서는 컨테이너의 생명주기를 간략하게 정리하였다.
이번 글에는 유사한 예제로 빈의 생명주기를 보겠다.
스프링 빈 생명주기
스프링 빈은 간단하게 아래와 같이 라이프사이클을 가진다.
객체 생성 - 의존관계 주입
스프링 빈의 이벤트 라이프사이클을 자세히 보면 아래와 같다.
스프링 컨테이너 생성 → 스프링 빈 생성→ 의존관계 주입 → 초기화 콜백 → 사용 → 소멸 전 콜백 → 스프링 종료
라이프사이클 콜백 지원을 인터페이스로 한다면, 아래와 같은 시나리오가 된다.
- 스프링 컨테이너가 초기화 할 때, 빈 객체를 설정 정보에 따라 생성하고, 의존 관계를 설정한다.
- 의존 설정이 완료되면, 빈 객체가 지정한 메소드(afterPropertiesSet())를 호출해 초기화한다.
- 컨테이너가 종료될 시 빈 객체가 지정한 메소드(destroy())를 호출해 빈 객체의 소멸을 처리한다.
빈 생명주기 콜백 지원 3가지 방법
- 인터페이스 (InitializingBean, DisposableBean)
- @PostConstruct, @PreDestory 애노테이션
- 설정 정보에 초기화 메소드, 종료 메소드 지정
1. 인터페이스 (InitializingBean, DisposableBean)
InitializingBean, DisposableBean 인터페이스를 상속받아 아래 콜백 메소드를 오버라이딩한다
// 초기화 인터페이스
public interface InitializingBean {
void afterPropertiesSet() throws Exception;
}
// 소멸 인터페이스
public interface DisposableBean {
void destroy() throws Exception;
}
예제
인터페이스 구현
import java.util.ArrayList;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
//콜백 메서드를 오버라이딩한다
public class Student implements InitializingBean,DisposableBean {//초기화 인터페이스, 소멸 인터페이스
private String name;
private int age;
public Student() {
// TODO Auto-generated constructor stub
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public void afterPropertiesSet() throws Exception {
// TODO Auto-generated method stub
System.out.println("#3에서 생성-Student에서 호출");
}
//콜백 메서드 - 자동 인계되는 메서드다.
@Override
public void destroy() throws Exception {
// TODO Auto-generated method stub
System.out.println("#3에서 close가 호출-Student에서 호출");
}
}
컨테이너
// 스프링 컨테이너 생성
GenericXmlApplicationContext ctx=new GenericXmlApplicationContext();
// 스프링 컨테이너 설정
ctx.load("classpath:applicationCTX_ex13.xml");
ctx.refresh(); // 의존관계 설정 후 -> refresh할 때 자동 인계 -"콜백"afterPropertiesSet()
// 스프링 컨테이너 사용 Student std1=ctx.getBean("student1",Student.class);
System.out.println(std1.getName());
System.out.println(std1.getAge());
// 스프링 컨테이너 종료
ctx.close(); //close() 자동 인계-"콜백"destroy()
2. @PostConstruct, @PreDestory 애노테이션
위의 인터페이스 방식과 유사하다. 인터페이스를 구현하는 대신 @PostConstruct, @PreDestory 애노테이션 붙여 콜백 메소드를 정의한다.
예제
메소드 구현
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
public class OtherStudent {
private String juso;
private double height;
private double weight;
public OtherStudent() {
// TODO Auto-generated constructor stub
}
...
//생성시 호출될 메서드
@PostConstruct //생성 후 ..post
public void initMethod(){
//db 연동 후 데이터 검색 등
System.out.println("----------------------------------");
System.out.println("#4. 임의의 메서드-실행-생성후");
System.out.println(getJuso());
System.out.println(getHeight());
System.out.println(getWeight());
System.out.println("----------------------------------");
}
//파괴시 호출될 메서드
@PreDestroy // pre-: ~~하기전
public void destroyMethod(){
//메모리 소거(close)등을 수행
System.out.println("#4. 임의의 메서드-소멸시키기 전 ");
}
}
컨테이너
GenericXmlApplicationContext ctx=new GenericXmlApplicationContext();
ctx.load("classpath:applicationCTX_ex13.xml");
ctx.refresh(); //설정 파일로 초기화 해라!
OtherStudent otherStudent=ctx.getBean("otherStudent",OtherStudent.class);
//other에서도 소멸시 실행할 메서드를 호출하려면??
otherStudent.destroyMethod();//소멸할 때, 실행할 내용을
//갖고 있는 메서드를 "콜백"시키지 말고..
//바로 사용하고 싶어서 명시적으로 호출하고 있다.
//ctx가 보유중인 모든 bean을 소멸시켜라
ctx.close();
3. 설정 정보에 초기화 메소드, 종료 메소드 지정
xml 파일에 bean을 정의하면서 속성으로 init-method, destory-method를 설정한다. 값으로는 해당시점에 호출하는 메소드명을 입력한다.
<?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: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-4.2.xsd">
<bean id="student1" class="com.koreait.ex13_bean_life_cycle.Student">
<constructor-arg value="홍길동" />
<constructor-arg value="30" />
</bean>
<bean id="otherStudent" class="com.koreait.ex13_bean_life_cycle.OtherStudent"
init-method="initMethod" destroy-method="destroyMethod">
<constructor-arg value="서울시 강남구 서초동" />
<constructor-arg value="178.1" />
<constructor-arg value="68.1" />
</bean>
</beans>
반응형
'FrameWork > Spring' 카테고리의 다른 글
Spring Bean 의 Scope/ 빈의 영역 (0) | 2021.05.30 |
---|---|
POJO(Plain Old Java Object) (0) | 2021.05.25 |
스프링(Spring) 컨테이너의 생명 주기 (0) | 2021.05.24 |
스프링(Spring) Bean 생성하기 (0) | 2021.05.24 |
스프링(Spring) DI(Dependency Injection)와 IoC 컨테이너 (0) | 2021.05.24 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- C++
- 개발중캐시삭제
- C# java 차이점
- html
- c#
- 캐시삭제
- 백준
- 백준퇴사
- 백준14501
- 퇴사
- 프론트엔드
- boj
- html꿀팁
- 런타임에러
- 프론트엔드개발자
- script버전
- 선언적트랜잭션 #noRollbackFor #@Transactional
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
글 보관함