bboss aop拦截器使用简介

简介: bboss aop拦截器使用简介,本文适用于最新的bboss版本,下载方法参考: http://yin-bp.iteye.com/blog/1080824 1.概述 bboss aop/ioc框架支持给组件配置一到多个拦截器,拦截器执行的顺序为类似堆栈的先入后出的模式,before方法按顺序执行(先入),其他方法采用逆序方式执行(后出,先执行最后一个拦截器的其他方法,最后执行第一个拦截器的其他方法)。
bboss aop拦截器使用简介,本文适用于最新的bboss版本,下载方法参考:
http://yin-bp.iteye.com/blog/1080824

1.概述
bboss aop/ioc框架支持给组件配置一到多个拦截器,拦截器执行的顺序为类似堆栈的先入后出的模式,before方法按顺序执行(先入),其他方法采用逆序方式执行(后出,先执行最后一个拦截器的其他方法,最后执行第一个拦截器的其他方法)。
这里需要补充说明一下,声明式事务拦截器是bboss内置的一个拦截器,事务拦截器作为组件的所有拦截器中最后一个拦截器执行,同样遵循上面的先入后出原则。
2.拦截器接口
package com.frameworkset.proxy;
import java.lang.reflect.Method;
public interface Interceptor {
    public void before(Method method,Object[] args) throws Throwable;
    public void after(Method method,Object[] args) throws Throwable;
    public void afterThrowing(Method method,Object[] args,Throwable throwable) throws Throwable;
    
    public void afterFinally(Method method,Object[] args) throws Throwable;
}

Interceptor 接口定义了四个接口方法:
before-在方法执行之前执行,如果抛出异常,就会终止方法继续执行,同时将异常传递到应用层。
after-在方法执行之后执行,如果抛出异常,就会终止后续其他方法执行,同时将异常传递到应用层。
afterThrowing-当方法执行过程中抛出异常时执行,如果抛出异常,就会终止后续其他方法执行,同时将异常传递到应用层。
afterFinally-在方法finally后执行,如果抛出异常,就会终止后续其他方法执行,同时将异常传递到应用层。
所以在实现自己的Interceptor 时,一定要注意异常的处理,因为拦截器方法的异常会影响组件方法的执行流程。
3.一个具体的拦截器
package org.frameworkset.spi.properties.interceptor;

import java.lang.reflect.Method;

import com.frameworkset.proxy.Interceptor;
public class InterceptorImpl implements Interceptor {
	private A a;
	public void after(Method method, Object[] args) throws Throwable {
		System.out.println("Insterceptor.after(" + method.getName() + ", Object[] args)=" + args[0]);

	}

	public void afterFinally(Method method, Object[] args) throws Throwable {
		System.out.println("Insterceptor.afterFinally(" + method.getName() + ", Object[] args)=" + args[0]);
	}

	public void afterThrowing(Method method, Object[] args, Throwable throwable)
			throws Throwable {
		System.out.println("Insterceptor.afterThrowing(" + method.getName() + ", Object[] args, Throwable throwable)=" + args[0]);

	}

	public void before(Method method, Object[] args) throws Throwable {
		System.out.println("Insterceptor.before(" + method.getName() + ", Object[] args)=" + args[0]);


	}
}

拦截器InterceptorImpl 中定义了一个全局变量:
private A a;
我们可以对拦截器应用依赖注入(ioc)机制来注入其他业务组件和属性,也就是说拦截器组件本身也是以组件的方式来管理,ioc的所有机制都可以应用于拦截器xml配置节点interceptor,下面具体介绍配置xml元素-interceptor的用法。

4.拦截器配置xml元素-interceptor
interceptor元素作为组件定义元素property的内置元素使用,用来配置组件的aop拦截器。interceptor元素内置method元素,用来配置组件中需要被该拦截器拦截的具体方法,如果没有配置method元素,则对应的拦截器将拦截组件中所有的方法。如果组件配置了多个拦截器,每个拦截器都可以配置自己需要拦截的具体方法。

