会话EJB系列(五)拦截器

上一篇文章《会话EJB系列(四)SessionBean事务管理》中,我们介绍了SessionBean的事务管理机制。

本文主题‘拦截器’,详细介绍其用途、作用、与Spring框架AOP的对比,并介绍其初步用法。

一.简介

企业级应用中经常面对的事务管理、安全检查、缓存、对象池管理等,为此Spring框架提供了AOP方式,灵活控制业务方法!而EJB3没有提供AOP支持,那么他又是如何应对的呢?

JavaEE规范中提供的横切性服务:事务管理和安全检查。

EJB容器实现JavaEE规范

用CMT解决事务管理问题

用JAAS以声明的方式解决安全检查,权限控制。

而对于其它具有横切性质的服务,JavaEE规范依然显得力不从心。

为了弥补缺乏AOP支持的不足,EJB3提供了拦截器支持。

本质是轻量级AOP实现,作用于AOP如出一辙

将多个业务方法中通用逻辑从业务方法中抽离出来,放在拦截中实现,实现代码复用。

二.EJB3的拦截器和Spring的AOP对比

(一)不同点

Spring的AOP实现提供了@Before,@AfterReturning,@AfterThrowing,@After,@Around等大量的Annotation,用于定义功能丰富增强处理。

而EJB提供的拦截器机制只能算是一种轻量级的AOP实现,功能比较有限。

(二)相同点

均使用@AroundInvoke修饰拦截方法,方法中定义的就是分布于多个模块中,具有横切性质的通用处理代码。

三.使用方法

(一)定义一个拦截器

首先定义一个拦截器类,并用@AroundInvoke修饰其中的方法,这个方法将会在SessionBean的多个方法被调用时“切入”。

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

public class MyInterceptor {

	@AroundInvoke
	public Object log(InvocationContext ctx) throws Exception {
		long start=System.currentTimeMillis();
		System.out.println("----拦截器运行开始----");
		try {
			Object rvt = ctx.proceed();
			return rvt;
		} catch (Exception e) {
			System.out.println("----拦截器运行出错----");
			throw e;
		} finally {
			long time = System.currentTimeMillis() - start;
			System.out.println("----拦截器运行结束----");
			System.out.println("拦截器运行用时:" + time + "ms");
		}

	}
}

可以看出,这个拦截器不需要实现任何接口,或继承什么基类,只要用@AroundInvoke Annotation标记该拦截器类的方法就可以。

需要指出的是,@AroundInvoke修饰的方法必须满足如下格式:

public Object  ****(InvocatonContext   cxt)   throws Exception

形参InvocatonContext  对象中,包含了被调用方法的详细信息,如:

1.Map<String,Object> getContextData():返回一个Map对象,该Map对象里封装了本次调用或生命周期回调相关上下文信息。

2.Method getMethod():获取被拦截的方法

3.Object[] getParameter();获取被拦截的业务方法的实际参数。

4.Object getRarget();获取被拦截的Session Bean实例

5.Object proceed():调用InvocationContext的该方法时,就是回调拦截方法,执行被拦截方法。

6.void setParameters(Object[] params):修改被拦截的业务方法的实际参数

(二)定义被拦截对象

1.定义SessionBean业务接口并声明3个方法

import javax.ejb.Remote;

@Remote
public interface HelloWorldBean {

	String hello1(String name);

	void hello2();

	void exclude();

}

接口中无需使用任何Annotation

只要在Bean实现类中使用@Interceptors来修饰即可

2.定义Bean实现类,并用@Interceptors修饰

@Interceptors是EJB3为依赖注入提供的Annotation ,用于修饰Bean类或业务方法,使用时需要用value属性指明拦截器类的类名。

若修饰某个Bean实现类,则对类中的所有方法均起作用

若修饰某个Bean实现类中的方法,则只对标记的方法起作用。

若用@ExcludeClassInterceptors修饰Bean内的某个业务上,则表示拦截器对该标记方法不起作用

import javax.ejb.Stateless;
import javax.interceptor.AroundInvoke;
import javax.interceptor.Interceptors;
import javax.interceptor.InvocationContext;

@Stateless(mappedName = "HelloWorldBeanImpl")
@Interceptors(MyInterceptor.class)
public class HelloWorldBeanImpl implements HelloWorldBean {
	public String hello1(String name) {
		System.out.println("我是被拦截器拦击的方法:hello1");
	}

	public void hello2() {
		System.out.println("我是被拦截器拦截的方法:hello2");
	}

	public void exclude() {
		System.out.println("我是被拦截器排除在外的方法:exclude");
	}

}

相关EJB拦截器的使用文章,请参考《EJB3.0中拦截器的实现

总结

从上述文章可以看出,EJB3的拦截器是一种轻量级AOP机制,和Spring框架中的AOP如出一辙。

而且使用极为简单,开发者只需要如下步骤即可:

(1)定义一个普通类。如何把它标记为拦截器类呢?只需要使用@AroundInvoke修饰一个具有public Object  ****(InvocatonContext   cxt)   throws Exception签名的方法即可。

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

(3)如果想在EJB中某个方法中不使用拦截器,则使用@ExcludeClassInterceptors修饰该方法即可。

时间: 2024-11-06 16:23:55

