오늘의하루

Spring Bean Scope 본문

Spring

Spring Bean Scope

오늘의하루_master 2023. 8. 21. 12:23

Bean Scope

Bean이 존재할 수 있는 범위를 뜻한다.

 

Singleton

Bean의 기본 스코프이며 스프링 컨테이너의 시작부터 종료까지 유지되는 가장 넓은 범위의 스코프이다.

Prototype

스프링 컨태이너는 Prototype Bean의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않고 반환하는 가장 짧은 범위의 스코프이다.

  • 초기화 콜백까지는 불러주지만 소멸전 콜백은 해주지 않는다.
  • 종료 메서드의 경우 직접 호출해야한다.

만약 Singleton내부에서  Prototype을 사용하려면?

이 질문의 의도는 여러명의 클라이언트가 요청을 보낼때 마다 Prototype을 새롭게 만들어서 주입이 가능하냐는 말이다.

만약 기존에 의존관계를 주입하듯이 하면 처음 주입 받은 Prototype이 Singleton내부의 값이 되므로 새롭게 만들어지지 않는다.

@Scope("singleton") // 생략 가능
public class TestBean{
	
    private final PrototypeBean prototypeBean;
    
    @Autowired // 생략 가능
    public TestBean(PrototypeBean prototypeBean){
    	this.prototypeBean = prototypeBean;
    }
    
    public int logic(){
    	prototypeBean.addCount();
        return prototypeBean.getCount();
        // 이 경우 여러명의 클라이언트가 요청시 새롭게 prototypeBean이 생성되지 않는다.
    }
    
    //---------------------------------------------------------------------------
    
    private final ObjectProvider<PrototypeBean> prototypeBeanProvider;
    // ObjectProvider<T>은 지정된 타입을 스프링 빈에서 조회해 오는것이다.
    // 이때 Prototype은 스프링 컨테이너에서 생성, 주입, 초기화콜백을 하고 Client에게 반환된다.
    @Autowried
    public TestBean(ObjectProvider<PrototypeBean> prototypeBeanProvider){
    	this.prototypeBeanProvider = prototypeBeanProvider;
    }
    
    public int logic2(){
    	prototypeBean prototypeBean = prototypeBeanProvider.getObject();
        // 이 것을 통해서 매번 새롭게 조회해와서 사용할 수 있다.
    	prototypeBean.addCount();
        return prototypeBean.getCount();
    }
}


@Scope("prototype")
public class PrototypeBean{
	private int count = 0;
    
    public void addCount(){
    	count++;
    }
    
    public void getCount(){
    	return count;
    }
    
    @PostConstruct
    public void init(){
    	System.out.println("PrototypeBean.init");
    }
}

'Spring' 카테고리의 다른 글

Web Server, WAS, Servlet 정리  (0) 2023.08.22
Spring Web관련 Scope  (0) 2023.08.22
Spring Bean 생명 주기 콜백  (0) 2023.08.21
Spring 의존 관계 주입 정리  (0) 2023.08.21
Spring ComponentScan 관련 정리  (0) 2023.08.20
Comments