스프링 컨테이너가 생성되면 @Component나 @Bean이 붙은 것들을 찾아 스프링 빈을 생성하고, 의존 관계를 주입한다. 이후 초기화 콜백이 이루어지고 사용이 끝난 후에 소멸 전 콜백을 주고 스프링이 종료된다.
1. InitializingBean, DisposableBean 인터페이스
클래스 생성 시 InitializingBean, DisposableBean 인터페이스를 구현하게 한다.
- 스프링 전용 인터페이스로, 스프링에 의존한다
- 초기화, 소멸 메서드의 이름을 변경할 수 없다
- 코드 수정이 불가한 외부 라이브러리에 적용할 수 없다.
- 현재는 거의 사용하지 않는 방법
public class BeanCallback implements InitializingBean, DisposableBean {
...
@Override
public void afterPropertiesSet() throws Exceoption {...}
@Override
public void destroy() throws Exception {...}
}
2. 설정 정보에 초기화 메서드와 종료 메서드 지정
@Bean(initMethod="init", destoryMethod="close")
처럼 빈 등록 시 옵션으로 초기화, 소멸 메서드를 지정한다.
- 메서드 이름을 직접 지정 가능하다
- 생성된 스프링 빈은 스프링 코드에 의존적이지 않다
- 코드 내부가 아닌
@Bean
의 설정 정보를 사용하기 때문에 코드 수정이 불가능한 외부 라이브러리에도 적용 가능하다
public class BeanCallback2 {
...
public void init() {...}
public void close() {...}
}
아래와 같이 빈으로 등록할 때 옵션으로 initMethod
, destoryMethod
에 BeanCallback2 클래스의 임의의 메서드를 지정할 수 있다.
@Configuration
public class BeanLifeCycleConfig {
@Bean(initMethod="init", destoryMethod="close")
public BeanCallback2 beanCallback2() {...}
}
@Bean의 destoryMethod
라이브러리의 대부분이 close나 shutdown이라는 이름의 종료 메서드를 사용하기 때문에 @Bean은 따로 destroyMethod를 지정하지 않아도 기본값(inferred)에 따라 close나 shutdown의 이름을 가진 메서드를 자동으로 호출한다.
3. @PostConstruct, @PreDestroy
javax.annotation
의 PostConstruct
와PreDestroy
를 import해 어노테이션을 사용한다.
- 스프링에 종속적이지 않은 자바 표준으로, 스프링이 아닌 다른 컨테이너에서도 작동한다.
- 외부 라이브러리에는 적용할 수 없다
- 가장 편리하며 권장되는 방법이다
public class BeanCallback3 {
...
@PostConstruct
public void init() {...}
@PreDestroy
public void close() {...}
}
@Configuration
public class BeanLifeCycleConfig {
@Bean
public BeanCallback3 beanCallback3() {...}
}
'back-end > spring' 카테고리의 다른 글
spring/ JPA를 이용해 json 형태의 컬럼을 RDB에서 편리하게 다루기 (hypersistence-utils) (1) | 2023.04.14 |
---|---|
spring/ 빈 스코프 (0) | 2022.06.21 |
spring/ @Autowired 사용 시 조회 대상 빈이 2개 이상인 경우 처리하기 (0) | 2022.06.21 |
spring/ 롬복lombok 사용하기 (0) | 2022.06.21 |
spring/ 의존 관계 자동 주입 - 생성자 주입을 사용하자 (0) | 2022.06.20 |