When we create an ApplicationContext
in Spring, such as:
ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
Spring performs the following steps behind the scenes to create and manage beans:
1. Register Bean Definitions
Spring parses configuration classes (annotated with @Configuration
, @Component
, @Bean
, etc.) and generates BeanDefinition
objects for each bean. These definitions describe how each bean should be created, including its class type, scope, dependencies, etc.
- It uses processors like
ConfigurationClassPostProcessor
to scan and parse these annotations. - All
BeanDefinition
s are stored in an internal registry within theBeanFactory
.
2. Refresh Context
The refresh()
method in ApplicationContext
is a complex lifecycle method. Key steps include:
-
invokeBeanFactoryPostProcessors()
— modifies or adds additionalBeanDefinition
s. -
registerBeanPostProcessors()
— sets up hooks to customize bean creation (e.g. AOP). -
finishBeanFactoryInitialization()
— triggers the creation of singleton beans.
3. Instantiate Beans
When getBean()
is called or during pre-instantiation of singletons, Spring follows:
- Create instance — using constructor or factory method.
-
Inject dependencies — by field, setter, or constructor (
@Autowired
,@Value
). -
Apply initialization callbacks — like
@PostConstruct
, or interfaces likeInitializingBean
. - Apply BeanPostProcessors — allows enhancement or proxying (used by AOP, @Transactional).
4. Store in Singleton Cache
If the bean scope is singleton (default), Spring caches the instance for future use.
Summary Flowchart:
@Configuration + @ComponentScan
↓
parse to BeanDefinition
↓
register in BeanFactory
↓
on refresh(): createBean()
↓
- instantiate
- inject dependencies
- initialize
- apply post processors
↓
put into singleton cache
Top comments (0)