JSF 2 PostConstructApplicationEvent and PreDestroyApplicationEvent example

Since JSF 2.0, you can register javax.faces.event.PostConstructApplicationEvent and javax.faces.event.PreDestroyApplicationEvent system event to manipulate the JSF application life cycle.

1. PostConstructApplicationEvent – Perform a custom post-configuration after application has started.
2. PreDestroyApplicationEvent – Perform a custom cleanup task before application is about to be shut down.

Note
In JSF, you can’t depends on the standard ServletContextListeners to perform above task, because the ServletContextListeners may be run before JSF application is started.

The following example shows you how to create a PostConstructApplicationEvent and PreDestroyApplicationEvent system event in JSF 2.0.

1. Implements SystemEventListener

Create a class which implements javax.faces.event.SystemEventListener, and override the processEvent() and isListenerForSource() methods for your custom post-configuration and clean up task.


package com.mkyong;

import javax.faces.application.Application;
import javax.faces.event.AbortProcessingException;
import javax.faces.event.PostConstructApplicationEvent;
import javax.faces.event.PreDestroyApplicationEvent;
import javax.faces.event.SystemEvent;
import javax.faces.event.SystemEventListener;

public class FacesAppListener implements SystemEventListener{

  @Override
  public void processEvent(SystemEvent event) throws AbortProcessingException {

	if(event instanceof PostConstructApplicationEvent){
		System.out.println("PostConstructApplicationEvent is Called");
	}
		
	if(event instanceof PreDestroyApplicationEvent){
		System.out.println("PreDestroyApplicationEvent is Called");
	}
		
  }

  @Override
  public boolean isListenerForSource(Object source) {
	//only for Application
	return (source instanceof Application);
		
  }	

}

2. Register System Events

Register both PostConstructApplicationEvent and PreDestroyApplicationEvent system event in faces-config.xml file like this :

faces-config.xml


<?xml version="1.0" encoding="UTF-8"?>
<faces-config
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
    version="2.0">
    <application>
    	
    	<!-- Application is started -->
    	<system-event-listener>
		<system-event-listener-class>
			com.mkyong.FacesAppListener
		</system-event-listener-class>
		<system-event-class>
			javax.faces.event.PostConstructApplicationEvent
		</system-event-class>    					
    	</system-event-listener> 	 
    	
    	<!-- Before Application is shut down -->
    	<system-event-listener>
		<system-event-listener-class>
			com.mkyong.FacesAppListener
		</system-event-listener-class>
		<system-event-class>
			javax.faces.event.PreDestroyApplicationEvent
		</system-event-class>    					
    	</system-event-listener> 	 
    	
    </application>
</faces-config>

3. Demo

Run your JSF application. The processEvent() method is executed after your JSF application is started, see figure below :

jsf2-PostConstructApplicationEvent-example
Note
However, the PreDestroyApplicationEvent is not really reliable, because JSF will not run it if it’s shut down abnormally. For example, Java process killed by system administrator, it’s always happened :). So, please use this system event wisely.

Download Source Code

Reference

  1. JSF 2 PostConstructApplicationEvent JavaDoc
  2. JSF 2 PreDestroyApplicationEvent JavaDoc

About the Author

author image
mkyong
Founder of Mkyong.com, love Java and open source stuff. Follow him on Twitter, or befriend him on Facebook or Google Plus. If you like my tutorials, consider make a donation to these charities.

Comments

avatar
0 Comment threads
0 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
0 Comment authors
Recent comment authors
newest oldest most voted