반응형
스프링 컨테이너는 초기화와 종료라는 사이클을 갖는다.
이 과정에서 스프링 컨테이너 내부에 존재하는 Bean 객체 또한 컨테이너의 라이프 사이클에 따라 생성과 소멸을 진행한다.
객체 생성 → 의존 설정 → 초기화 → 소멸
스프링 컨테이너가 초기화 될 때 Bean 객체의 생성 및 의존 설정이 진행된다.
이 부분은 이전 chapter를 공부하면서 살펴볼 수 있었다.
InitializingBean과 DisposableBean을 구현한다면 각각 Bean 객체가 초기화, 소멸될 때 지정된 메소드가 실행된다.
코드를 통해 확인해보자.
public class MemberDao implements InitializingBean, DisposableBean {
@Override
public void afterPropertiesSet() {
System.out.println("memberDao 초기화!!!");
}
@Override
public void destroy() {
System.out.println("memberDao 소멸!!!");
}
public void findMember() {
System.out.println("멤버찾는 메서드 실행!!!");
}
}
위와 같이 InitializingBean, DisposableBean을 구현하는 MemberDao가 존재한다.
public static void main(String[] args) {
// 1
System.out.println("main 시작!!!");
AnnotationConfigApplicationContext ctx =
new AnnotationConfigApplicationContext(AppCtx.class);
// 3
System.out.println("ctx 초기화!!!");
MemberDao memberDao = ctx.getBean("memberDao", MemberDao.class);
// 4
memberDao.findMember();
// 5
ctx.close();
}
위 처럼 main을 작성하고 실행시켜보았다.
콘솔에서 확인해본 결과는 다음과 같다.
main 시작!!!
...
memberDao 초기화!!!
ctx 초기화!!!
멤버찾는 메서드 실행!!!
...
memberDao 소멸!!!
위를 통해 컨테이너의 동작 순서를 확인해볼 수 있었다.
- main이 시작된다.
- 컨테이너가 초기화될 때
DefaultListableBeanFactory - Creating
, 즉 Bean들을 생성한다. - Bean이 초기화되면서
afterPropertiesSet
메소드가 실행된다. - 컨테이너가 소멸될 때, Bean 또한 소멸되면서
destroy
메소드를 실행한다.
이러한 동작과정은 @Bean 애노테이션을 통해서도 진행할 수 있다.
새로운 학습을 위한 MemberDao2
를 정의하였다.
public class MemberDao2 {
public void start() {
System.out.println("MemberDao2 초기화 !!!!!");
}
public void end() {
System.out.println("MemberDao2 소멸 !!!!!");
}
public void findMember() {
System.out.println("멤버찾는 메서드 실행!!!");
}
}
그리고 @Bean에 initMethod
, destroyMethod
를 설정하였다.
각각 초기화, 소멸 시 실행되어야하는 메소드를 의미한다.
@Bean(initMethod = "start", destroyMethod = "end")
public MemberDao2 memberDao2() {
return new MemberDao2();
}
다시 한번 main을 실행해보면 결과는 다음과 같다.
main 시작!!!
...
MemberDao2 초기화 !!!!!
ctx 초기화!!!
멤버찾는 메서드 실행!!!
...
MemberDao2 소멸 !!!!!
위에서 보았던 결과와 같은 결과를 볼 수 있었다.
Bean 객체의 생성, 소멸 시 메소드를 실행할 수 있다는 사실을 알게 되었으므로,
프로젝트에 적용해보는 것도 좋은 경험일 것 같다!
반응형
'Spring' 카테고리의 다른 글
@Component란? (0) | 2022.11.13 |
---|---|
@Qualifier 알아보기 (0) | 2022.11.08 |
스프링 DI란? (0) | 2022.11.06 |
스프링이 Bean 객체를 관리하는 방법 (0) | 2022.11.06 |
댓글