会话EJB系列(五)拦截器的相关文章

会话EJB系列(四)SessionBean事务管理

(上一篇文章中我们介绍了<会话EJB系列(三)SessionBean生命周期>,本为的主要介绍SessionBean中事务管理) SessionBean从功能上可以分为两类: 第一类:成为EAO:用于封装底层的实体和JPA,本质上其功能就是DAO.(不需要事务控制.因为JPA本质是对ORM实现的封装.) 第二类:充当业务组件:是底层EAO对象的Facade,系统控制器(如struts中的Action,springMVC中的Controller)将调用他们的业务方法来处理用户请求.(需要添加事务

会话EJB系列(二)EJB分类

(本文承接上一篇文章<会话EJB系列(一)EJB概述>,继续对EJB内容展开详细解说) EJB规范中定义了三种Bean: 会话Bean(Session Bean) 实体Bean(Entity Bean) 消息驱动Bean(MessageDrive Bean) 一.SessionBean的概念和作用 (1)定义 作用:用于处理业务逻辑的完整组件. 当SessionBea部署在在EJB容器中后,客户端获取该EJB组件,并调用它的方法,至方法结束,称为:客户端与SessionBean之间的一次会话,

会话EJB系列(三)SessionBean生命周期

(上一篇文章中我们介绍了<会话EJB系列(二)EJB分类> ,本文的核心为:SessionBean的生命周期) EJB生命周期:指EJB在运行过程中经历的阶段和状态. 首先强调的是:SessionBean的生命周期是由容器控制的而不是应用程序!对于客户端是完全透明的.但是对于开发者而言,必须了解SessionBean在EJB中的运行规律,才可以更好的管理SessionBean.当然允许被开发者改变. 在前面的文章中我们提到过,可以将EJB容器理解为Spring容器,运行在EJB中的Sessio

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

 1.前言 听到拦截器,估计都不陌生,尤其是在Servlet规范中,充分应用了拦截器的概念.EJB3也提供了拦截器的支持,本质上是轻量级的AOP实现,拦截器可以将多个业务方法中的通用逻辑从业务方法中抽离出来,放在拦截器中实现,从而实现极好的代码复用. 2.EJB中的拦截器 Spring中的AOP实现提供了@Before.@AfterReturning.@AfterThrowing等大量的Annotation,这些注解用于定义功能丰富的增强处理,可是在EJB的拦截器没有打算实现完整的AOP ,只是

会话EJB系列(一)EJB概述

EJB(Enterprise Java Bean)是Java EE(以前叫J2EE)的核心规范,不仅仅是一种优秀的组件技术,而且还是Java EE 其它规范(如RMI,JNDI,JMS等)的具体应用. 一.EJB的概念和意义 (1)EJB规范的由来 随着软件规模的快速增大和技术复杂度(分布式软件的开发技术,如CORBA.RMI等)的增加,导致软件开发变得越来越复杂,使普通程序员难于处理各种系统级服务,从而使得大型软件系统的开发变得难以为继. 后来,Sun公司发布了EJB规范,目的是统一各种分布式

Struts2-学习笔记系列(14)-拦截器

6.1对action 的拦截 自定义拦截器: 1 public class MyInterceptor extends AbstractInterceptor { 2 3 private String name; 4 5 6 @Override 7 public String intercept(ActionInvocation actionInvocation) throws Exception { 8 //获取被拦截的action实例 9 LoginAction action = (Logi

Struts2基础学习(五)&mdash;拦截器

一.概述 1.初识拦截器      Interceptor 拦截器类似前面学过的过滤器,是可以在action执行前后执行的代码,是我们做Web开发经常用到的技术.比如:权限控制.日志等.我们也可以将多个Interceptor 连在一起组成Interceptor 栈.     Struts2拦截器,每个拦截器类只有一个对象实例,即采用单例模式,所有引用这个拦截器的Action都共享这一拦截器类的实例,因此在拦截器中如果使用类变量,要注意同步的问题.      注意:              (1

会话EJB系列(六)依赖注入

在本文的开始之前,先给大家介绍一个概念"依赖". 什么是依赖呢? 简单的说,就是A组件需要调用B组件,B组件需要调用C组件,C组件需要调用D组件-..这种调用称为:依赖! 在最早的应用程序中,依赖关系时通过new关键字来实现的.A组件依赖B组件,就是在A组件中显示的new一个B组件.缺点: 1.硬编码,耦合性强,难以维护.A组件只需要B组件中的方法,不必关心B组件的创建问题! 2.频繁的创建对象,导致系统开销增大. 上面的这种缺点,直接催生了'工厂模式'. 在工厂模式中,A组件依赖B组

EJB系列 - 会话Bean基础知识

本人博客文章网址:https://www.peretang.com/basic-knowledge-of-session-bean/ 什么是会话 有限的时间周期内,客户端和服务器之间的连接 为什么使用会话bean 因为EJB大部分服务都是专门提供给会话bean的 1. 并发和线程安全: 容器利用很多技术来自动确保开发者不必担心并发或线程安全的问题   2. 远程处理和Web服务的服务提供   3. 事务和安全管理   4. 拦截器 会话bean的规范 1. 至少具有一个业务接口(EJB3.1后可