컨테이너 초기화와 종료
생성자를 통해서 객체 생성 할 때, 스프링 컨테이너를 초기화 한다. 스프링 컨테이너 설정 클래스에서 정보를 읽어와 빈 객체 생성(get) 후 각 빈을 의존주입 한다.
컨테이너를 사용한다는 뜻은 getBean()과 같은 메서드를 이용하여 컨테이너 내의 빈 객체를 구현하는 것이다.
컨테이너 사용 종료시 컨테이너를 종료한다. close() 메서드를 사용하여 컨테이너를 종료하고, 해당 매서드는 AbstractApplicationContext 클래스에 정의되어 있다.
위 내용을 요약하면 다음과 같다.
컨테이너 초기화 => 빈 객체 생성, 의존 주입, 초기화
컨테이너 종료 => 빈 객체 소멸
스프링 빈 객체의 라이프사이클
스프링 컨테이너 내의 빈 객체의 라이프사이클은 다음과 같다.
스프링 컨테이너 초기화 시 스프링 컨테이너는 가장 먼저 빈 객체를 생성하고 의존 설정한다. 이때 의존 자동 주입(@Autowired)을 통한 의존 설정이 수행된다. 모든 의존 설정이 완료되면 빈 객체 초기화를 수행한다. 빈 객체를 초기화 하기 위해 스프링은 빈 객체의 지정된 메서드를 호출한다.
빈 객체의 초기화와 소멸을 위해 다음 두 인터페이스를 import 해야 된다.
org.springframework.beans.factory.InitializingBean
org.springframework.beans.factory.DisposableBean
두 인터페이스는 다음과 같다.
public interface InitializingBean
{
void afterPropertiesSet() throws Exception;
}
public interface DisposableBean
{
void destroy() throws Exception;
}
빈 객체가 InitializingBean 인터페이스를 구현하면 스프링 컨테이너는 초기화 과정에서 빈 객체의 afterPropertiesSet() 메서드를 실행한다.
빈 객체가 DisposableBean 인터페이스 구현 시 빈 객체의 destroy() 메서드를 실행한다. destroy() 실행 시 Connection을 끊는다.
데이터베이스 커넥션 풀과 채팅 클라이언트는 초기화와 소멸과정이 필요하다. 빈 객체 소멸 시 사용중인 데이터베이스 연결을 끊어야 한다.
close() 메서드가 없으면 컨테이너 종료를 수행하지 않아 빈 객체의 소멸도 일어나지 않는다.
모든 클래스가 위 두개의 인터페이스를 상속 받아 구현 할 수 있는 것은 아니다. 외부 제공 클래스를 스프링 빈객체로 설정할 때 소스코드를 받아야만 두 인터페이스를 구현하도록 수정할 수 있다.
방법은 @Bean 태그에 initMethod 속성과 destroyMethod 속성을 사용해서 초기화 메서드와 소멸 메서드 이름을 지정하면 된다.
@Bean
public Client client()
{
Client client = new Client();
client.setHost("host");
client.aterPropertiesSet();//중복
return client;
}
Client 클래스는 InitializingBean을 구현하여서 afterPropertiesSet() 메서드를 실행한다. 즉 afterPropertiesSet() 메서드가 두번 호출되어 오류가 발생한다.
initMethod 속성과 destroyMethod 속성에 지정한 메서드는 파라미터가 없어야 한다.
빈 객체의 생성과 관리 범위
빈은 싱글톤(singleton) 범위(scope)를 가진다. 범위(scope)를 프로토타입으로 설정하면 빈 객체를 구할 때 매번 새로운 객체를 생성한다. 싱글톤 범위를 명시적으로 지정하는 방법은 @Scope("singleton") 이다.
프로토타입 범위는 객체 소멸되지 않는다. 컨테이너 종료해도 생성 프로토타입 빈 객체 소멸 메소드를 실행하지 않기 때문이다.
'Java > JavaSpring' 카테고리의 다른 글
Chap 8. DB 연동 (0) | 2022.06.28 |
---|---|
Chap 7. AOP 프로그래밍 (0) | 2022.06.27 |
Chap 5. 컴포넌트 스캔 (0) | 2022.06.20 |
Chap 4. 의존 자동 주입 (0) | 2022.06.20 |
Chap 3. 스프링 DI (0) | 2022.06.20 |