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
| Step | Description |
|---|---|
| 1 | Create container instance |
| 2 | Load Bean definitions (XML/annotations/Java config class) |
| 3 | Register Bean definitions |
| 4 | Process Bean dependency injection |
| 5 | Instantiate Beans |
| 6 | Initialize Beans (@PostConstruct, InitializingBean, custom init-method) |
| 7 | Register Bean post-processors |
| 8 | Activate Bean lifecycle |
| 9 | Complete container initialization |
Bean Initialization Process
- @PostConstruct annotated method executes
- InitializingBean.afterPropertiesSet() is called
- Custom initialization method is called
- BeanPostProcessor.postProcessBeforeInitialization() executes
- 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.