Title: Callbacks
Correct usage of PostConstruct, PreDestroy, PrePassivate, PostActivate, and
AroundInvoke for EJBs and Interceptors.

For Stateful, Stateless, and MessageDriven, the syntax is as follows:

 - @PostConstruct &lt;any-scope&gt; void &lt;method-name&gt;() 
 - @PreDestroy &lt;any-scope&gt; void &lt;method-name&gt;() 
 - @PrePassivate &lt;any-scope&gt; void &lt;method-name&gt;() 
 - @PostActivate &lt;any-scope&gt; void &lt;method-name&gt;() 

For an Interceptor, the syntax includes InvocationContext as follows:

 - @PostConstruct &lt;any-scope&gt; void &lt;method-name&gt;(InvocationContext) 
 - @PreDestroy &lt;any-scope&gt; void &lt;method-name&gt;(InvocationContext) 
 - @PrePassivate &lt;any-scope&gt; void &lt;method-name&gt;(InvocationContext) 
 - @PostActivate &lt;any-scope&gt; void &ltmethod-name&gt;(InvocationContext) 

The AroundInvoke syntax for an EJB or Interceptor is the same:

 - @AroundInvoke &lt;any-scope&gt; Object &lt;method-name&gt;(InvocationContext) throws Exception


<a name="Callbacks-Stateless"></a>
## Stateless


    import javax.ejb.Stateless;
    import javax.annotation.PostConstruct;
    import javax.annotation.PreDestroy;
    import javax.interceptor.AroundInvoke;
    import javax.interceptor.InvocationContext;
    
    @Stateless
    public class MyStatelessBean implements  MyBusinessInterface  {
    
        @PostConstruct
        public void constructed(){
    
        }
    
        @PreDestroy
        public void destroy(){
    
        }
    
        @AroundInvoke
        public Object invoke(InvocationContext invocationContext) throws Exception {
    	return invocationContext.proceed();
        }
    }


<a name="Callbacks-Stateful"></a>
## Stateful


    import javax.ejb.Stateful;
    import javax.ejb.PostActivate;
    import javax.ejb.PrePassivate;
    import javax.annotation.PostConstruct;
    import javax.annotation.PreDestroy;
    import javax.interceptor.AroundInvoke;
    import javax.interceptor.InvocationContext;
    
    @Stateful
    public class MyStatefulBean implements	MyBusinessInterface  {
    
        @PostConstruct
        public void constructed(){
    
        }
    
        @PreDestroy
        public void destroy(){
    
        }
    
        @AroundInvoke
        public Object invoke(InvocationContext invocationContext) throws Exception {
    	      return invocationContext.proceed();
        }
    
        @PostActivate
        public void activated(){
    
        }
    
        @PrePassivate
        public void passivate(){
    
        }
    }


<a name="Callbacks-MessageDriven"></a>
## MessageDriven


    import javax.ejb.MessageDriven;
    import javax.annotation.PostConstruct;
    import javax.annotation.PreDestroy;
    import javax.interceptor.AroundInvoke;
    import javax.interceptor.InvocationContext;
    
    @MessageDriven
    public class MyMessageDrivenBean implements  MyListenerInterface  {
    
        @PostConstruct
        public void constructed(){
    
        }
    
        @PreDestroy
        public void destroy(){
    
        }
    
        @AroundInvoke
        public Object invoke(InvocationContext invocationContext) throws Exception {
    	      return invocationContext.proceed();
        }
    }


<a name="Callbacks-Interceptor"></a>
## Interceptor


    import javax.annotation.PostConstruct;
    import javax.annotation.PreDestroy;
    import javax.interceptor.InvocationContext;
    import javax.interceptor.AroundInvoke;
    import javax.ejb.PostActivate;
    import javax.ejb.PrePassivate;
    
    public class MyInterceptor {
    
        @PostConstruct
        public void constructed(InvocationContext invocationContext){
    
        }
    
        @PreDestroy
        public void destroy(InvocationContext invocationContext){
    
        }
    
        @AroundInvoke
        public Object invoke(InvocationContext invocationContext) throws Exception {
          	return invocationContext.proceed();
        }
    
        @PostActivate
        public void activated(InvocationContext invocationContext){
    
        }
    
        @PrePassivate
        public void passivate(InvocationContext invocationContext){
    
        }
    }

