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를 지정하지 않으면 스프링에서 default는 singleton 이다.
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 { } |