Bean Initialization Process in Spring Framework
The Spring container manages bean initialization through a specific sequence of operations. The initializeBean method orchestrates this process, which involves several key steps:
protected Object initializeBean(String beanName, Object beanInstance,
@Nullable RootBeanDefinition beanDef) {
// Handle security-aware initialization
if (System.getSecurityManager() != null) {
AccessController.doPrivileged((PrivilegedAction<object>) () -> {
executeAwareInterfaces(beanName, beanInstance);
return null;
}, getAccessControlContext());
} else {
executeAwareInterfaces(beanName, beanInstance);
}
Object processedBean = beanInstance;
if (beanDef == null || !beanDef.isSynthetic()) {
processedBean = executePreInitializationProcessors(processedBean, beanName);
}
try {
// Execute InitializingBean interface method
runInitializationMethods(beanName, processedBean, beanDef);
} catch (Throwable ex) {
throw new BeanCreationException(
(beanDef != null ? beanDef.getResourceDescription() : null),
beanName, "Initialization method invocation failed", ex);
}
if (beanDef == null || !beanDef.isSynthetic()) {
processedBean = executePostInitializationProcessors(processedBean, beanName);
}
return processedBean;
}
</object>
Initialization Method Execution
The runInitializationMethods method handles the execution of initialization callbacks:
protected void runInitializationMethods(String beanName, Object beanInstance,
@Nullable RootBeanDefinition beanDef)
throws Throwable {
boolean implementsInitializing = (beanInstance instanceof InitializingBean);
if (implementsInitializing && (beanDef == null ||
!beanDef.isExternallyManagedInitMethod("afterPropertiesSet"))) {
if (logger.isTraceEnabled()) {
logger.trace("Executing afterPropertiesSet() for bean: " + beanName);
}
if (System.getSecurityManager() != null) {
try {
AccessController.doPrivileged((PrivilegedExceptionAction<object>) () -> {
((InitializingBean) beanInstance).afterPropertiesSet();
return null;
}, getAccessControlContext());
} catch (PrivilegedActionException pae) {
throw pae.getException();
}
} else {
((InitializingBean) beanInstance).afterPropertiesSet();
}
}
if (beanDef != null && beanInstance.getClass() != NullBean.class) {
String customInitMethod = beanDef.getInitMethodName();
if (StringUtils.hasLength(customInitMethod) &&
!(implementsInitializing && "afterPropertiesSet".equals(customInitMethod)) &&
!beanDef.isExternallyManagedInitMethod(customInitMethod)) {
// Execute custom initialization method
invokeCustomInitialization(beanName, beanInstance, beanDef);
}
}
}
</object>
Bean Initialization Sequence
- Bean instance construction
- Pre-initialization BeanPostProcessor execution
- InitializingBean.afterPropertiesSet() method invocation
- Custom init-method execution
- Post-initialization BeanPostProcessor execution