Spring BeanPostProcessor Implementation and Initialization Flow

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

  1. Bean instance construction
  2. Pre-initialization BeanPostProcessor execution
  3. InitializingBean.afterPropertiesSet() method invocation
  4. Custom init-method execution
  5. Post-initialization BeanPostProcessor execution

Tags: Spring Framework BeanPostProcessor InitializingBean Bean Initialization Spring Container

Posted on Thu, 25 Jun 2026 17:48:03 +0000 by AndyB