Spring 有如下两种选择来定义切入点和增强处理。

基于 Annotation 的“零配置”方式:使用@Aspect、@Pointcut等 Annotation 来标注切入点和增强处理。

基于 XML 配置文件的管理方式:使用 Spring 配置文件来定义切入点和增强点。

1、基于 Annotation 的“零配置”方式。

(1)、首先启用 Spring 对 @AspectJ 切面配置的支持。



aop:aspectj-autoproxy/

如果不打算使用 Spring 的 XML Schema 配置方式,则应该在 Spring 配置文件中增加如下片段来启用@AspectJ 支持。

(2)、定义切面 Bean。

当启动了@AspectJ 支持后,只要在 Spring 容器中配置一个带@Aspect 注释的 Bean, Spring 将会自动识别该 Bean 并作为切面处理。

// 使用@Aspect 定义一个切面类

@Aspect

public class LogAspect {

// 定义该类的其他内容

...

}

(3)、定义 Before 增强处理。

// 定义一个切面

@Aspect

@Component

public class BeforeAdviceTest {

// 匹配 com.wicresoft.app.service.impl 包下所有类的所有方法作为切入点

@Before("execution(* com.wicresoft.app.service.impl..(..))")

public void authorith(){

System.out.println("模拟进行权限检查。");

}

}

上面使用@Before Annotation 时,直接指定了切入点表达式,指定匹配 com.wicresoft.app.service.impl包下所有类的所有方法执行作为切入点。

关于这个表达式的规则如下图。

(4)、定义 AfterReturning 增强处理。

// 定义一个切面

@Aspect

@Component

public class AfterReturningAdviceTest {

// 匹配 com.wicresoft.app.service.impl 包下所有类的所有方法作为切入点

@AfterReturning(returning="rvt", pointcut="execution(* com.wicresoft.app.service.impl..(..))")

public void log(Object rvt) {

System.out.println("模拟目标方法返回值:" + rvt);

System.out.println("模拟记录日志功能...");

}

}

(5)、定义 AfterThrowing 增强处理。

// 定义一个切面

@Aspect

@Component

public class AfterThrowingAdviceTest {

// 匹配 com.wicresoft.app.service.impl 包下所有类的所有方法作为切入点

@AfterThrowing(throwing="ex", pointcut="execution(* com.wicresoft.app.service.impl..(..))")

public void doRecoverActions(Throwable ex) {

System.out.println("目标方法中抛出的异常:" + ex);

System.out.println("模拟抛出异常后的增强处理...");

}

}

(6)、定义 After 增强处理。

After 增强处理与AfterReturning 增强处理有点相似,但也有区别:

AfterReturning 增强处理处理只有在目标方法成功完成后才会被织入。

After 增强处理不管目标方法如何结束(保存成功完成和遇到异常中止两种情况),它都会被织入。

// 定义一个切面

@Aspect

@Component

public class AfterAdviceTest {

// 匹配 com.wicresoft.app.service.impl 包下所有类的所有方法作为切入点

@After("execution(* com.wicresoft.app.service.impl..(..))")

public void release() {

System.out.println("模拟方法结束后的释放资源...");

}

}

(7)、Around 增强处理

Around 增强处理近似等于 Before 增强处理和 AfterReturning 增强处理的总和。它可改变执行目标方法的参数值,也可改变目标方法之后的返回值。

// 定义一个切面

@Aspect

@Component

public class AroundAdviceTest {

// 匹配 com.wicresoft.app.service.impl 包下所有类的所有方法作为切入点

@Around("execution(* com.wicresoft.app.service.impl..(..))")

public Object processTx(ProceedingJoinPoint jp) throws java.lang.Throwable {

System.out.println("执行目标方法之前,模拟开始事物...");

// 执行目标方法,并保存目标方法执行后的返回值

Object rvt = jp.proceed(new String[]{"被改变的参数"});

System.out.println("执行目标方法之前,模拟结束事物...");

return rvt + "新增的内容";

}

}

(8)、访问目标方法的参数。

