티스토리 뷰
1 이전에 작성한 것이 있긴 한대 내용이 좀 부실해서 다시 정리한다.
2. 스프링 라이프 사이클은 스프링 컨테이너가 어떻게 스프링 빈을 관리하는지에 대한 내용이다.
3. 인터넷을 찾아보면 위의 라이프 사이클에 맞게 작성한 코드가 있어 언제 호출하는지 확인 할 수 있다.
3-1 아래 수 많은 interface가 구현되고 있다. 각각의 인터페이스는 하나 혹은 두 개 정도의 메소드를 가지고 있다.
3-2 sysout안에 어떤 interface의 메소드인지를 명시하였다.
3-3 Aware 인터페이스는 스프링이 프레임워크의 내부적인 동작을 수정하기 위한 기회를 제공한다.
3-4 InitializingBean, DisposableBean은 이벤트에 따라 실행되는 call back 메소드를 제공한다.
3-5 @PostConstruct, @PreDestory는 annotation으로 지정되면 Lifecycle hook으로 특정시점에 호출하게 된다.
3-5-0 이 두 annotation은 BeanPostProcessor에 의해서 등록되어 실행된다.
3-5-1 @PostConstruct 생성자가 실행 완료 후에 호출한다.
3-5-2 @PreDestory는 컨테이너가 빈을 제거하기 직전에 호출한다.
package pe.pilseong.demodi.services;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.*;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
@Component
public class LifeCycleDemoBean
implements BeanNameAware, BeanFactoryAware, ApplicationContextAware,
InitializingBean, DisposableBean {
public LifeCycleDemoBean() {
System.out.println("1 ## LifeCycleBean Constructor");
}
@Override
public void setBeanName(String name) {
System.out.println("2 ## [in BeanNameAware] My Bean Name is: " + name);
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
System.out.println("3 ## [in BeanFactoryAware] Bean Factory has been set");
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.out.println("4 ## [in ApplicationContextAware] Application context has been set");
}
public void beforeInit() {
System.out.println("5 ## - [BeanPostProcessor] Before Init - Called by Bean Post Processor");
}
@PostConstruct
public void postConstruct() {
System.out.println("6 ## [@PostConstruct] The Post Construct annotated method has been called");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("7 ## [InitializingBean] The LifeCycleBean has its properties set!");
}
public void afterInit() {
System.out.println("8 ## - [BeanPostProcessor] After init called by Bean Post Processor");
}
@PreDestroy
public void preDestroy() {
System.out.println("9 ## [@PreDestroy] The Predestroy annotated method has been called");
}
@Override
public void destroy() throws Exception {
System.out.println("10 ## [DisposableBean] The Lifecycle bean has been terminated");
}
}
3-2 BeanPostProcessor가 역시 라이프사이클에 참여한다.
package pe.pilseong.demodi.services;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;
@Component
public class CustomBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof LifeCycleDemoBean) {
((LifeCycleDemoBean) bean).beforeInit();
}
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof LifeCycleDemoBean) {
((LifeCycleDemoBean) bean).afterInit();
}
return bean;
}
}
3-3 실행 결과
4. Spring Aware 인터페이스에 대한 기능은 다음을 참고한다.
'Spring > Spring Basic' 카테고리의 다른 글
Spring Basic : Interface Segregation 원칙 (0) | 2020.07.21 |
---|---|
Spring Basic : Open Close 원칙 (0) | 2020.07.21 |
Spring Basic : Dependency Injection @Primary, @Qualifier (0) | 2020.07.21 |
Spring Basic : SOLID 원칙 (0) | 2020.07.20 |
Spring Basic : profile 사용하기 - 1 (0) | 2020.07.09 |
- Total
- Today
- Yesterday
- 도커 개발환경 참고
- AWS ARN 구조
- Immuability에 관한 설명
- 자바스크립트 멀티 비동기 함수 호출 참고
- WSDL 참고
- SOAP 컨슈머 참고
- MySql dump 사용법
- AWS Lambda with Addon
- NFC 드라이버 linux 설치
- electron IPC
- mifare classic 강의
- go module 관련 상세한 정보
- C 메모리 찍어보기
- C++ Addon 마이그레이션
- JAX WS Header 관련 stackoverflow
- SOAP Custom Header 설정 참고
- SOAP Custom Header
- SOAP BindingProvider
- dispatcher 사용하여 설정
- vagrant kvm으로 사용하기
- git fork, pull request to the …
- vagrant libvirt bridge network
- python, js의 async, await의 차이
- go JSON struct 생성
- Netflix Kinesis 활용 분석
- docker credential problem
- private subnet에서 outbound IP 확…
- 안드로이드 coroutine
- kotlin with, apply, also 등
- 안드로이드 초기로딩이 안되는 경우
- navigation 데이터 보내기
- 레이스 컨디션 navController
- raylib