컨테이너 초기화와 종료
// 1. 컨테이너 초기화
AnnotationConfigApplicationContext ctx =
new AnnotationConfigApplicationContext(AppContext. class);
// 2. 컨테이너에서 빈 객체를 구해서 사용
Greeter g = ctx.getBean( "greeter", Greeter.class);
String msg = g.greet("스프링");
System.out.println(msg);
// 3. 컨테이너 종료
ctx.close();
- 컨텍스트 객체 생성 시, 스프링 컨테이너 초기화. 스프링 컨테이너는 설정 클래스에서 정보를 읽어와 알맞은 빈 객체를 생성하고 각 빈을 연결(의존 주입)하는 작업을 수행
- 컨테이너 초기화가 완료되면 컨테이너를 사용할 수 있다. 컨테이너를 사용할 수 있다는 것은 getBean()과 같은 메서드를 이용해서 컨테이너에 보관된 빈 객체를 구한다는 것을 뜻한다.
- 컨테이너를 종료할 때 사용하는 메서드가 close() 메서드 이다.
컨테이너를 초기화하고 종료할 때에는 다음의 작업도 함께 수행한다.
- 컨테이너 초기화 - 빈 객체의 생성, 의존주입, 초기화
- 컨테이너 종료 - 빈 객체의 소멸
스프링 빈 객체의 라이프사이클
- 컨테이너를 초기화할 때, 가장 먼저 빈 객체를 생성하고 의존을 설정한다.
- 의존 자동 주입을 통한 의존 설정이 이 시점에 수행된다.
- 빈 객체의 초기화를 수행한다. 빈 객체를 초기화하기 위해 스프링은 빈 객체의 지정된 메서드를 호출한다.
- 스프링 컨테이너는 빈 객체의 소멸을 처리한다. 이때에도 지정한 메서드를 호출한다.
빈 객체의 초기화와 소멸: 스프링 인터페이스
빈 객체를 초기화하고 소멸하기 위해 빈 객체의 지정한 메서드를 호출한다.
- org.springframework.beans .factory.lnitializingBean
- org.springframework.beans .factory.DisposableBean
public interface lnitializingBean{ // 빈 객체가 이 인터페이스를 구현하면
void afterPropertiesSet() throws Exception; // 컨테이너가 초기화시 이 메서드를 실행
}
public interface DisposableBean { // 빈 객체가 이 인터페이스를 구현하면
void destroy() throws Exception; // 컨테이너가 소멸시 이 메서드를 실행
}
초기화와 소멸 과정이 필요한 예: 데이터 베이스 커넥션 풀, 채팅 클라이언트
커스텀 메서드
직접 구현한 클래스가 아닌 외부에서 제공받은 클래스를 스프링 빈 객체로 설정하고 싶을 때도 있다.
이때 인터페이스를 구현할 수 없으니 다른 방법을 사용하도록 한다.
@Bean 태그에서 initMethod 속성과 destroyMethod 속성을 사용해서 초기화 메서드와 소멸 메서드의 이름을 지정하면 된다.
@Bean(initMethod = "connect", destroyMethod = "close ")
// 초기화시 connect 메서드 실행되게 설정, 소멸시 close 메서드 실행되게 설정
public void connect() {
System.out.println("Client2.connect() 실행") ;
}
public void close() {
System.out. println("Client2.close() 실행");
}
설정 클래스 자체는 자바 코드이므로 initMethod 속성을 사용하는 대신 다음과 이 빈 설정 메서드에서 직접 초기화를 수행해도 된다.
@Bean(destroyMethod = "close" )
public Client2 client2() {
Client2 client = new Client2();
client.setHost("host");
client.connect(); // 직접 초기화
return client;
}
// InitializingBean 인터페이스를 구현했기 때문에 afterPropertiesSet()가 자동실행된다.
// 이 코드는 초기화를 두번한다.
// 이렇게 초기화 메서드가 두 번 호출되지 않도록 주의해야한다.
@Bean
public Client client() {
Client client = new Client();
client.setHost("host");
client.afterPropertiesSet(); // 이미 한번 실행했는데 한번 더 실행
return client;
}
📌 InitMethod 속성과 destroyMethod 속성에 정한 메서드는 파라미터가 없어야 한다. 이 두 속성에 지정한 메서드에 파라미터가 존재할 경우 스프링 컨테이너는 익셉션을 발생시킨다.
빈 객체의 생성과 관리 범위
스프링은 보통 싱글톤 범위를 갖는다. 하지만 프로토타입 범위의 빈을 설정할 수도 있다.(사용빈도가 낮긴 하다.)
💡 프로토타입 빈: 프로토타입으로 지정하면 빈 객체를 구할 때마다 매번 새로운 객체를 생성한다.
@Bean
@Scope("prototype") // 프로토타입으로 설정
public Client client() {
Client client = new Client();
client.setHost( "host" );
return client:
}
@Scope("singleton") // 싱글톤으로 범위 설정
📌 스프링 컨데이너는 프로토타입의 빈 객체를 생성하고 프로퍼티를 설정 하고 초기화 작업까지는 행하지만, 컨테이너를 종료한다고 해서 생성한 프로토타입 빈 객체의 소멸메서드를 실행하지는 않는다. 따라서 프로토타입 범위의 빈을 사용할 때에는 빈 객체의 소멸 처리를 코드에서 직접 해야한다.
'Spring > 스프링5 프로그래밍 입문' 카테고리의 다른 글
Chapter8. DB연동 (0) | 2023.02.26 |
---|---|
Chapter7. AOP 프로그래밍 (0) | 2023.02.22 |
Chapter5. 컴포넌트 스캔 (0) | 2023.02.21 |
Chapter4. 의존 자동 주입 (0) | 2023.02.20 |
Chapter3. 스프링DI (0) | 2023.02.19 |