访问目标方法最简单的做法是定义增强处理方法时将第一个参数定义为 JoinPoint 类型,当该增强处理方法被调用时,该 JoinPoint 参数就代表了织入增强处理的连接点。JoinPoint 里包含了如下几个常用方法。

Object[] getArgs(): 返回执行目标方法时的参数。

Signature getSignature(): 返回被增强的方法的相关信息。

Object getTarget(): 返回被织入增强处理的目标对象。

Object getThis(): 返回 AOP 框架为目标对象生成的代理对象。

提示:当时使用 Around 处理时,我们需要将第一个参数定义为 ProceedingJoinPoint 类型,该类型是 JoinPoint 类型的子类。

(9)、定义切入点。

所谓切入点,其实质就是为一个切入点表达式起一个名称,从而允许在多个增强处理中重用该名称。

Spring 切入点定义包含两个部分:

一个切入点表达式。

一个包含名字和任意参数的方法签名。

// 使用@Pointcut Annotation 时指定切入点表达式

@pointcut("execution * transfer(..)")

// 使用一个返回值为void,方法体为空的方法来命名切入点

private void anyOldTransfer(){}

// 使用上面定义的切入点

@AfterReturning(pointcut="anyOldTransfer()", returning="reVal")

public void writeLog(String msg, Object reVal){

...

}

2、基于 XML 配置文件的管理方式。

不配置切入点

aop:config



<aop:aspect id="fourAdviceAspect" ref="fourAdviceBean" order="2">



<aop:after pointcut="execution(* com.wicresoft.app.service.impl..(..))" method="release" />

            <!-- 定义个Before增强处理,直接指定切入点表达式,以切面 Bean 中的 authority() 方法作为增强处理方法 -->
<aop:before pointcut="execution(* com.wicresoft.app.service.impl.*.*(..))" method="authority" /> <!-- 定义个AfterReturning增强处理,直接指定切入点表达式,以切面 Bean 中的 log() 方法作为增强处理方法 -->
<aop:after-returning pointcut="execution(* com.wicresoft.app.service.impl.*.*(..))" method="log" /> <!-- 定义个Around增强处理,直接指定切入点表达式,以切面 Bean 中的 processTx() 方法作为增强处理方法 -->
<aop:around pointcut="execution(* com.wicresoft.app.service.impl.*.*(..))" method="processTx" /> </aop:aspect>
</aop:config> <!-- 省略各个Bean 的配置 -->
<!-- ... -->

配置切入点

aop:config



<aop:pointcut id="myPointcut" expression="execution(* com.wicresoft.app.service.impl..(..))" method="release" />

<aop:aspect id="afterThrowingAdviceAspect" ref="afterThrowingAdviceBean" order="1">





<aop:after-throwing pointcut-ref="myPointcut" method="doRecovertyActions" throwing="ex" />

</aop:aspect>

</aop:config>

    <!-- 省略各个Bean 的配置 -->
<!-- ... -->

此文章摘自http://blog.csdn.net/a906998248/article/details/7514969

