3.2.8. Application Lifecycle Events
There are the following types of lifecycle events in a CUBA application:
- AppContextInitializedEvent
-  
    It is sent right after AppContext is initialized. At this moment: -  All the beans are fully initialized and their @PostConstructmethods are executed.
-  Static AppBeans.get()methods can be used for obtaining beans.
-  The AppContext.isStarted()method returnsfalse.
-  The AppContext.isReady()method returnsfalse.
 
-  
- AppContextStartedEvent
-  
    It is sent after AppContextInitializedEventand after running allAppContext.Listener.applicationStarted(). At this moment:-  The AppContext.isStarted()method returnstrue.
-  The AppContext.isReady()method returnsfalse.
-  On the middleware, if cuba.automaticDatabaseUpdate application property is enabled, all database update scripts are successfully executed. 
 
-  
- AppContextStoppedEvent
-  
    It is sent before the application shutdown and after running all AppContext.Listener.applicationStopped(). At this moment:-  All the beans are operational and can be obtained via AppBeans.get()methods.
-  AppContext.isStarted()method returnsfalse.
-  The AppContext.isReady()method returnsfalse.
 
-  
You can affect the order of listeners invocation by specifying the @Order annotation. The Events.HIGHEST_PLATFORM_PRECEDENCE and Events.LOWEST_PLATFORM_PRECEDENCE constants define the range which is used by listeners defined in the platform.
For example:
package com.company.demo.core;
import com.haulmont.cuba.core.global.Events;
import com.haulmont.cuba.core.sys.events.*;
import org.slf4j.Logger;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
import javax.inject.Inject;
@Component
public class MyAppLifecycleBean {
    @Inject
    private Logger log;
    // event type is defined by annotation parameter
    @EventListener(AppContextInitializedEvent.class)
    // run after all platform listeners
    @Order(Events.LOWEST_PLATFORM_PRECEDENCE + 100)
    protected void appInitialized() {
        log.info("Initialized");
    }
    // event type is defined by method parameter
    @EventListener
    protected void appStarted(AppContextStartedEvent event) {
        log.info("Started");
    }
    @EventListener
    protected void appStopped(AppContextStoppedEvent event) {
        log.info("Stopped");
    }
}- ServletContextInitializedEvent
-  
    It is published right after initialization of Servlet and Application contexts. At this moment: -  Static AppBeans.get()methods can be used for obtaining beans.
-  This event contains application and servlet contexts, thus enabling to register custom Servlets, Filters and Listeners, see Registration of Servlets and Filters. 
 
-  
- ServletContextDestroyedEvent
-  
    It is published when Servlet and Application are about to be shut down and enables to free resources manually. For example: @Component public class MyInitializerBean { @Inject private Logger log; @EventListener public void foo(ServletContextInitializedEvent e) { log.info("Application and servlet context is initialized"); } @EventListener public void bar(ServletContextDestroyedEvent e) { log.info("Application is about to shut down, all contexts are now destroyed"); } }