Here is the complete logical execution order of the Spring Bean Lifecycle, integrating all relevant lifecycle interfaces of the BeanFactory interface along with methods, ensuring a full picture of the flow.
🔷 1. Logical Execution Order of Spring Bean Lifecycle
(From Instantiation to Destruction)
1️⃣ Bean Definition is Loaded (Metadata Processing)
- Spring reads bean definitions from configuration files (
@Configuration), XML files, or component scanning (@Component). - This is a metadata processing step—no instances are created yet.
- 💡 Related method:
BeanDefinitionRegistry#registerBeanDefinition()
2️⃣ Bean Instantiation (Object Creation)
- The actual bean object is created either via:
- Constructor instantiation
- Factory method
- 💡 Related method:
InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation()
3️⃣ Set Bean Name (BeanNameAware#setBeanName(String name))
- If the bean implements
BeanNameAware, Spring callssetBeanName()to inform the bean of its own name. - This happens before dependencies are injected.
- 💡 Use Case: If a bean needs to know its name in the application context.
public class MyBean implements BeanNameAware {
@Override
public void setBeanName(String name) {
System.out.println("Bean Name Set: " + name);
}
}
4️⃣ Set Bean ClassLoader (BeanClassLoaderAware#setBeanClassLoader(ClassLoader classLoader))
- Spring calls this method if the bean needs access to its ClassLoader.
- 💡 Use Case: Useful if a bean dynamically loads classes at runtime.
public class MyBean implements BeanClassLoaderAware {
@Override
public void setBeanClassLoader(ClassLoader classLoader) {
System.out.println("ClassLoader Set!");
}
}
5️⃣ Set BeanFactory (BeanFactoryAware#setBeanFactory(BeanFactory factory))
- Spring injects the BeanFactory into the bean.
- 💡 Use Case: Allows the bean to get other beans programmatically.
public class MyBean implements BeanFactoryAware {
@Override
public void setBeanFactory(BeanFactory beanFactory) {
System.out.println("BeanFactory Set!");
}
}
6️⃣ Set Environment (EnvironmentAware#setEnvironment(Environment environment))
- If the bean needs access to environment variables and properties, this method is called.
- 💡 Use Case: Useful for accessing
application.propertiesvalues dynamically.
public class MyBean implements EnvironmentAware {
@Override
public void setEnvironment(Environment environment) {
System.out.println("Environment Set!");
}
}
7️⃣ Set Embedded Value Resolver (EmbeddedValueResolverAware#setEmbeddedValueResolver(StringValueResolver resolver))
- Allows the bean to resolve placeholders (
${property}) programmatically. - 💡 Use Case: Useful when a bean needs to manually resolve placeholders.
public class MyBean implements EmbeddedValueResolverAware {
@Override
public void setEmbeddedValueResolver(StringValueResolver resolver) {
System.out.println("Value Resolver Set!");
}
}
8️⃣ Set ResourceLoader (ResourceLoaderAware#setResourceLoader(ResourceLoader loader))
- Only applicable in ApplicationContext, used to load resources dynamically.
- 💡 Use Case: Load files, classpath resources, or external resources.
9️⃣ Set Application Event Publisher (ApplicationEventPublisherAware#setApplicationEventPublisher(ApplicationEventPublisher publisher))
- If a bean needs to publish events, this method is called.
- 💡 Use Case: Used to broadcast events like
ContextRefreshedEvent.
🔟 Set Message Source (MessageSourceAware#setMessageSource(MessageSource source))
- If the bean needs internationalization (i18n) support, Spring injects the
MessageSource.
1️⃣1️⃣ Set ApplicationContext (ApplicationContextAware#setApplicationContext(ApplicationContext ctx))
- If a bean needs access to the entire Spring ApplicationContext, this method is called.
- 💡 Use Case: Allows dynamic access to other beans, environment settings, etc.
1️⃣2️⃣ Set ServletContext (ServletContextAware#setServletContext(ServletContext ctx))
- Only applicable for web applications, used to access web context information.
1️⃣3️⃣ Post-Processing Before Initialization (BeanPostProcessor#postProcessBeforeInitialization())
- Allows modification of the bean before it is initialized.
1️⃣4️⃣ Custom Initialization
- InitializingBean’s
afterPropertiesSet() - Custom
@PostConstructmethod -
Custom
init-methodin@Bean
@PostConstruct
public void init() {
System.out.println("PostConstruct Method Called!");
}
1️⃣5️⃣ Post-Processing After Initialization (BeanPostProcessor#postProcessAfterInitialization())
- Allows modification of the bean after initialization.
- 💡 Use Case: Used for creating proxies, logging, or aspect-oriented programming (AOP).
1️⃣6️⃣ Bean is Ready for Use
- The bean is fully initialized and ready to be used in the application.
🔷 2. Destruction Phase (Bean Shutdown Lifecycle)
When the application shuts down, Spring destroys the beans gracefully.
1️⃣ Pre-Destruction Processing (DestructionAwareBeanPostProcessor#postProcessBeforeDestruction())
- Allows cleanup before destruction.
2️⃣ DisposableBean’s destroy() Method
- If the bean implements
DisposableBean,destroy()is called.
public class MyBean implements DisposableBean {
@Override
public void destroy() {
System.out.println("DisposableBean Destroy Called!");
}
}
3️⃣ Custom @PreDestroy Method (Preferred Approach)
- More modern than
DisposableBean, called before the bean is destroyed.
@PreDestroy
public void cleanup() {
System.out.println("PreDestroy Called!");
}
4️⃣ Custom destroy-method (If Defined in @Bean)
- Alternative approach for defining cleanup logic.
🔷 3. Complete Flow Summary (Final Order)
🟢 Bean Initialization Phase
1️⃣ Load Bean Definitions
2️⃣ Instantiate Bean (new Bean())
3️⃣ setBeanName() (BeanNameAware)
4️⃣ setBeanClassLoader() (BeanClassLoaderAware)
5️⃣ setBeanFactory() (BeanFactoryAware)
6️⃣ setEnvironment() (EnvironmentAware)
7️⃣ setEmbeddedValueResolver() (EmbeddedValueResolverAware)
8️⃣ setResourceLoader() (ResourceLoaderAware)
9️⃣ setApplicationEventPublisher() (ApplicationEventPublisherAware)
🔟 setMessageSource() (MessageSourceAware)
1️⃣1️⃣ setApplicationContext() (ApplicationContextAware)
1️⃣2️⃣ setServletContext() (ServletContextAware)
1️⃣3️⃣ postProcessBeforeInitialization() (BeanPostProcessor)
1️⃣4️⃣ @PostConstruct / afterPropertiesSet()
1️⃣5️⃣ postProcessAfterInitialization() (BeanPostProcessor)
1️⃣6️⃣ Bean is Ready for Use
🔴 Bean Destruction Phase
1️⃣ postProcessBeforeDestruction() (DestructionAwareBeanPostProcessor)
2️⃣ destroy() (DisposableBean)
3️⃣ @PreDestroy
4️⃣ destroy-method
More info on BeanFactory interface and its methods here: https://docs.spring.io/spring-framework/docs/6.2.2/javadoc-api/org/springframework/beans/factory/BeanFactory.html
Happy Coding 🚀
Top comments (0)