DEV Community

Hunor Vadasz-Perhat
Hunor Vadasz-Perhat

Posted on

spring-013: spring-boot-application-bean-lifecycle-comprehensive-execution-order-with-related-methods

1️⃣ Bootstrapping Phase (JVM & Spring Boot Startup)

  1. JVM starts and loads the main class (public static void main(String[] args)).
  2. SpringApplication.run() executes to initialize the application. πŸ’‘ Related method: SpringApplication.run()
  3. Environment Setup:
    • Loads system properties, environment variables, application.properties/yml, and command-line arguments.
    • Determines active and default profiles. πŸ’‘ Related method: ConfigurableEnvironment#setActiveProfiles(), PropertySourcesPropertyResolver#getProperty()
  4. Application Type Determined:
    • Web App β†’ AnnotationConfigServletWebServerApplicationContext
    • Non-Web App β†’ AnnotationConfigApplicationContext πŸ’‘ Related method: SpringApplication#determineWebApplicationType()
  5. AutoConfiguration & SpringFactoriesLoader:
    • Automatically registers dependencies from the classpath (META-INF/spring.factories). πŸ’‘ Related method: SpringFactoriesLoader#loadFactoryNames()
  6. SpringApplicationRunListeners Triggered:
    • Fires ApplicationStartingEvent, ApplicationEnvironmentPreparedEvent. πŸ’‘ Related method: SpringApplicationRunListeners#starting(), SpringApplicationRunListeners#environmentPrepared()

2️⃣ Context Initialization & Bean Lifecycle

  1. ApplicationContext is created and beans are scanned (@ComponentScan, @Configuration). πŸ’‘ Related method: AnnotationConfigApplicationContext#register()
  2. 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()
  3. Beans are instantiated (Object Creation):
    • Constructor-based instantiation.
    • Factory method instantiation. πŸ’‘ Related method: InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation()
  4. Lifecycle Aware Beans are processed:
    • setBeanName() (BeanNameAware). πŸ’‘ Related method: BeanNameAware#setBeanName(String name)
    • setBeanClassLoader() (BeanClassLoaderAware). πŸ’‘ Related method: BeanClassLoaderAware#setBeanClassLoader(ClassLoader classLoader)
    • setBeanFactory() (BeanFactoryAware). πŸ’‘ Related method: BeanFactoryAware#setBeanFactory(BeanFactory factory)
    • setEnvironment() (EnvironmentAware). πŸ’‘ Related method: EnvironmentAware#setEnvironment(Environment environment)
    • setEmbeddedValueResolver() (EmbeddedValueResolverAware). πŸ’‘ Related method: EmbeddedValueResolverAware#setEmbeddedValueResolver(StringValueResolver resolver)
    • setResourceLoader(), setApplicationEventPublisher(), setMessageSource(), setApplicationContext(), setServletContext() (if applicable).
  5. Conditional Beans & Profiles Applied (@Conditional, @Profile). πŸ’‘ Related method: Condition#matches(), ConfigurableEnvironment#getActiveProfiles()
  6. Post-processing before initialization: πŸ’‘ Related method: BeanPostProcessor#postProcessBeforeInitialization()
  7. Custom Initialization:
    • @PostConstruct
    • InitializingBean.afterPropertiesSet()
    • init-method (if defined in @Bean). πŸ’‘ Related method: InitializingBean#afterPropertiesSet(), @PostConstruct
  8. Post-processing after initialization: πŸ’‘ Related method: BeanPostProcessor#postProcessAfterInitialization()

3️⃣ Application Startup Completion

  1. ApplicationContext Refreshes:
    • Dependency injection is completed.
    • Fires ContextRefreshedEvent. πŸ’‘ Related method: AbstractApplicationContext#refresh()
  2. Embedded Web Server Starts (if applicable):
    • Tomcat, Jetty, or Undertow binds to a port.
    • ServletContextInitializer and WebApplicationInitializer execute for servlet-based apps. πŸ’‘ Related method: ConfigurableWebServerApplicationContext#start()
  3. CommandLineRunner & ApplicationRunner Execute:
    • Runs post-startup logic. πŸ’‘ Related method: CommandLineRunner#run(), ApplicationRunner#run()
  4. ApplicationReadyEvent Fires:
    • Application is fully initialized and ready to serve requests. πŸ’‘ Related method: ApplicationListener#onApplicationEvent(ApplicationReadyEvent)

4️⃣ Bean Destruction & Application Shutdown

  1. Graceful Shutdown Begins:
    • Controlled via spring.lifecycle.timeout-per-shutdown-phase. πŸ’‘ Related method: SpringApplication#setRegisterShutdownHook(true)
  2. Pre-Destruction Processing: πŸ’‘ Related method: DestructionAwareBeanPostProcessor#postProcessBeforeDestruction()
  3. Custom Cleanup:
    • DisposableBean.destroy().
    • @PreDestroy method.
    • Custom destroy-method (if defined in @Bean). πŸ’‘ Related method: DisposableBean#destroy(), @PreDestroy
  4. ApplicationContext Closes:
    • Fires ContextClosedEvent. πŸ’‘ Related method: ConfigurableApplicationContext#close()
  5. SpringApplication.exit() can be used to set custom exit codes (ExitCodeGenerator). πŸ’‘ Related method: SpringApplication#exit()

5️⃣ Advanced Considerations (Optimizations & Monitoring)

βœ… Lazy Initialization (@Lazy) – Beans are only created when accessed.

πŸ’‘ Related method: DefaultListableBeanFactory#setAllowBeanDefinitionOverriding(false)

βœ… Circular Dependency Handling – Use @Lazy, setter injection, or @DependsOn.

πŸ’‘ Related method: AbstractAutowireCapableBeanFactory#doResolveDependency()

βœ… FactoryBean Mechanism – Provides dynamic bean creation.

πŸ’‘ Related method: FactoryBean#getObject()

βœ… Spring Boot Actuator (if enabled):

  • /actuator/health, /actuator/shutdown, /actuator/metrics. πŸ’‘ Related method: HealthIndicator#health() βœ… Performance Optimizations:
  • Reduce startup time with spring.main.lazy-initialization=true.
  • Tune garbage collection (-XX:+UseG1GC). βœ… Custom Application Listeners (ApplicationListener<>) – Hook into startup/shutdown events. πŸ’‘ Related method: ApplicationListener#onApplicationEvent()

πŸ“Œ Final Summary: Ultimate Execution Order

🟒 Bootstrapping: JVM β†’ SpringApplication.run() β†’ AutoConfiguration β†’ Context Creation

🟠 Context Initialization: Beans Instantiated β†’ Lifecycle Hooks β†’ Dependency Injection

πŸ”΅ Application Startup: Web Server Starts β†’ Runners Execute β†’ Application Ready

🟣 Shutdown Phase: Pre-Destruction Callbacks β†’ Cleanup β†’ Context Closes


Top comments (0)