Spring AOP之ThrowsAdvice

目前的项目中接触了一些Spring的AOP的部分,比如声明式事务管理。在了解了AOP在Spring的实现之后,的确发现这种新的编程思路确实为我们提供用一种新的思路解决问题的办法。为了记录这个学习过程,整理一下学习的笔记。

 

1.  几个重要的概念(详细的情况参见Spring的在线文档)

 

·         PointCut:一组JointPoint。在Spring中我们可以通过一些正则表达式定义那些JointPoint组成了我们需要的一个PointCut,从而使我们的Advice可以被编制进来。

·         Introduction:Introduction可以我们在已经存在的类中在不修改这个类的情况下增加属性和方法,从而增加其状态和动作;

·         Target:满足PointCut定义的条件的一个类,我们可以把Advice用于这个类。大多Spring的AOP是通过动态代理的机制实现的,这个Target就是那个被代理的对象;

·         Proxy:为了将一个Advice应用到另外一个类中,比如实现Around Advice,就是在一个方法执行前后加上其他的代码,那么实际的实现一定是先执行一段Advice的代码,然后执行Target的那个方法,之后再执行一段Advice的代码,也就是客户端执行某个类的时候,实际执行的是一个代理,由代理再把调用传递到那个Target中。

·         Weaving(编织):有了Target和Advice,在什么时机将这两个模块编织在一起呢?可以选择的方法包括编译的时候(这样我们需要一个特殊的编译器),装载类的时候(这样我们需要一个特殊的ClassLoader)和运行的时候(AOP容易可以动态的创建一个代理从而将调用由这个代理传递到Target类中)。

 

2. Throws Advice

 

目前的项目中有这么一个要求,对于某些处理流程如果在运行的时候抛出了一些异常,需要将这些异常的信息记录下来,保存在数据库或发邮件给开发人员。我们切不说这个需求跟TDD有什么冲突的地方,先看看如何实现吧。

 

按照上面概念的描述,我们应该主要注意三个概念:Target,Advice和Proxy。

 

2.1 Target的实现

 

Target就是上面所说的业务流程类,我们按照正常的开发编写代码即可,没有什么特殊的要求。如:

 

public interface IBizProcess

{

                void doOneThing();

                void doAnotherThing();

}

 

public class BizProcessImpl implements IBizProcess

{

                public void doOneThing()

{

}

 

public void doAnotherThing()

{

                throw new RuntimeException( “Boom” );

}

}

 

2.2 Advice

 

为了实现当业务流程抛出异常时的Advice,我们需要定义个一个Advice类,实现ThrowsAdvice接口。这个接口里面没有定义方法,我们要求我们的类必须实现afterThrows这个方法,如下:

 

public void afterThrows( [Method method,] [Object args,] [Object target,] Throwable throwable );

 

这个方法的前面三个参数都是可选的。我们在同一个类中定义这个方法的多个版本,如:

 

public void afterThrowing( MyException1 ex ) {}

public void afterThrowing( MyException2 ex ) {}

 

具体那个方法被调用则根据具体的Exception来判断,由AOP容易自动识别执行。

 

2.3 Proxy(代理)

 

Spring中一个简单的实现是用它的org.springframework.aop.framework.ProxyFactoryBean。这个Bean包含了很多个属性,其中有三个我们需要设置:target,proxyInterfaces和interceptorNames,如下:

 

<bean id=”bizOneTarget” class=”com.company.biz.impl.BizProcessImpl”/>

<bean id=”throwsAdvice” class=”com.company.advice.MyThrowsAdvice”/>

<bean id=”bizOne” class=”org.springframework.aop.framework.ProxyFactoryBean”>

            <property name=”target”><ref bean=”bizOneTargte”/></property>

            <property name=”proxyInterfaces”>

                        <value>com.company.biz.IBizProcessImpl</value>

            </property>

            <property name=”interceptorNames”>

                        <list>

                                    <value>throwsAdvice</value>

                        </list>

            </property>

</bean>

 

通过上面的配置,Spring就把Target和Advice编织在了一起。需要说明的是,proxyInterfaces和interceptorNames都可以是多个,如果是多个的话就需要用list来定义。interceptorNames的先后次序决定了这些Advice执行的先后次序。

 

 

3. 简化配置

 

从上面的例子可以看出,如果有多个BizProcess的对象需要代理,我们在Spring配置中为每一个Bean都配置一个代理,那么配置文件的维护就成了麻烦。为此,Spring提供了比较方便的方法解决这个问题,比如BeanNameAutoProxyCreator、DefaultAdviceAutoProxyCreator和metadata autoproxying。我们采用了BeanNameAutoProxyCreator,因为他比较直观和简单。

 

 

配置如下:

 

<bean id=”beanNameAutoProxyCreator” class=”org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator”>

            <property name=’beanNames”>

                        <list>

                                    <value>*Service</value>

                        </list>

            </property>

            <property name=”interceptorNames”>

                        <value>throwsAdvice</value>

            </property>

</bean>

 

从中我们可以看到,所有以Service结尾的bean都会由Spring自动创建代理,从而实现Advice的织入。

