티스토리 뷰
초보 웹 개발자를 위한 스프링 5 프로그램 입문을 보고 복습 겸 개인 학습 정리입니다. (windows 기준)
컨테이너 초기화와 종료
스프링 컨테이너는 초기화 → 종료 라이프 사이클을 갖는다.
1. 컨테이너 초기화 후에 컨테이너를 사용할 수 있다.
2. getBean()과 같은 메서드를 통해 컨테이너에 보관된 빈 객체를 구할 수 있다.
3. 사용이 끝나면 컨테이너를 종료하는데 close() 메서드를 사용하여 종료한다.
또한, 컨테이너의 사이클에 따라 다음 작업도 함께 이루어진다.
컨테이너 초기화 → 빈 객체 생성, 의존 주입, 초기화
컨테이너 종료 → 빈 객체 소멸
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();
}
}
스프링 빈 객체의 라이프 사이클
빈 객체의 초기화와 소멸 - 스프링 인터페이스
스프링 컨테이너는 빈 객체를 초기화하고 소멸하기 위해 지정한 메서드를 호출한다.
스프링에서 제공하는 InitializingBean 인터페이스와 DisposableBean 인터페이스에 지정한 메서드를 정의하고 있다.
대표적인 예로 데이터베이스 커넥션 풀이 있다.
이 커넥션 풀을 위한 빈 객체는 초기화 과정에 데이터베이스 연결을 생성하고 사용하는 동안 유지하지만 빈 객체를 소멸할 때 사용 중인 데이터베이스 연결을 끊어야 한다.
→ sp5-chap06/src/main/java/spring/Client.java
package spring;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
// 스프링에서 정의하고 있는 인터페이스 구현
public class Client implements DisposableBean, InitializingBean {
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 애노테이션에 initMethod, destroyMethod 설정 값을 사용할 메서드 이름을 지정해주면 된다.
→ sp5-chap06/src/main/java/spring/Client2.java
package spring;
public class Client2 {
private String host;
public void setHost(String host) {
this.host = host;
}
public void connect() { //초기화 연결 메서드
System.out.println("Client2.connet() 실행");
}
public void send() {
System.out.println("Clinet2.send() to" + host);
}
public void close() { // 소멸 메서드
System.out.println("Client2.close() 실행");
}
}
/*
설정 파일에서 initMethod속성과 destroyMethod속성을
사용할 메서드인 이름으로 지정해주어야한다.
@Bean(initMethod = "connect", destroyMethod= "close")
public Client2 client2() {
Client2 client = new Client2();
client.setHost("host");
return client;
}
*/
그 외 빈의 범위를 프로토타입으로 지정하면 빈 객체를 구할 때마다 매번 새로운 객체를 생성한다. (사용빈도가 낮음)
※ 프로토타입 범위의 빈은 빈 객체의 소멸 처리를 코드로 직접 해야 한다.
지정 방법
import org.springframework.context.annotation.Scope;
@Configuration
public class AppCtxWithPrototype {
@Bean
@Scope("prototype") // <- Scope 애노테이션과 속성값prototpye을 넣어준다
public Client client() {
Client client = new Client);
client.setHost("host");
return client;
}
}
'study > Spring' 카테고리의 다른 글
chap 08 - DB 연동 DataSource 설정 (1) | 2023.01.13 |
---|---|
chap 07 - AOP 프로그래밍 (0) | 2023.01.10 |
chap 05 - 컴포넌트 스캔 (0) | 2023.01.05 |
chap 04 - 의존 자동 주입 (0) | 2023.01.04 |
chap 03 - 스프링 DI (Dependency injection) (0) | 2022.12.05 |
- Total
- Today
- Yesterday
- 디자인 패턴
- Magazine K
- Java
- 검색 결과 내 페이지네이션
- 웹페이지
- musma
- error: failed to push some refs to 'https://github.com/
- django
- 면접을 위한 CS 전공 지식 노트
- git 공부
- git
- 회원 로그인
- API
- authenticate()
- 톰캣
- Spring
- path variable
- 환경 변수 설정
- 한글 형태소 분석기
- 회원가입
- Python
- python3
- Django tutorial
- django-environ
- 암호화
- git공부
- 배열
- 커맨드 객체
- django.contrib.auth
- 혼자 공부하는 파이썬
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |