Ejb3.0-2

Ejb3.0--2
今天继续昨天的学习,session bean 的生命周期和拦截器(interceptor)
package com.chenzhq.ejb;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.ejb.Init;
import javax.ejb.Local;
import javax.ejb.PostActivate;
import javax.ejb.PrePassivate;
import javax.ejb.Remote;
import javax.ejb.Remove;
import javax.ejb.Stateful;
import javax.interceptor.AroundInvoke;
import javax.interceptor.InvocationContext;

@Stateful
@Remote ({HelloWorldRemote.class})
@Local ({HelloWorldLocal.class})
//@Interceptors ({HelloWorldInterceptor.class})
public class HelloWorld implements HelloWorldLocal, HelloWorldRemote {

	@Init
	public void init(){
		System.out.println("init 方法是最早调用的方法!");
	}
	@PostConstruct
	public void construct(){
		System.out.println("PostConstruct 方法是在init方法调用之后调用的方法!");
	}
	@PrePassivate
	public void passivate(){
		System.out.println("PrePassivate 方法是专门对于stateful session bean 的方法,他将在钝化bean之前调用!");
	}
	@PostActivate
	public void activate(){
		System.out.println("activate 方法是专门对于stateful session bean 的方法,他将在钝化bean之后,然后访问钝化的bean,容器将重新实例化bean之后调用。");
	}
	@PreDestroy
	public void destroy(){
		System.out.println("PreDestroy 方法是在session bean 被对象池销毁前调用的。");
	}
	@Remove
	public void remove(){
		System.out.println("Remove 方法是通过存根对象调用的,这样容器就知道什么时候将对象从对象池中移走这个对象了。");
	}
	@AroundInvoke
	public Object log(InvocationContext ic) throws Exception{
		if(ic.getMethod().getName().equals("say"))
			System.out.println("say method is implemented!!!");
		return ic.proceed();
	}
    public String say(String name){
    	return name;
    }
}

1 楼 zzx0421 2008-10-16  
请问下AroundInvoke注解的方法什么时候调用?
2 楼 xiaocong1001 2008-10-17  
@AroundInvoke所注释的方法是在@Init,@PostConstruct之后say方法之后调用的;
13:19:44,866 INFO  [STDOUT] init 方法是最早调用的方法!
13:19:44,866 INFO  [STDOUT] PostConstruct 方法是在init方法调用之后调用的方法!
13:19:44,866 INFO  [STDOUT] say
13:19:44,866 INFO  [STDOUT] say method is implemented!!!
13:28:18,763 INFO  [STDOUT] PrePassivate 方法是专门对于stateful session bean 的方法,他将在钝化bean之前调用!