[Spring5입문] 빈 라이프사이클과 범위

2021. 8. 9. 19:41CSE/Spring

1. 컨테이너 초기화와 종료

-  스프링 컨테이너는 초기화와 종료라는 라이프사이클을 갖는다.

public class Example{
	public static void main(String[] args){
          //1. 컨테이너 초기화
          AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppContext.class);

          //2. 컨테이너에서 빈 객체를 구해서 사용
          Greeter g = ctx.getBean("greater", Greeter.class);
          String.msg = g.greet("스프링");
          System.out.println(msg);

          //3.컨테이너 종료
          ctx.close();
	}
}

(1) 컨테이너 초기화

- AnnotationConfigApplicationContext의 생성자를 이용해서 컨텍스트 객체를 생성한다.

- 스프링 컨테이너 초기화 : 설정 클래스에서 정보를 읽어와 알맞은 빈 객체를 생성하고 각 빈에 대한 의존 주입 작업을 진행

 

(2) 컨테이너 사용

- getBean()과 같은 메서드를 이용해서 컨테이너에 보관된 빈 객체를 구한다

 

(3) 컨테이너 종료

- close() 메서드를 사용해서 컨테이너를 종료한다.

- close() 메서드는 AbstractApplicationContext 클래스에 정의되어있고, AnnotationConfigApplicationContext 클래스는 해당 클래스를 상속받고 있다.

 

★ 컨테이너 초기화 -> 빈 객체의 생성, 의존 주입, 초기화

★ 컨테이너 종료 -> 빈 객체의 소멸

 

2. 스프링 빈 객체의 라이프사이클

- 스프링 컨테이너는 빈 객체의 라이프사이클을 관리한다.

- 스프링 컨테이너 초기화 中 

=> 빈 객체를 생성하고 의존을 설정한다. (자동 주입을 통한 의존 설정이 수행됨)

=> 빈 객체의 초기화를 수행하기 위해 빈 객체의 지정된 메서드(afterPropertiesSet()) 호출한다.

- 스프링 컨테이너 종료 中 : 빈 객체의 소멸을 처리하기 위해 지정된 메서드 (destroy())을 호출한다.

 

(1) 빈 객체의 초기화와 소멸 : 스프링 인터페이스

- 스프링 컨테이너는 초기화 과정 중, 빈 객체의 afterPropertiesSet() 메서드를 실행한다.

=> 따라서 빈 객체 생성 후, 초기화 과정이 필요하면 InitializingBean 인터페이스를 상속하고 afterPropertiesSet() 메서드 내부에 초기화 과정을 구현하면 된다.

public class Client implements InitializingBean{
	@Override
    public void afterPropertiesSet() throws Exception{
    	...
    }
}

- 스프링 컨테이너는 종료 과정 중, 빈 객체의 destroy() 메서드를 실행한다.

=> 따라서 빈 객체의 소멸 과정이 필요하면 DisposableBean 인터페이스를 상속하고 destroy() 메서드를 알맞게 구현하면 된다.

public class Client Implements DisposableBean{
	@Override
    public void destroy() throws Exception{
    	...
    }
]

 

(2) 빈 객체의 초기화와 소멸 : 커스텀 메서드

- InitializingBean 인터페이스와 DisposableBean 인터페이스를 구현할 수 없거나 사용하고 싶지 않을 때

=> @Bean 애노테이션의 initMethod 속성과 destroyMethod 속성에 사용할 메서드 이름을 지정해주자.

@Bean(initMethod = "connect", destroyMethod = "close")
public Client2 client2(){
	Client2 client = new Client2();
    return client;
}

- initMethod의 경우, 그 대신 빈 설정 메서드에서 직접 초기화를 수행해도 된다.

@Bean(destroyMethod = "close")
public Client client(){
	Client2 client = new Client2();
    client.connect();
    return client;
}

* initMethod 속성과 destroyMethod 속성에 지정한 메서드는 파라미터가 없어야한다.

 

3. 빈 객체의 생성과 관리 범위

- 빈은 기본적으로 싱글톤 범위를 갖는다.

- 하지만 빈의 범위를 @Scope 애노테이션을 통해 프로토타입으로 지정하면 빈 객체를 구할 때 마다 매번 새로운 객체를 생성한다.

@Configuration
public class AppCtx{

	@Bean
    @Scope("prototype")
    public Client client(){
    	Client client = new Client();
        client.setHost("host");
        return client;
    }
}

- 싱글톤 범위를 명시적으로 지정하려면 @Scope 애노테이션 값으로 "singleton"을 주면 된다.

 

- 프로토타입 범위를 갖는 빈은 완전한 라이프사이클을 따르지 않는다.

=> 컨테이너를 종료한다고 해서 생성한 프로토타입 빈 객체의 소멸 메서드를 실행하지는 않는다.

=> 프로토타입 범위의 빈을 사용할 때에는 빈 객체의 소멸 처리를 코드에서 직접 해야 한다.

'CSE > Spring' 카테고리의 다른 글

[Spring5입문] 스프링 AOP  (0) 2021.08.11
[Spring5입문] AOP 프로그래밍 기초  (0) 2021.08.09
[Spring5입문] 컴포넌트 스캔  (0) 2021.08.08
[Spring5입문] 의존 자동 주입  (0) 2021.08.04
[Spring5입문] 스프링 DI  (0) 2021.08.03