下面是一个配置实例:
<properties>
	<property name="test.interceptorbean" singlable="true" class="org.frameworkset.spi.properties.interceptor.A">
		<interceptor class="org.frameworkset.spi.properties.interceptor.InterceptorImpl"			
			f:a="attr:test.bean"
		/>		
	</property>
	
	<property name="test.interceptorbeanmethod" singlable="true" class="org.frameworkset.spi.properties.interceptor.A">
		<interceptor class="org.frameworkset.spi.properties.interceptor.InterceptorImpl"			
			f:a="attr:test.bean"
		>
			<method name="test">
				<param type="java.lang.String"/>
			</method>			
		</interceptor>		
	</property>
	
	<property name="test.bean" singlable="true" class="org.frameworkset.spi.properties.interceptor.A">
	</property>
</properties>


说明:
情形一
<interceptor class="org.frameworkset.spi.properties.interceptor.InterceptorImpl"
f:a="attr:test.bean"
/>
这种配置拦截所有方法,同时我们为拦截器中的属性a注入了另外一个组件实例。

情形二
<interceptor class="org.frameworkset.spi.properties.interceptor.InterceptorImpl"
f:a="attr:test.bean"
>
<method name="test">
<param type="java.lang.String"/>
</method>
</interceptor>
这里通过method元素指定了拦截器需要拦截的组件方法,可以配置多个:
<method name="test">
<param type="java.lang.String"/>
</method>
如果是具体的方法就需要指定方法的参数,如果是采用pattern(正则表达式)则无需指定方法参数,例如:
<method pattern="test.*"/>//表示拦截所有以test开头的方法,这里遵循标准的java正则表达式语法

<method pattern="*"/>//表示拦截所有方法,这里遵循标准的java正则表达式语法

情形三
如果有多个拦截器,请按顺序配置即可:

<interceptor class="org.frameworkset.spi.properties.interceptor.PermissioncheckInterceptorImpl"			
			f:a="attr:test.bean"
		/>
<interceptor class="org.frameworkset.spi.properties.interceptor.LogInterceptorImpl"			
			f:a="attr:test.bean"
		/>


5.内置的声明式事务拦截器配置需要拦截的事务方法配置示例
借助transactions元素和method来进行声明式事务方法配置。transactions和interceptor元素不一样,当transactions中没有配置method时,事务拦截器不会拦截组件的任何方法;而在transactions元素中method方法可以通过txtype属性指定方法需要开启的事务类型,并且在method元素中还可以通过rollbackexceptions和exception元素结合配置需要回滚事务的异常信息。下面是transactions的配置实例:
<property id="tx.a" singlable="true" class="org.frameworkset.spi.transaction.A1" >
		<!--  
			在下面的节点对组件的业务方法事务进行定义
			只要将需要进行事务控制的方法配置在transactions中即可
		-->
		<transactions>
			<!-- 
				定义需要进行事务控制的方法
				属性说明:
				name-方法名称,可以是一个正则表达式,正则表达式的语法请参考jakarta-oro的相关文档,如果使用
				正则表达式的情况时,则方法中声明的方法参数将被忽略,但是回滚异常有效。
				pattern-方法名称的正则表达式匹配模式,模式匹配的顺序受配置位置的影响,如果配置在后面或者中间,
						那么会先执行之前的方法匹配,如果匹配上了就不会对该模式方法进行匹配了,否则执行匹配操作。
						如果匹配上特定的方法名称,那么这个方法就是需要进行事务控制的方法
						例如:模式testInt.*匹配接口中以testInt开头的任何方法
				txtype-需要控制的事务类型,取值范围:
				NEW_TRANSACTION,
				REQUIRED_TRANSACTION,
				MAYBE_TRANSACTION,
				NO_TRANSACTION
				RW_TRANSACTION
			-->
			<method name="testTXInvoke" txtype="NEW_TRANSACTION">
				<param type="java.lang.String"/>
			</method>			
			<method name="testTXInvoke" txtype="REQUIRED_TRANSACTION"/>			
			<method name="testTXInvokeWithReturn" txtype="REQUIRED_TRANSACTION"/>			
			<method name="testTXInvokeWithException" txtype="MAYBE_TRANSACTION"/>				
			<method name="testSameName" txtype="NO_TRANSACTION"/>			
			<method name="testSameName1">
				<param type="java.lang.String"/>
			</method>
			<!-- 			    
					定义使事务回滚的异常,如果没有明确声明需要回滚事务的异常,那么当有异常发生时,
					事务管理框架将自动回滚当前事务
					class-异常的完整类路径
					type-是否检测类型异常的子类控制标识,
					IMPLEMENTS只检测异常类本身,忽略异常类的子类;
					INSTANCEOF检查异常类本省及其所有子类					
				-->
			<method name="testTXWithSpecialExceptions">
				<rollbackexceptions>
					<exception class="org.frameworkset.spi.transaction.RollbackInstanceofException" 
					type="INSTANCEOF"/>
					<exception class="org.frameworkset.spi.transaction.Exception1" 
					type="IMPLEMENTS"/>
				</rollbackexceptions>
				<param type="java.lang.String"/>
			</method>			
			<method name="testTXWithInstanceofExceptions">
				<rollbackexceptions>
					<exception class="org.frameworkset.spi.transaction.RollbackInstanceofException" 
					type="INSTANCEOF"/>
				</rollbackexceptions>
				<param type="java.lang.String"/>
			</method>			
			<method name="testTXWithImplementsofExceptions">
				<rollbackexceptions>
					<exception class="org.frameworkset.spi.transaction.RollbackInstanceofException" 
					type="IMPLEMENTS"/>
				</rollbackexceptions>
				<param type="java.lang.String"/>
			</method>
			<!-- 
					
					如果涉及的方法名称是一个正则表达式的匹配模式,则无需配置方法参数 
					如果指定的方法没有参数则无需指定参数
					注意参数出现的位置顺序和实际方法定义的参数顺序保持一致
					模式为* 表示匹配所有的方法
				-->				
			<!-- 
				通过模式方法进行声明式事务控制,同时声明了需要回滚事务的异常
				pattern【testPatternTX[1-9.]*】表示以testPatternTX开头的所有方法
			 -->			 
			<!--<method pattern="testPatternTX[1-9.]*">
				<rollbackexceptions>
					<exception class="org.frameworkset.spi.transaction.RollbackInstanceofException" 
					type="IMPLEMENTS"/>
				</rollbackexceptions>
				<param type="java.lang.String"/>
			</method>-->			 
			<!--	通过模式方法进行声明式事务控制
				pattern【testPatternTX[1-9.]*】表示以testPatternTX开头的所有方法		
				 -->	
			<method pattern="testPatternTX[1-9.]*"/>				
							
			<!-- 
				系统级别的异常java.lang.NullPointException,导致事务回滚
			 -->
			<method name="testSystemException">	
				<rollbackexceptions>
					<exception class="org.frameworkset.spi.transaction.RollbackInstanceofException" 
					type="IMPLEMENTS"/>
				</rollbackexceptions>
			</method>
		</transactions>
	</property>

说明:transactions和interceptor元素一起使用,这时transactions将会作为最后一个拦截器执行。

ok,bboss的所有拦截器机制和示例就介绍到此。
目录
相关文章
|
SQL XML 前端开发
bboss aop/ioc组件配置语法诠释
     这篇文章全面介绍bboss ioc 配置语法,希望对正在使用bboss或者即将使用bboss或者想了解bboss的朋友有所帮助;希望有助于大家了解和认识bboss,如果有不妥请大家批评指正。
