:P
[color=red]关于拦截器的命名规范以及优先级,包括拦截器有父类等情况,请参照附件中文档
[/color]
import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
//要作为参数传递的实体类(要实现remote调用,必须序列化)
public class Person implements Serializable{
@Id
@GeneratedValue
private int id;
private String name;
public int getId() {
return id;
}
public String getName() {
return name;
}
public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
}
//接口
public interface PersonService {
public void add(Person p);
}
//实现类
import javax.ejb.Local;
import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.interceptor.Interceptors;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
@Stateless
@Remote
@Local
//加入拦截器的定义,如果定义了多个拦截器,会按照定义的顺序先后执行,除了可以在外部定义拦截器之外,还可以将Session Bean中的一个或多个方法定义为拦截器,但是注意定义在外部的拦截器优先级高于定义在bean类中的优先级。
@Interceptors({SecurityInterceptor.class, OtherSomethingInterceptor.class})
public class PersonServiceImpl implements PersonService {
@PersistenceContext(unitName="test")
private EntityManager entityManager;
public void add(Person p) {
entityManager.persist(p);
System.out.println("User对象已经被存储 name:" + p.getName() +"其Id是" + p.getId());
}
//如下是我自己定义的拦截器
@AroundInvoke
public Object myBeanInterceptor(InvocationContext context) {
}
}
//第一个拦截器
import javax.interceptor.AroundInvoke;
import javax.interceptor.InvocationContext;
public class SecurityInterceptor {
@AroundInvoke
public Object doit(InvocationContext context) throws Exception {
System.out.println("要执行的方法是--->" + context.getMethod().getName());
System.out.println("ContextDate--->" + context.getContextData());
System.out.println("Target--->" + context.getTarget());
System.out.println("Parameters--->");
Object parameters[] = context.getParameters();
for(int i=0; i<parameters.length; i++) {
System.out.println(parameters[i]);
System.out.println("\n");
}
context.getContextData().put("hello", "世界你好");
//继续向下执行,相当于Filter中的doFilter()
Object object = context.proceed();
System.out.println("====方法" + context.getMethod().getName() + "已经执行完成");
return object;
}
}
//第二个拦截器
import javax.interceptor.AroundInvoke;
import javax.interceptor.InvocationContext;
public class OtherSomethingInterceptor {
@AroundInvoke
public Object doSomething(InvocationContext context) throws Exception {
System.out.println("第二个拦截器接收到的数据:" + context.getContextData());
Object object = context.proceed();
System.out.println("第二个拦截器的内容执行 完了");
return object;
}
}
//客户端的测试
import javax.naming.InitialContext;
import com.bjsxt.jpa.Person;
import com.bjsxt.jpa.PersonService;
public class Client {
public static void main(String[] args) throws Exception{
InitialContext ctx = new InitialContext();
PersonService ps = (PersonService)ctx.lookup("PersonServiceImpl/remote");
Person p = new Person();
p.setName("张三");
ps.add(p);
}
}
运行结果:
09:57:13,875 INFO [STDOUT] 要执行的方法是--->add
09:57:13,875 INFO [STDOUT] ContextDate--->{}
09:57:13,875 INFO [STDOUT] Target--->com.bjsxt.jpa.PersonServiceImpl@e9f6ef
09:57:13,875 INFO [STDOUT] Parameters--->
09:57:13,875 INFO [STDOUT] com.bjsxt.jpa.Person@1ffb7d4
09:57:13,875 INFO [STDOUT] 第二个拦截器接收到的数据:{hello=世界你好}
09:57:13,937 INFO [STDOUT] Hibernate: insert into Person (name) values (?)
09:57:13,937 INFO [STDOUT] User对象已经被存储 name:张三其Id是11
09:57:13,937 INFO [STDOUT] 第二个拦截器的内容执行 完了
09:57:13,937 INFO [STDOUT] ====方法add已经执行完成
注意:通过控制台的打印结果可以看出 Interceptor的执行流程与"责任链设计模式"中的执行流程式一样的。有了拦截器我们可以在要执行的方法前后加入自己的一些其他的业务逻辑。
[color=red]关于拦截器的命名规范以及优先级,包括拦截器有父类等情况,请参照附件中文档
[/color]