2022. 9. 4. 19:32ㆍSpring
컨테이너 초기화와 종료
스프링 컨테이너는 초기화와 종료라는 라이프사이클을 갖는다.
그리고 스프링 컨테이너는 빈 객체의 라이프사이클을 관리한다.
컨테이너가 초기화될 때 빈 객체의 생성, 의존 주입, 초기화가 이루어지고,
컨테이너가 종료될 때 빈 객체의 소멸이 일어난다.
스프링 컨테이너는 빈 객체를 초기화하고 소멸하기 위해 빈 객체의 지정한 메서드를 호출한다.
그리고 다음 두 인터페이스에 이 메서드를 정의하고 있다.
public interface InitialzingBean {
void afterPropertiesSet() throws Exception;
}
public interface DisposableBean {
void destroy() throws Exception;
}
빈 객체가 InitializingBean 인터페이스를 구현하면 스프링 컨테이너는 초기화 과정에서 빈 객체의 afterPropertiesSet()을 실행한다.
빈 객체가 DisposalbeBean 인터페이스를 구현하면 스프링 컨테이너는 소멸 과정에서 빈 객체의 destroy()를 실행한다.
(이 때 빈 객체에 각 메소드들을 오버라이드하여 알맞게 구현하면 된다.)
모든 클래스가 두 인터페이스를 상속받아 구현할 수 있는 것은 아니다.
이럴 경우 스프링 설정에서 직접 메소드를 지정할 수 있다.
//초기화와 소멸 과정에서 사용할 메소드 설정
@Bean(initMethod="connect", destroyMethod="close")
public Client2 client2() {
Client2 client = new Client2();
client.setHost("host");
//client.connect(); -> initMethod를 설정하는 대신 직접 실행 가능
return client;
}
위 코드를 예로 들면, Client2 클래스에 connect 와 close 메소드를 정의한다.(단, 두 메소드는 파라미터가 없어야 한다.)
그리고 위와 같이 @Bean 애노테이션의 initMethod 와 destroyMethod 속성을 이용해
초기화와 소멸 과정에서 사용할 메소드를 지정할 수 있다.
주석처리된 부분을 실행되도록 하고, initMethod 속성을 이용하지 않을 수도 있다.
이렇게 직접 초기화 메소드를 실행할 경우 초기화 메소드가 두 번 호출되지 않도록 유의해야 한다.
예를 들어, afterPropertiesSet() 함수의 경우 직접 이 메소드를 실행하면,
빈 객체가 생성되고나서 한 번 호출되고 직접 메소드를 호출할 때 한 번 더 호출된다.
빈 객체의 생성과 관리 범위
별도 설정을 하지 않으면 빈은 싱글톤 범위를 갖는다.
즉, 스프링 컨테이너는 빈 객체를 한 개만 생성한다.
따라서 하나의 빈 객체를 여러 번 불러와도 모두 동일한 빈 객체를 참조한다.
하지만 빈의 범위를 프로토타입으로 지정하면 빈 객체를 불러올 때마다 새로운 객체를 생성한다.
@Bean
@Scope("prototype")
public Client client() {
Client client = new Client();
client.setHost("host");
return client;
}
위의 빈 객체의 경우 프로토타입으로 지정되어 있다.
이 때 주의해야 할 점이 있다.
프로토타입 범위를 갖는 빈은 컨테이너가 종료되어도 해당 빈 객체의 소멸 메소드를 실행하지 않는다.
따라서 프로토타입 범위의 빈을 사용할 때에는 빈 객체의 소멸 처리를 코드에서 직접 해야 한다.
'Spring' 카테고리의 다른 글
| [Spring] AOP 프로그래밍 (0) | 2022.09.05 |
|---|---|
| [Spring] 컴포넌트 스캔 (0) | 2022.09.04 |
| [Spring] 자동 주입 (0) | 2022.08.31 |