EJB学习笔记六(EJB中的拦截器)

 1.前言

听到拦截器,估计都不陌生,尤其是在Servlet规范中,充分应用了拦截器的概念。EJB3也提供了拦截器的支持,本质上是轻量级的AOP实现,拦截器可以将多个业务方法中的通用逻辑从业务方法中抽离出来,放在拦截器中实现,从而实现极好的代码复用。

2.EJB中的拦截器

Spring中的AOP实现提供了@Before、@AfterReturning、@AfterThrowing等大量的Annotation,这些注解用于定义功能丰富的增强处理,可是在EJB的拦截器没有打算实现完整的AOP
,只是提供了一个@AroundInvoke Annotation,功能比较有限。

 3.拦截器的定义

在EJB中定义拦截器非常简单,只需要使用@AroundInvoke修饰一个拦截器方法即可。

拦截器类

package com.Interceptor;

import javax.interceptor.AroundInvoke;
import javax.interceptor.InvocationContext;

public class HelloInterceptor {

	 @AroundInvoke
	    public Object log(InvocationContext ctx) throws Exception {
	        System.out.println("*** HelloInterceptor intercepting");
	        long start = System.currentTimeMillis();
	        try{
	            if (ctx.getMethod().getName().equals("SayHello")){
	                System.out.println("*** SayHello已经被调用! *** " );
	            }
	            if (ctx.getMethod().getName().equals("Myname")){
	                System.out.println("*** Myname已经被调用! *** " );
	            }
	            return ctx.proceed();
	        }catch (Exception e) {
	            throw e;

	        }finally {
	            long time = System.currentTimeMillis() - start;
	            System.out.println("用时:"+ time + "ms");
	        }
	    }
}

分析:从上面代码可以看出,这个拦截器并不需要实现任何接口,或者继承什么基类,只要用@AroundInvokeAnnotation标注该拦截器类的方法即可。拦截器方法必须满足如下格式:

public Object XXX(InvocationContext ctx) throws Exception

修饰类

package com.Interceptor;

import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.interceptor.ExcludeClassInterceptors;
import javax.interceptor.Interceptors;

@Stateless
@Remote (HelloChinaRemote.class)
@Interceptors(HelloInterceptor.class)
public class HelloChinaBean implements HelloChinaRemote {

    public String SayHello(String name) {
        return name +"你好";
    }

    //此注解,当拦截的时候,可以排除此方法
    @ExcludeClassInterceptors
    public String Myname() {
        return "我的名字";
    }

    //直接写在这里也可以
 /*   @AroundInvoke
    public Object log(InvocationContext ctx) throws Exception {
        System.out.println("*** HelloInterceptor intercepting");

        long start = System.currentTimeMillis();
        try{
            if (ctx.getMethod().getName().equals("SayHello")){
                System.out.println("*** SayHello已经被调用! *** " );
            }
            if (ctx.getMethod().getName().equals("Myname")){
                System.out.println("*** Myname已经被调用! *** " );
            }
            return ctx.proceed();
        }catch (Exception e) {
            throw e;

        }finally {
            long time = System.currentTimeMillis() - start;
            System.out.println("用时:"+ time + "ms");
        }
    }*/
}

4.小结

1.定义一个拦截器类,没有任何特殊之处,只要使用@AroundInvoke修饰一个具有public Object XXX(InvocationContext ctx) throws Exception签名的方法即可

2.在所有需要被拦截的EJB3的Bean实现类、业务方法上使用@Interceptors修饰

3.如果想将EJB中某个业务方法排除在被拦截之外,使用@ExcludeClassInterceptors修饰该方法。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 01:56:26

EJB学习笔记六(EJB中的拦截器)的相关文章

SpringMVC学习(十二)——SpringMVC中的拦截器

SpringMVC学习(十二)--SpringMVC中的拦截器 SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理.本文主要总结一下SpringMVC中拦截器是如何定义的,以及测试拦截器的执行情况和使用方法. SpringMVC中拦截器的定义和配置 SpringMVC中拦截器的定义 在SpringMVC中,定义拦截器要实现HandlerInterceptor接口,并实现该接口中提供的三个方法,如下: public class Inter

【SpringMVC学习11】SpringMVC中的拦截器

Springmvc的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理.本文主要总结一下springmvc中拦截器是如何定义的,以及测试拦截器的执行情况和使用方法. 1. springmvc拦截器的定义和配置 1.1 springmvc拦截器的定义 在springmvc中,定义拦截器要实现HandlerInterceptor接口,并实现该接口中提供的三个方法,如下: //测试拦截器1 public class HandlerInterceptor1 im

myBatis学习笔记(10)——使用拦截器实现分页查询

1. Page package com.sm.model; import java.util.List; public class Page<T> { public static final int DEFAULT_PAGE_SIZE = 20; protected int pageNo = 1; // 当前页, 默觉得第1页 protected int pageSize = DEFAULT_PAGE_SIZE; // 每页记录数 protected long totalRecord = -1

python之raw_input()(学习笔记六)

python之raw_input()(学习笔记六) 我们经常使用raw_input()读取用户的输入,如下例子所示: >>> name = raw_input('please input your name:'),截图如下: 下面简单说下,raw_input()与if搭配使用,脚本如下: #!/usr/bin/env python # -*- coding:utf-8 -*- birth = raw_input('birth:') if birth < 2000: print '0

java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessController的checkPerssiom方法,访问控制器AccessController的栈检查机制又遍历整个 PerssiomCollection来判断具体拥有什么权限一旦发现栈中一个权限不允许的时候抛出异常否则简单的返回,这个过程实际上比我的描述要复杂 得多,这里我只是简单的一句带过,因为这

初探swift语言的学习笔记六(ARC-自动引用计数,内存管理)

Swift使用自动引用计数(ARC)来管理应用程序的内存使用.这表示内存管理已经是Swift的一部分,在大多数情况下,你并不需要考虑内存的管理.当实例并不再被需要时,ARC会自动释放这些实例所使用的内存. 另外需要注意的: 引用计数仅仅作用于类实例上.结构和枚举是值类型,而非引用类型,所以不能被引用存储和传递. swift的ARC工作过程 每当创建一个类的实例,ARC分配一个内存块来存储这个实例的信息,包含了类型信息和实例的属性值信息. 另外当实例不再被使用时,ARC会释放实例所占用的内存,这些

Linux System Programming 学习笔记(六) 进程调度

1. 进程调度 the process scheduler is the component of a kernel that selects which process to run next. 进程调度器需要使 处理器使用率最大化,并且提供 使多个进程并发执行的虚拟 Deciding which processes run, when, and for how long is the process scheduler's fundamental responsibility. 时间片:th

Lua学习笔记(六):函数-续

Lua中的函数是带有词法定界(lexical scoping)的第一类值(first-class values).第一类值指:在Lua中函数和其他值(数值.字符串)一样,函数可以被存放在变量中,也可以存放在表中,可以作为函数的参数,还可以作为函数的返回值.词法定界指:嵌套的函数可以访问他外部函数中的变量.这一特性给Lua提供了强大的编程能力. Lua中关于函数稍微难以理解的是函数也可以没有名字,匿名的.当我们提到函数名(比如print),实际上是说一个指向函数的变量,像持有其他类型的变量一样:

laravel3学习笔记(六)

原作者博客:ieqi.net ==================================================================================================== ORM Laravel3中MVC体系中Model里最重要的组成部分无疑是ORM了,ORM — object-relational mapper — 将数据操作面向对象化,使得整个web框架的核心风格统一,降低整体复杂度,为开发者提供便利. Laravel3中的ORM叫