1118 0
|
XML 数据格式 容器
bboss aop/ioc依赖注入功能介绍
bboss aop 3.5及后续版本中改进的ioc依赖注入功能介绍。 bboss依赖注入支持复杂关系的依赖注入:组件直接自引用(a->a),组件间接自引用(a->b->a),组件间循环依赖引用(a->b->c->d->b) 举一个简单的自引用的列子: 一、新的ioc功能特点 改进后的io...
886 0
|
Java
bboss aop ioc机制配置
bboss aop框架通过其动态代理模块来创建所有业务组件的代理对象实例,代理对象保持业务组件对象的引用,以便对声明式事务、注解事务、同步控制、拦截器、远程服务组件方法进行拦截调用。当业务组件引用其他业务组件的实例时,可以通过依赖注入的方式来初始化该引用实例的值,也可以通过依赖注入方式指定业务组件基本属性的值(目前支持两种基本类型,数字类型和字符串类型)。
1055 0
哈哈,终于在bboss aop中实现了rpc(远程服务调用)功能
哈哈,终于在bboss aop中实现了rpc(远程服务调用)功能,并成功应用到系统管理平台的集群功能中。 另外,通过bboss aop框架新增的远程管理框架,终于将系统管理平台中的事件管理框架独立成为一个单独的子项目,可以独立使用了,而且对事件管理框架进行了以下的改进: 本地事务处理做了一些完善 远程事件支持组播事件和点对点事件传播 经过测试后,即将发布bboss aop 1.0.6版本,bboss event 1.0.1版本。
822 0
bboss aop 系统全局属性管理
Bboss aop 框架在1.0.6版本中增加全局属性配置管理功能,并提供了相应的接口来获取这些属性,本节详细介绍。   bboss 项目下载地址: https://sourceforge.
723 0
|
监控
bboss aop 远程服务介绍-远程服务调用实例
环境准备 准备三台服务器 n         服务器A Ip 172.16.17.56 端口 1185   n         服务器B Ip 172.16.17.51 端口 1185 n         服务器C Ip 172.16.17.52 端口 1185 服务部署 假设我们已经定义了业务组件test.A和test.B,分别实现接口test.ServiceInf。
957 0
|
网络协议 网络安全
bboss aop 远程服务介绍-网络环境
bboss 项目下载地址: https://sourceforge.net/project/showfiles.php?group_id=238653 网络的要求就是要求bboss aop中的远程管理组件能够在各个服务器之间进行通讯,根据采用的不同网络协议,说明如下: Udp协议:确保能够进行udp通讯,如果你的机器之间装有防火墙之类的软件,必须允许udp数据包的传递。
744 0
bboss aop 远程服务介绍-点对点远程服务调用和组播服务调用的区别
bboss 项目下载地址: https://sourceforge.net/project/showfiles.php?group_id=238653 点对点远程服务调用和组播服务调用的区别主要在于 1.      方法有返回值时其返回值不同。
807 0
bboss aop 1.0.6 发布
bboss aop 1.0.6 发布,下载地址: https://sourceforge.net/project/showfiles.php?group_id=238653&package_id=290546&release_id=658454   新增了以下功能: 1.       增加远程管理组件 2.       实现aop 框架远程服务调用功能 3.       增加全局属性配置功能   更详细的介绍,请访问博客中新发布的相关文档。
789 0
|
人工智能 BI 存储
bboss aop 实践(2)
 本系列文件之二 介绍bboss aop框架中依赖注入(ioc)功能的使用方法 本系列文章适用于bboss-aop-1.0.5,下载地址:https://sourceforge.net/project/showfiles.php?group_id=238653&package_id=290546&release_id=658454 bboss aop提供两种方式的依赖注入:     属性依赖注入     构建函数依赖注入 另外还举例说明了bboss aop框架是怎么防止循环依赖注入的。
768 0