Overview

This article deeply explores the Spring IoC container initialization flow, analyzing Bean instantiation timing through breakpoint debugging.

Debug Test

The article answers the core question through breakpoint debugging: Is Bean creation during container initialization or during getBean?

Breakpoint 1: getBean

Setting a breakpoint at the getBean line and starting Debug mode, observation shows: When lazy loading is not configured, Bean creation is completed during container initialization.

Breakpoint 2: afterPropertiesSet

Setting a breakpoint at the afterPropertiesSet function of WzkBean, you can see that the constructor call timing is located in the finishBeanFactoryInitialization phase of the refresh method in the AbstractApplicationContext class.

Breakpoint 3: BeanFactoryPostProcessor

  • Initialization location: AbstractApplicationContext.refresh()invokeBeanFactoryPostProcessor(beanFactory)
  • Call location: Same as above

Breakpoint 4: BeanPostProcessor

  • Initialization: AbstractApplicationContext.refresh()registerBeanPostProcessor(beanFactory)
  • postProcessBeforeInitialization: During finishBeanFactoryInitialization(beanFactory) phase
  • postProcessAfterInitialization: Same as above

IoC Container Initialization Main Flow

AbstractApplicationContext#refresh() method is the core:

@Override
public void refresh() throws BeansException, IllegalStateException {
    synchronized (this.startupShutdownMonitor) {
        // Refresh preprocessing
        prepareRefresh();

        // Get new BeanFactory instance, load BeanDefinition
        ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

        // Set basic properties for BeanFactory
        prepareBeanFactory(beanFactory);

        try {
            // BeanFactory post-processing
            postProcessBeanFactory(beanFactory);

            // Invoke BeanFactoryPostProcessors
            invokeBeanFactoryPostProcessors(beanFactory);

            // Register BeanPostProcessors
            registerBeanPostProcessors(beanFactory);

            // Initialize MessageSource
            initMessageSource();

            // Initialize event broadcaster
            initApplicationEventMulticaster();

            // Subclass refresh logic
            onRefresh();

            // Register listeners
            registerListeners();

            // Initialize all non-lazy-loading singleton Beans
            finishBeanFactoryInitialization(beanFactory);

            // Complete container refresh
            finishRefresh();
        }
    }
}

IoC Container Initialization Key Steps

StepDescription
1Create container instance
2Load Bean definitions (XML/annotations/Java config class)
3Register Bean definitions
4Process Bean dependency injection
5Instantiate Beans
6Initialize Beans (@PostConstruct, InitializingBean, custom init-method)
7Register Bean post-processors
8Activate Bean lifecycle
9Complete container initialization

Bean Initialization Process

  1. @PostConstruct annotated method executes
  2. InitializingBean.afterPropertiesSet() is called
  3. Custom initialization method is called
  4. BeanPostProcessor.postProcessBeforeInitialization() executes
  5. BeanPostProcessor.postProcessAfterInitialization() executes

Summary

The Spring IoC container completes initialization through the AbstractApplicationContext.refresh() method. The core is in the finishBeanFactoryInitialization(beanFactory) phase, which completes instantiation and initialization of all non-lazy-loading singleton Beans.