Spring Bean Lifecycle Management
Bean Initialization Timeline
- Instantiate the bean via constructor or factory method
- Populate bean properties through dependency injection
- If bean implements BeanNameAware, invoke setBeanName()
- If bean implements BeanFactoryAware, invoke setBeanFactory()
- If bean implements ApplicationContextAware, invoke setApplicationContext()
- Execute BeanPostProcessor.postProcessBeforeInitialization() for all configured processors
- If bean implements InitializingBean, invoke afterPropertiesSet()
- Execute custom initialization method specified via init-method
- Execute BeanPostProcessor.postProcessAfterInitialization() for all configured processors
- Bean becomes ready for use
- Container shutdown initiated
- If bean implements DisposableBean, invoke destroy()
- Execute custom destruction method specified via destroy-method
Initialization Method Execution Order
InstantiationAwareBeanPostProcessor → BeanPostProcessor (pre-initialization) → @PostConstruct → InitializingBean.afterPropertiesSet() → Custom init-method
Key Component Responsibilities
DeferredImportSelector: Extends bean registration capabilities by adding fully qualified bean names
AbstractAutowireCapableBeanFactory: Handles property injection for beans
AutowiredAnnotationBeanPostProcessor: Processes @Autowired and @Value annotations
AbstractBeanFactory.resolveEmbeddedValue(): Resolves embedded values in configuration
Complete Registration Process
BeanDefinitionRegistryPostProcessor enables custom bean definition registration through BeanDefinitionRegistry
ImportBeanDefinitionRegistrar works with @Import annotation to register additional beans programmatically
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;
public class LoggerRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
BeanDefinition loggerDefinition = new GenericBeanDefinition();
loggerDefinition.setBeanClassName("com.example.ApplicationLogger");
registry.registerBeanDefinition("appLogger", loggerDefinition);
}
}
Configuration class implementation:
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Configuration
@Import(LoggerRegistrar.class)
public class ApplicationConfiguration {
// Additional configuration elements
}
Extension Points
InstantiationAwareBeanPostProcessor extends BeanPostProcessor with pre-instantiation capabilities for creating proxy objects:
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor;
import org.springframework.stereotype.Component;
@Component
public class ProxyCreationProcessor implements InstantiationAwareBeanPostProcessor {
@Override
public Object postProcessBeforeInstantiation(Class<?> targetClass, String beanId) throws BeansException {
if (targetClass.isAnnotationPresent(Transactional.class)) {
return generateProxyInstance(targetClass);
}
return null;
}
}
BeanPostProcessor methods handle pre and post initialization logic for bean wrapping and processing
InitializingBean.afterPropertiesSet() executes after all properties are set, suitable for resource initializtaion like thread pools
DisposableBean.destroy() handles cleanup operations during bean destruction, such as connection pool termination