2021. 8. 9. 19:41ㆍCSE/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 |