본문 바로가기

Java/Spring

Container와 Bean의 Lifecycle / Scope

1. Container Lifecycle

2. Bean Lifecycle

Bean 초기화 과정에서 InitializingBean 인터페이스의 afterPropertiesSet() 가 호출되고, Bean 소멸 과정에서 DisposableBean 인터페이스의 destroy() 가 호출된다.

오버라이드해서 Bean 초기화 / 소멸 과정에 개입가능하고, student.destroy()와 같이 사용하여 
컨테이너와 별개로 Bean만 소멸시킬 수도 있다.




혹은 Annotation을 사용할 수도 있다.
@PostConstruct를 붙이면 초기화시 / @PreDestroy를 붙이면 소멸시 해당 메소드가 호출된다. (메소드명은 관계없음)

3. Bean Scope

스프링 컨테이너 / 빈이 생성될 때 빈은 Scope, 범위를 갖고 있다. 

아래의 예제에서는 xml을 이용하여 Student 클래스의 객체를 생성하는데 생성자를 이용해 이름을 홍길순, 나이를 30살로 초기화시키고 있다.

그리고 student1과 student2 객체를 각각 얻어오는데 
student1은 그대로 두고 student2에서는 이름과 나이를 setter를 이용해 변경해 준 뒤 둘을 비교한다.



분명 홍길순:30 / 흘길자:100 으로 이름과 나이가 다르게 찍히고 
Student student1 = 
Student student2 = 로 객체를 각각 얻어왔으므로 서로 다른 객체라고 생각하겠지만

객체생성은 스프링 설정파일에서 <bean>을 통해 하고 있고 우리는 그것을 getBean()을 통해 얻어오기만 하는 것이다.
우리가 필드값을 set()을 이용해 변경했을지라도 달라진 것은 속성뿐이지 객체의 주소값은 같은 곳을 가리키고 있다.
그러므로 student1.equals(student2)true가 된다.



위의 예제에서는 singleton이라고 scope가 지정되어 있는데

별도의 scope를 지정하지 않으면 스프링에서 defaultsingleton 이다.


singleton : 기본 싱글톤 스코프

prototype : 어플리케이션에서 요청시 (getBean()) 마다 스프링이 새 인스턴스를 생성

request : HTTP 요청별로 인스턴스화 되며 요청이 끝나면 소멸 (spring mvc webapplication 용도)

session : HTTP 세션별로 인스턴스화되며 세션이 끝나며 소멸 (spring mvc webapplication 용도)

global session : 포틀릿 기반의 웹 어플리케이션 용도. 전역 세션 스코프의 빈은 같은 스프링 MVC를 사용한 포탈 어플리케이션 내의 모든 포틀릿 사이에서 공유할 수 있다

thred : 새 스레드에서 요청하면 새로운 bean 인스턴스를 생성, 같은 스레드에 대해서는 항상 같은 bean 인스턴스가 반환

custom : org.pringframework.beans.factory.config.Scope를 구현하고 커스텀 스코프를 스프링의 설정에 등록하여 사용

 

request, session, global session의 스코프는 일반 spring 어플리케이션이 아닌, Spring MVC Web Application에서만 사용되는 용도

XML 사용방법

 xml 설정파일 bean정의 시 scope 명시적 지정

1
<bean id="normalBean" class="com.java.SomeClass" scope="singleton"/>
cs

Annotation 사용방법

 대상 Class 어노테이션 정의시 @Scope 지정

1
2
3
4
5
6
7
8
9
package com.java.pojo;
 
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
 
@Service("simpleBean")
@Scope("singletone")
public class SimpleClass {
}