해당 포스트는 초보 웹 개발자를 위한 스프링 5 프로그래밍 입문 [최범균 저] 책 내용을 참고하였습니다.
public class Main {
public static void main(String[] args) {
//1. 컨테이너 초기화
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppContext.class);
//2. 컨테이너에서 빈 객체를 구해서 사용
Greeter g1 = ctx.getBean("greeter", Greeter.class);
Greeter g2 = ctx.getBean("greeter", Greeter.class);
System.out.println("(g1 == g2) = " + (g1 == g2));
//3. 컨테이너 종료
ctx.close();
}
}
close() 메소드는 AbstractApplicationContext 클래스에 정의되어 있다. AnnotationConfigApplicationContext(자바 설정) 뿐 아니라 GenericXmlApplicationContext(xml 설정)도 AbstractApplicationContext를 상속받고 있기 때문에 두 컨텍스트 모두 close() 메소드를 이용해 컨테이너를 종료할 수 있다.
스프링 컨테이너는 빈 객체의 라이프 사이클을 관리한다.
(스프링 컨테이너 초기화 →) 빈 객체 생성 → 빈 의존 설정 → 빈 초기화 → (스프링 컨테이너 종료 →) 빈 소멸
public interface InitializingBean{
void afterPropertiesSet() throws Exception;
}
public interface DisposableBean{
void destroy() throws Exception;
}
초기화와 소멸 과정이 필요한 예 : 데이터베이스 커넥션 풀, 채팅 클라이언트
public class Client implements InitializingBean, DisposableBean {
private String host;
public void setHost(String host) {
this.host = host;
}
//빈 객체의 초기화 과정
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("Client.afterPropertiesSet() 실행");
}
public void send() {
System.out.println("Client.send() to " + host);
}
//빈 객체의 소멸 과정
@Override
public void destroy() throws Exception {
System.out.println("Client.destroy() 실행");
}
}
InitializingBean이나 DisposableBean 인터페이스를 상속할 수 없거나 상속하고 싶지 않은 경우, 설정 클래스에서 @Bean 등록 시 직접 메서드를 지정하면 된다.
public class Client2 {
private String host;
public void setHost(String host) {
this.host = host;
}
public void connect() { //초기화 과정에서 실행할 메서드
System.out.println("Client2.connect() 실행");
}
public void send() {
System.out.println("Client2.send() to " + host);
}
public void close() { //소멸 과정에서 실행할 메서드
System.out.println("Client2.close() 실행");
}
}
설정 클래스에서 초기화 메서드와 소멸 메서드를 지정한다.
@Configuration
public class AppCtx {
@Bean(initMethod = "connect", destroyMethod = "close")
public Client2 client2() {
Client2 client = new Client2();
client.setHost("host");
return client;
}
}
initMethod 속성과 destroyMethod 속성에 지정한 메서드는 파라미터가 없어야 한다. 이 두 속성에 지정한 메서드에 파라미터가 존재할 경우 스프링 컨테이너는 익셉션을 발생시킨다.
기본적으로 스프링 컨테이너는 빈 객체를 한 개만 생성한다.
@Configuration
public class AppCtxWithPrototype {
@Bean(initMethod = "connect", destroyMethod = "close")
@Scope("singleton") //생략 가능
public Client2 client2() {
Client2 client = new Client2();
client.setHost("host");
return client;
}
}
빈 객체를 구할 때마다 매번 새로운 객체를 생성한다.
@Configuration
public class AppCtxWithPrototype {
@Bean
@Scope("prototype")
public Client client() {
Client client = new Client();
client.setHost("host");
return client;
}
}
프로토타입 범위의 빈은 완전한 라이프 사이클을 따르지 않는다. 프로토타입의 빈 객체의 경우, 스프링 컨테이너를 종료한다고 해서 해당 빈 객체의 소멸 메서드가 실행되지 않는다. 따라서 프로토타입 범위의 빈을 사용할 때는 소멸 처리를 직접 코드로 실행하여야 한다.
1. 컨테이너 초기화 단계에서는 컨테이너 객체 생성, ( 빈 객체 생성 ), ( 빈 의존 주입 ), ( 빈 초기화 ) 과정이 진행된다.
2. 컨테이너 소멸 단계에서는 ( 빈 객체 소멸 ) 과정이 진행된다.
3. 빈 객체 초기화 과정에서는 ( afterPropertiesSet() ) 메서드가 실행된다.
4. 빈 객체 소멸 과정에서는 ( destroy() ) 메서드가 실행된다.
5. 빈 객체 최기화 및 소멸 과정을 직접 작성하고자 하는 경우, @Bean 애노테이션의 ( initMethod )와 ( destroyMethod ) 속성 값을 지정해주면 된다.
6. 스프링 컨테이너는 기본적으로 ( 싱글톤 ) 범위로 빈을 생성한다.
7. 프로토타입 범위의 빈을 생성하고자 한다면, ( @Scope ) 애노테이션을 "prototype"으로 지정한다.
Spring1
EDITOR: 로자
[스프링1] 8장. DB 연동 (0) | 2022.11.10 |
---|---|
[스프링1] 7장. AOP 프로그래밍 (0) | 2022.11.10 |
[스프링1] 5장. 컴포넌트 스캔 (0) | 2022.11.05 |
[스프링1] 4장. 의존 자동 주입 (0) | 2022.11.05 |
[스프링 1] 3장.스프링 DI (0) | 2022.10.27 |