스프링을 이용하면서 무조건 알아야하는 bean의 생명주기에 대해서 알아봅시다.
예제는 https://github.com/choi-hye-min/spring-lifecycle 이곳에 올려두었다.

Bean 생명주기 (Bean Lifecycle)

  1. 생성
    • 빈 객체를 생성
    • ApplicationContext를 이용해서 객체를 생성
  2. 초기화
    • 의존 설정 및 주입
    • 의존설정 완료되면 빈객체 초기화 (초기화는 아래에서 살펴보자)
  3. 사용
  4. 소멸
    • 빈 객체 소멸 (아래에서 살펴보자)

4단계의 생명주기를 가집니다.

초기화

총 3가지 방법이 존재하며 먼저 초기화를 알이보자

  1. interface InitalizingBean을 이용한 구현
  2. @PostConstruct 어노테이션 구현
  3. @Bean(initMehtod)를 이용한구현
InitalizingBean을 이용한 구현
@PostConstruct 어노테이션 구현
@Bean(initMehtod)를 이용한구현

빈 초기화 실행 순서

이렇게 빈 초기화가 실행된 값을 출력해보면 InitalizingBean 인터페이스로 구현한게 가장빨랐다.
그리고 뒤에 처리된 초기화는 @Bean(initMehtod)를 이용한 방법이 가장 뒤에 처리되었다.

그럼 이번엔 빈의 소멸 방법에 대해서 알아보자

소멸

  1. @PreDestory
    • @PostConstruct와 동일하게 JSR-250 스펙에 따라 구현이 되어있다.
    • 사용법은 동일하게 내가 원하는 메소드에 어노테이션을 선언해주면 해당 빈이 종료될때 실행된다.
  2. DisposableBean 인터페이스
    • InitalizingBean와 동일하게 스프링에서 제공해주는 DisposalbeBean 인터페이스를 이용하여 구현할수있다.
    • 구현하게되면 destory() 메소드를 오버라이드하여 정의할수 있다.
  3. @Bean(destoryMethod)
    • 내가 원하는 메소드를 미리 만들어준뒤 인자로 메소드이름을 전달해주어 사용할수 있다.

JSR-250은 자바플렛폼 공통 어노테이션이다. 기본 자바에서는 제공하지 않기 때문에 적용을 위해서는 라이브러리를 반드시 추가해야 한다

빈의 초기화와 소멸은 AbstractAutowireCapableBeanFactory 클래스의 initializeBean 메서드가 호출해주고있다.

public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory
		implements AutowireCapableBeanFactory
...

@Override
	public Object initializeBean(Object existingBean, String beanName) {
		return initializeBean(beanName, existingBean, null);
	}

invokeInitMethods(...)가 실행되면서 초기화 빈을 실행하고 있다. tNMjXrdH15TjQNvtkyMWIyGwOLTvBv

개인적으로 개발할때 가장 편하게 사용할수 있는 방법은 어노테이션 방법이 가장 편해 추천한다.

Bean Scope

  • Singleton (Default)
    • 단일객체 (한개만 생성)
  • Prototype
    • 매번 호출시마다 인스턴스 생성됨
  • SessionScope
    • 하나의 세션에 하나만 생성한다
    • 단. userPreferences bean은 하나만 생성
  • Global Session Scope
    • 글로벌 세션 범위
  • Application Scope
    • 싱글톤과 비슷
@Bean
@Scope("singleton")
public Person personSingleton() {
    return new Person();
}
@Scope("singleton")
@Scope("prototype")
@Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)

보다 자세한건 링크를 참조하자
https://www.baeldung.com/spring-bean-scopes