업데이트 :: 2018.08.07
빈의 생명주기
- 빈 초기화 단계 (initialization)
- 빈 사용 단계 (activation)
- 빈 종료 단계 (destruction)
빈 초기화단계
- 빈을 설정하는 과정
- 빈을 인스턴스화 하는 과정
- 빈을 생성한 다음 후처리 하는 과정
빈 설정정보 읽기 및 보완
public interface BeanFactoryPostProcessor { void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory); }
- BeanFactoryPostProcessor를 직접 구현해서 빈으로 정의하면 자신만의 빈 정보 보완 처리도 추가 가능
빈 생성 전후처리
- 전처리
- BeanPostProcessor(BPP) 인터페이스의 메소드를 통해 실행
- 후처리
- BeanPostProcessor(BPP) 인터페이스의 메소드를 통해 실행
전후처리관련 인터페이스
public interface BeanPostProcessor { // 전처리 Object postProcessBeforeInitialization(Object bean, String beanName); // 후처리 Object postProcessAfterInitialization(Object bean, String beanName); }
빈 생성 초기화처리
- 애너테이션기반설정
- @PostConstruct를 사용하는 경우
- InitializingBean 인터페이스를 구현하는 경우, afterPropertiesSet 메서드 오버라이드
- 자바기반설정
- @Bean의 initMethod 속성에 지정한 메서드
- XML기반설정
요소의 init-method 속성에 지정한 메서드
초기화처리 @PostConstruct 활용
@Component public class UserServiceImpl implements UserService { // do something @PostConstruct void populateCache() { // 캐시등록 } }
- @PostConstruct 메소드의 반환값은 반드시 'void'
- @PostConstruct 메소드의 매개변수는 없어야함
초기화처리 InitializingBean 인터페이스
@Component public class UserServiceImpl implements UserService, InitializingBean { // do something @Override public void afterPropertiesSet() { // 캐시등록 } }
초기화 메서드 지정 (자바)
@Bean (initMethod="populateCache") UserService userService(){ return new UserServiceImpl(); }
초기화 메서드 지정 (xml)
<bean id="userService" class="com.example.demo.UserServiceImpl" init-method="populateCache" >
- 서드파티를 사용할때 소스코드에 @PostConstruct 나 InitializingBean을 사용하기 힘들때 사용할 수 있음
빈 사용단계
- 생성자 기반 의존성 주입
- 세터 기반 의존성 주입
- 필드 기반 의존성 주입
빈 종료단계
빈 파괴 전처리
- 애너테이션기반 설정
- @PreDestroy 애너테이션 사용한 경우
- DisposableBean 인터페이스를 구현한 경우, destroy 메소드 오버라이드
- 자바기반 설정
- @Bean의 destroyMethod 속성에 지정된 메서드
- Xml기반 설정
의 destroy-method 속성에 지정된 메서드
@PreDestroy를 활용한 예
@Component public class UserServiceImpl implements UserService { // do something @PreDestroy void clearCache() { // 캐시 삭제 } }
DisposableBean 인터페이스 구현한 예
@Component public class UserServiceImpl implements UserService, DisposableBean { // do something @Override void destroy() { // 캐시 삭제 } }
자바기반
@Bean(destoryMethod="clearCache") UserService userService() { return new UserServiceImpl(); }
xml 기반
<bean id="userService" class="com.example.demo.UserServiceImpl" destroy-method="clearCache" >
DI 컨테이너 종료
- ConfigurableApplicationContext 인터페이스
- ApplicationConext 인터페이스를 확장한 서브 인터페이스
- 우리가 사용하는 DI 컨테이너가 바로 ConfigurableApplicationContext의 구현체
- 이 인터페이스의 'close()' 메소드가 컨테이너를 종료시킴
기본 처리
ConfigurableApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class); context.close();
Closeable 인터페이스 관련 처리
try(ConfigurableApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class)) { };
JVM 종료시에 함께 종료되도록 Hook처리
ConfigurableApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class); context.registerShutdownHook();
Created by MoonsCoding
e-mail :: jm921106@gmail.com
반응형
'Spring > DI & AOP' 카테고리의 다른 글
학습 // Spring // DI // 프로파일(Profile) (0) | 2018.08.07 |
---|---|
학습 // Spring // DI // Bean 설정분할 (import) (0) | 2018.08.07 |
학습 // Spring // DI // 빈 스코프(Bean Scope) (0) | 2018.08.07 |
학습 // Spring // DI // ComponentScan & Filter (0) | 2018.08.07 |
학습 // Spring // DI // 오토와이어링 ( Autowiring ) (0) | 2018.08.07 |