Free Lines Arrow
본문 바로가기
Spring/spring 기초 스터디

[Spring] Bean Scope Prototype: part1

by skahn1215 2021. 6. 1.
728x90
반응형

Bean Scope Prototype: part1

Bean Scope의 종류중 하나인 ProtoType 을 알아보자

 

Bean Scope의 정의는 아래 페이지를 참고하자.

https://vprog1215.tistory.com/70?category=989392 

 

[Spring] Bean Scope

Bean Scope 란? 스프링 빈이 컨테이너의 시작과 함께 생성 되고 종료될 때 까지 유지 된다고 알고 있다. 기본적으로 싱글톤 스코프로 생성되기 때문이다. Scope는 말 그대로 빈이 존재할 수 있는 범위

vprog1215.tistory.com

 

프로토타입의 특징

  • 스프링 컨테이너에 요청 할 때마다 새로 생성
  • 스프링 컨테이너는 프로토타입 빈의 생성과 의존관계 주입 그리고 초기화까지 관여
  • 종료메서드 호출 안됨
  • 프로토타입빈을 조회한 클라이언트가 관리해야됨.
  • 종료메서드에 대한 호출도 클라이언트가 직접 해야된다.

 

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");
        }
    }
}

 

 

 

 

참고: https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/lecture/55389?tab=note 

 

스프링 핵심 원리 - 기본편 - 인프런 | 학습 페이지

지식을 나누면 반드시 나에게 돌아옵니다. 인프런을 통해 나의 지식에 가치를 부여하세요....

www.inflearn.com

 

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

댓글