spring aop实现的更多相关文章

  1. 学习AOP之深入一点Spring Aop

    上一篇<学习AOP之认识一下SpringAOP>中大体的了解了代理.动态代理及SpringAop的知识.因为写的篇幅长了点所以还是再写一篇吧.接下来开始深入一点Spring aop的一些实 ...

  2. 学习AOP之认识一下Spring AOP

    心碎之事 要说知道AOP这个词倒是很久很久以前了,但是直到今天我也不敢说非常的理解它,其中的各种概念即抽象又太拗口. 在几次面试中都被问及AOP,但是真的没有答上来,或者都在面上,这给面试官的感觉就是 ...

  3. spring aop

    什么是AOP AOP(Aspect-OrientedProgramming,面向方面编程),它利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将 ...

  4. spring aop注解方式与xml方式配置

    注解方式 applicationContext.xml 加入下面配置 <!--Spring Aop 启用自动代理注解 --> <aop:aspectj-autoproxy proxy ...

  5. 基于Spring AOP的JDK动态代理和CGLIB代理

    一.AOP的概念  在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的 ...

  6. Spring AOP详解

    一.前言 在以前的项目中,很少去关注spring aop的具体实现与理论,只是简单了解了一下什么是aop具体怎么用,看到了一篇博文写得还不错,就转载来学习一下,博文地址:http://www.cnbl ...

  7. Spring AOP实例——异常处理和记录程序执行时间

    实例简介: 这个实例主要用于在一个系统的所有方法执行过程中出线异常时,把异常信息都记录下来,另外记录每个方法的执行时间. 用两个业务逻辑来说明上述功能,这两个业务逻辑首先使用Spring AOP的自动 ...

  8. 从零开始学 Java - Spring AOP 实现用户权限验证

    每个项目都会有权限管理系统 无论你是一个简单的企业站,还是一个复杂到爆的平台级项目,都会涉及到用户登录.权限管理这些必不可少的业务逻辑.有人说,企业站需要什么权限管理阿?那行吧,你那可能叫静态页面,就 ...

  9. 从零开始学 Java - Spring AOP 实现主从读写分离

    深刻讨论为什么要读写分离? 为了服务器承载更多的用户?提升了网站的响应速度?分摊数据库服务器的压力?就是为了双机热备又不想浪费备份服务器?上面这些回答,我认为都不是错误的,但也都不是完全正确的.「读写 ...

  10. 从零开始学 Java - Spring AOP 拦截器的基本实现

    一个程序猿在梦中解决的 Bug 没有人是不做梦的,在所有梦的排行中,白日梦最令人伤感.不知道身为程序猿的大家,有没有睡了一觉,然后在梦中把睡之前代码中怎么也搞不定的 Bug 给解决的经历?反正我是有过 ...

随机推荐

  1. php 中常见的函数及系统常量

    1.判断是否存在某函数: function_exists('memory_get_usage'): 2.统计程序执行到某节点消耗的系统内存: memory_get_usage(); 3.当前访问目录的 ...

  2. js中各种事件的兼容性

    1给元素绑定一个事件 ie8attachEvent(on+"事件",event); 高级浏览器 addEventListener("事件",event,fals ...

  3. java中值传递和引用传递

    最近工作中使用到了值传递和引用传递,但是有点懵,现在看了下面的文章后清晰多了.一下是文章(网摘) 1:按值传递是什么 指的是在方法调用时,传递的参数是按值的拷贝传递.示例如下: public clas ...

  4. php后台权限管理

    今天新到一家公司,重新维护升级了之前的权限管理. 权限管理思路:1.三张表(公司项目比较复杂,所以数据表远比这个复杂,这里只实现权限管理,简化一下)action表------权限大菜单:这个表没有实际 ...

  5. select 多表查询

    连接查询实际上是通过各个表之间共同列的关联性来查询数据的,它是关系数据库查询最主要的特征. select 表1.字段名1,表2.字段名2,... from 表1,表2 where 连接条件 连接查询分 ...

  6. Tomcat7开启CGI支持的方法

    tomcat默认没有开启cgi支持,因此有了tomat开启cgi的探索.因为原本对tomcat没多了解,所以中间或多或少走了点弯路.还好最终配置成功了,现在jy也用上这个方法了.    该方法在apa ...

  7. JCCLIENT IP GET UDP

    ##通道##110.52.233.5:18427## ##通道##112.95.251.214:18427## ##通道##119.29.192.206:18427## ##通道##123.207.1 ...

  8. silverlight调用webservice跨域

    下载下面的任何文件放在webservice的根目录下 http://files.cnblogs.com/files/jichunhu/crossdomain.xml http://files.cnbl ...

  9. javascript 伪协议

    [javascript 伪协议] 将javascript代码添加到客户端的方法是把它放置在伪协议说明符javascript:后的URL中.这个特殊的协议类型声明了URL的主体是任意的javascrip ...

  10. AOP (Aspect-OrientedProgramming)面向切面编程

    AOP OOP 面向对象编程 适合自上向下,却不适合自左向右 AOP把软件系统分为两个部分:核心关注点和横切关注点.业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点. 横切关注点的一个特 ...