interceptor,AOP编程最经常见到的概念.EJB3也有这个注释@Interceptors,目前见到的用法只是在SessionBean生命周期的回调方法的使用上,不知道还有没有更有趣的比如spring或者Jboss AOP的用法,以一个例子说明下:
一个Count接口:
package com.denny_blue.ejb3.sessions;
import javax.ejb.Remote;
import com.denny_blue.ejb3.entity.User;
@Remote
public interface Counter {
public void HelloWorld();
public int count();
public void set(int val);
public void remove();
public void setUser(User user);
}
然后是一个stateful SessionBean实现了此接口:
package com.denny_blue.ejb3.sessions;
import javax.ejb.Remove;
import javax.ejb.Stateful;
import javax.interceptor.Interceptors;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import com.denny_blue.ejb3.entity.User;
import com.denny_blue.ejb3.sessions.Counter;
@Interceptors(CountCallBacks.class)
public @Stateful class CounterBean implements Counter {
private int val;
public void HelloWorld() {
System.out.println("Hello World");
}
public int count() {
System.out.println("count()");
return ++val;
}
@Remove
public void remove() {
System.out.println("remove()");
// TODO Auto-generated method stub
}
public void set(int val) {
this.val=val;
System.out.println("set()");// TODO Auto-generated method stub
}
}
注意上面代码的Interceptors注释,括号里面一个CountCallBacks.class,这个类相当于spring中advice的概念,拦截器:
package com.denny_blue.ejb3.sessions;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.ejb.PostActivate;
import javax.ejb.PrePassivate;
import javax.interceptor.InvocationContext;
public class CountCallBacks {
@PostConstruct
public void construct(InvocationContext ctx) {
System.out.println("cb:construct()");
}
@PostActivate
public void activate(InvocationContext ctx) {
System.out.println("cb:activate()");
}
@PrePassivate
public void passivate(InvocationContext ctx) {
System.out.println("cb:passivate()");
}
@PreDestroy
public void destroy(InvocationContext ctx){
System.out.println("cb:destroy()");
}
}
如上代码所示,我们在此类中拦截SessionBean的各个回调方法,打印他的生命周期.我们可以写个TEST来测试下上面的程序:
package com.denny_blue.ejb3.client;
import javax.naming.InitialContext;
import com.denny_blue.ejb3.entity.User;
import com.denny_blue.ejb3.sessions.Counter;
public class CounterClient {
private final static int NOCLIENTS = 3;
/**
* @param args
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
InitialContext initialContext = new InitialContext();
Counter[] count = new Counter[NOCLIENTS];
int countVal = 0;
for (int i = 0; i < NOCLIENTS; i++) {
count[i] = (Counter) initialContext.lookup("CounterBean/remote");
count[i].set(countVal);
countVal=count[i].count();
System.out.println(countVal);
Thread.sleep(1000);
}
Thread.sleep(1000);
System.out.println("calling count() on beans...");
for (int i = 0; i < NOCLIENTS; i++) {
countVal=count[i].count();
System.out.println(countVal);
count[i].remove();
Thread.sleep(1000);
}
}
}
以上程序可以观察到SessionBean的整个生命周期,当然,你要设置EJB容器对象池只能同时有两个对象活动,就可以看到钝化和激活过程.
![]() |
谢亚龙逼女足姑娘作检讨(图)
“安静”为啥成裁判口头语?
姚明私下发给刘翔的短信
|
![]() |
曝光:姚明小时候与可爱女生合影(图) 组图:隋菲菲私家相册 率性美感领衔女篮 |
![]() |
![]() |
![]() |


档案
日志
相册
视频








评论
想第一时间抢沙发么?