Spring이 시작되면 AbstractApplicationContext
의 refresh
메서드를 통해 컨텍스트 관련 설정이 시작됩니다.
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// Invoke factory processors registered as beans in the context.
invokeBeanFactoryPostProcessors(beanFactory);
// Register bean processors that intercept bean creation.
registerBeanPostProcessors(beanFactory);
// Instantiate all remaining (non-lazy-init) singletons.
finishBeanFactoryInitialization(beanFactory);
많은 동작이 해당 메서드에서 실행되지만 주요하게 살펴볼 메서드는 위와 같습니다.
간단히 살펴보면 obtainFreshBeanFactory
통해 등록될 빈 정의가 로드됩니다.
그리고 invokeBeanFactoryPostProcessors
를 통해 BFPP가 등록되고 실행됩니다.
이후registerBeanPostProcessors
를 통해 BPP가 등록됩니다.
그렇게 빈을 초기화할 준비가 끝이 나면 finishBeanFactoryInitialization
메서드가 실행하여 빈을 초기화합니다.beanFactory
의 getBean
메서드가 실행되며 빈을 생성합니다.
이 과정에서 우리가 DI라고 부르는 의존성 주입이 일어납니다.
의존성 주입이 끝나고 나면 initializeBean
메서드를 실행하여 빈을 초기화합니다.
Object wrappedBean = bean;
if (mbd == null || !mbd.isSynthetic()) {
wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
}
try {
invokeInitMethods(beanName, wrappedBean, mbd);
}
catch (Throwable ex) {
throw new BeanCreationException(
(mbd != null ? mbd.getResourceDescription() : null), beanName, ex.getMessage(), ex);
}
if (mbd == null || !mbd.isSynthetic()) {
wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
}
return wrappedBean;
initializeBean
를 실행할 때는 applyBeanPostProcessorsBeforeInitialization
를 통해 BPP를 실행하여 생성된 빈에 대한 전처리를 적용합니다.
그리고 해당 빈에 적용된 초기화 메서드를 실행하고 applyBeanPostProcessorsAfterInitialization
를 통해 빈에 대한 후처리까지 적용한 이후 빈 생성을 마무리합니다.
정리해 보면 스프링의 빈 생명주기는 아래와 같습니다.
1. 빈 정의 등록
2. BFPP 등록 및 실행
3. BPP 등록
4. 빈 초기화
1. 등록된 BPP#postProcessBeforeInitialization 적용
2. 빈 초기화 메서드 적용
3. 등록된 BPP#postProcessAfterInitialization 적용
'스프링' 카테고리의 다른 글
인터페이스 타입으로 등록한 빈을 구현체 타입으로 DI 받지 못한 이유 (0) | 2025.03.19 |
---|---|
트랜잭션을 위한 프록시 객체와 AspectJ의 프록시 객체는 어떤 순서로 실행될까? (0) | 2025.03.18 |
트랜잭션 커밋과 AOP 중 어떤 것이 먼저 실행 될까? (0) | 2025.03.15 |
Parallel Test Execution (0) | 2025.03.13 |
Spring Modulith Scenario (0) | 2025.03.10 |
Spring이 시작되면 AbstractApplicationContext
의 refresh
메서드를 통해 컨텍스트 관련 설정이 시작됩니다.
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// Invoke factory processors registered as beans in the context.
invokeBeanFactoryPostProcessors(beanFactory);
// Register bean processors that intercept bean creation.
registerBeanPostProcessors(beanFactory);
// Instantiate all remaining (non-lazy-init) singletons.
finishBeanFactoryInitialization(beanFactory);
많은 동작이 해당 메서드에서 실행되지만 주요하게 살펴볼 메서드는 위와 같습니다.
간단히 살펴보면 obtainFreshBeanFactory
통해 등록될 빈 정의가 로드됩니다.
그리고 invokeBeanFactoryPostProcessors
를 통해 BFPP가 등록되고 실행됩니다.
이후registerBeanPostProcessors
를 통해 BPP가 등록됩니다.
그렇게 빈을 초기화할 준비가 끝이 나면 finishBeanFactoryInitialization
메서드가 실행하여 빈을 초기화합니다.beanFactory
의 getBean
메서드가 실행되며 빈을 생성합니다.
이 과정에서 우리가 DI라고 부르는 의존성 주입이 일어납니다.
의존성 주입이 끝나고 나면 initializeBean
메서드를 실행하여 빈을 초기화합니다.
Object wrappedBean = bean;
if (mbd == null || !mbd.isSynthetic()) {
wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
}
try {
invokeInitMethods(beanName, wrappedBean, mbd);
}
catch (Throwable ex) {
throw new BeanCreationException(
(mbd != null ? mbd.getResourceDescription() : null), beanName, ex.getMessage(), ex);
}
if (mbd == null || !mbd.isSynthetic()) {
wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
}
return wrappedBean;
initializeBean
를 실행할 때는 applyBeanPostProcessorsBeforeInitialization
를 통해 BPP를 실행하여 생성된 빈에 대한 전처리를 적용합니다.
그리고 해당 빈에 적용된 초기화 메서드를 실행하고 applyBeanPostProcessorsAfterInitialization
를 통해 빈에 대한 후처리까지 적용한 이후 빈 생성을 마무리합니다.
정리해 보면 스프링의 빈 생명주기는 아래와 같습니다.
1. 빈 정의 등록
2. BFPP 등록 및 실행
3. BPP 등록
4. 빈 초기화
1. 등록된 BPP#postProcessBeforeInitialization 적용
2. 빈 초기화 메서드 적용
3. 등록된 BPP#postProcessAfterInitialization 적용
'스프링' 카테고리의 다른 글
인터페이스 타입으로 등록한 빈을 구현체 타입으로 DI 받지 못한 이유 (0) | 2025.03.19 |
---|---|
트랜잭션을 위한 프록시 객체와 AspectJ의 프록시 객체는 어떤 순서로 실행될까? (0) | 2025.03.18 |
트랜잭션 커밋과 AOP 중 어떤 것이 먼저 실행 될까? (0) | 2025.03.15 |
Parallel Test Execution (0) | 2025.03.13 |
Spring Modulith Scenario (0) | 2025.03.10 |