728x90
반응형
Bean Scope Prototype: part1
Bean Scope의 종류중 하나인 ProtoType 을 알아보자
Bean Scope의 정의는 아래 페이지를 참고하자.
https://vprog1215.tistory.com/70?category=989392
프로토타입의 특징
- 스프링 컨테이너에 요청 할 때마다 새로 생성
- 스프링 컨테이너는 프로토타입 빈의 생성과 의존관계 주입 그리고 초기화까지 관여
- 종료메서드 호출 안됨
- 프로토타입빈을 조회한 클라이언트가 관리해야됨.
- 종료메서드에 대한 호출도 클라이언트가 직접 해야된다.
Prototype Scope 와 Sigleton의 차이
먼저 싱글톤 타입과 차이를 알아보자
Singleton type은 하나의 객체를 생성하여 클라이언트들에게 동일한 객체를 제공한다.
싱글톤 스코프
프로토타입 스코프
차이점
- 싱글톤은 하나의 빈으로 모든 요청에 대응한다.
- 프로토타입은 요청마다 빈을 생성하여 반환후 컨테이너에서 관리를 하지 않는다.
- 싱글톤 빈은 스프링 컨테이너 시점에 초기화 메서드 실행
- 프로토타입 스코프의 빈은 스프링 컨테이너에서 빈을 조회할 때 생성되고, 초기화 메서드도 실행된다.
- 싱글톤 빈의 경우 빈은 스프링 컨테이너가 관리: 종료시 빈의 종료메서드 실행
- 프로토타입 빈의 경우 컨테이너가 생성, 의존관계주입, 초기화 까지만 관여: 종료메서드 안먹힘.
핵심
- 프로토타입에서 핵심은 스프링컨테이너는 프로토타입 빈을 생성하고, 의존관계 주입, 초기화 까지만 처리한다.
Singleton Code
package hello.core.scope;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Scope;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
public class SingletonTest {
@Test
void singletonBeanFind() {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(SingletonBean.class);
SingletonBean singletonBean1 = ac.getBean(SingletonBean.class);
SingletonBean singletonBean2 = ac.getBean(SingletonBean.class);
System.out.println("singletonBean1 =" + singletonBean1);
System.out.println("singletonBean2 =" + singletonBean1);
Assertions.assertThat(singletonBean1).isSameAs(singletonBean2);
ac.close();
}
@Scope("singleton")
static class SingletonBean {
@PostConstruct
public void init() {
System.out.println("SingletonBean.init");
}
@PreDestroy
public void destroy() {
System.out.println("SingletonBean.destroy");
}
}
}
Prototype Code
package hello.core.scope;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Scope;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
public class ProtoTypeTest {
@Test
void ProtoTypeBeanFind() {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(PrototypeBean.class);
System.out.println("find prototypeBean1");
PrototypeBean prototypeBean1 = ac.getBean(PrototypeBean.class);
System.out.println("find prototypeBean2");
PrototypeBean prototypeBean2 = ac.getBean(PrototypeBean.class);
System.out.println("PrototypeBean1 = " + prototypeBean1);
System.out.println("PrototypeBean1 = " + prototypeBean2);
Assertions.assertThat(prototypeBean1).isNotSameAs(prototypeBean2);
ac.close();
}
@Scope("prototype")
static class PrototypeBean {
@PostConstruct
public void init() {
System.out.println("PrototypeBean.init");
}
@PreDestroy
public void destroy() {
System.out.println("PrototypeBean.destroy");
}
}
}
728x90
반응형
'Spring > spring 기초 스터디' 카테고리의 다른 글
[Spring] Bean Scope Prototype: part3 (0) | 2021.06.14 |
---|---|
[Spring] Bean Scope Prototype: part2 (0) | 2021.06.12 |
[Spring] Bean Scope (0) | 2021.06.01 |
[Spring] Bean Callback (0) | 2021.05.29 |
[Spring] Bean 생명주기 (0) | 2021.05.26 |
댓글