时间: 2024-10-30 14:44:31

Spring AOP之ThrowsAdvice的相关文章

J2EE中使用Spring AOP框架和EJB组件

j2ee 快速发展的开发人员社区.对各种后端技术(包括JMS.JTA.JDO.Hibernate.iBATIS等等)的支持,以及(更为重要的)非侵入性的轻量级IoC容器和内置的AOP运行时,这些因素使得Spring Framework对于J2EE应用程序开发十分具有吸引力.Spring托管的组件(POJO)可以与EJB共存,并允许使用AOP方法来处理企业应用程序中的横切方面--从监控和审计.缓存及应用程序级的安全性开始,直到处理特定于应用程序的业务需求. 本文将向您介绍Spring的AOP框架在

s2sh框架搭建(基于spring aop)

对于spring aop 是如何管理事务的,请看一下:http://bbs.csdn.net/topics/290021423 1.applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3

Spring AOP框架

AOP正在成为软件开发的下一个圣杯.使用AOP,你可以将处理aspect的代码注入主程序,通常主程序的主要目的并不在于处理这些aspect.AOP可以防止代码混乱. 为了理解AOP如何做到这点,考虑一下记日志的工作.日志本身不太可能是你开发的主程序的主要任务.如果能将"不可见的".通用的日志代码注入主程序中,那该多好啊.AOP可以帮助你做到. Spring framework是很有前途的AOP技术.作为一种非侵略性的,轻型的AOP framework,你无需使用预编译器或其他的元标签,

spring AOP的方式监控方法的执行时间

前段时间有几个同行跟我吐槽说系统响应越来越慢,优化不知道从何入手!今天写写使用spring的aop来实现方法级的执行时间的记录监控,以此来评估方法的性能以及针对性的对已存在的方法进行优化. 对于监控,我们比较关注监控的可靠性和性能,准确,高效,这才能在不影响整体性能的情况下对我们的系统性能有个较准确的认识. 对于spring aop这个我就不多介绍了,网上一搜一大把,使用过spring的人都知道spring的ioc和aop.ioc我们常用,但在我们自己的系统中,aop的使用几乎为零,除了这个监控

基于Annotation拦截的Spring AOP权限验证方法

在 Web 开发过程中,一个非常理想的开发过程是,开发人员在开发中并不需要关心权限问题,不需要在 Java 方法中写 很多逻辑判断去判断用户是否具有合适的角色和权限,这样开发会花费非常多的人力成本,因为所有的开发人员都需要了解 关于权限的详细内容,也非常不容易进行后期维护.我们希望有专门的很少数量的开发人员了解权限内容,并且可以随时方 便的修改和配置.于是,我们使用 Annotation,在 Java 方法之前使用 Annotation 可以非常方便的添加,修改和删除对 于权限的管理功能. 本文

SSH集成框架下真正实现Spring AOP拦截功能

问题的提出: 在Struts1框架下,有三种类型的Action控制器,分别是MappingDispatchAction.DispatchAction和Action,他们是依次继承,最终执行的execute方法.但MappingDispatchAction.DispatchAction的子类中没有execute方法,只有参数指定的具体方法,而这些方法是被MappingDispatchAction.DispatchAction本类的execute方法调用执行,特别注意的是它是通过反射机制来做的(大家

Spring源代码解析(七):Spring AOP中对拦截器调用的实现

前面我们分析了Spring AOP实现中得到Proxy对象的过程,下面我们看看在Spring AOP 中拦截器链是怎样被调用的,也就是Proxy模式是怎样起作用的,或者说Spring是怎样为 我们提供AOP功能的: 在JdkDynamicAopProxy中生成Proxy对象的时候: Java代码 return Proxy.newProxyInstance(classLoader, proxiedInterfaces, this); 这里的this参数对应的是InvocationHandler对象

Spring源代码解析(五):Spring AOP获取Proxy

下面我们来看看Spring的AOP的一些相关代码是怎么得到Proxy的,让我们我们先看看 AOP和Spring AOP的一些基本概念: Advice: 通知,制定在连接点做什么,在Sping中,他主要描述Spring围绕方法调用注入的额外 的行为,Spring提供的通知类型有: before advice,AfterReturningAdvice,ThrowAdvice,MethodBeforeAdvice,这些都是 Spring AOP定义的接口类,具体的动作实现需要用户程序来完成. Poin

使用Spring AOP和AspectJ编排工作流

1.简介 如果你需要实现一个流式的流程,特别是嵌入的,并且你想让其易于配置.扩展.管理和维护.你是否需要一个功能齐备的BPM引擎呢:引擎都有自己的抽象负载,它对于你正在寻找的简单流程编排来说似乎过于笨重了:或者有什么轻量级的替代方案可以使用,让我们不必采用一个功能齐备的BPM引擎?本文说明了如何使用面向方面编程(AOP)技术来构建并编排高可配置.可扩展的轻量级嵌入式流程流(process flow).目前例子是基于Spring AOP和Aspect J的,其他AOP技术也可实现同样的结果. 2.