loading ...
loading...

2006-08-29 | EJB3引入的Interceptor(3)

分享

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容器对象池只能同时有两个对象活动,就可以看到钝化和激活过程.

分享 分享 |  评论 (0) |  阅读 (?)  |  固定链接 |  类别 (Java) |  发表于 22:21
搜狐博客温馨提示:搜狐博客官方不会要求参加活动的各位博友缴纳任何的手续费用。请勿轻信留言、评论中的中奖信息,更不要拨打陌生电话及向陌生帐户汇款,谨防受骗!识别更多网络骗术,请 点击查看详情
您还未登录,只能匿名发表评论。或者您可以 登录 后发表。
 
  *中国人爱国心,搜狗输入法爱国主题皮肤下载>>
表  情:
加载中...
回复通知: 同时用小纸条通知对方该回复