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. GPL 和BSD和Apache

    开源许可证GPL.BSD.MIT.Mozilla.Apache和LGPL的区别<ignore_js_op> 以下是上述协议的简单介绍:BSD开源协议BSD开源协议是一个给于使用者很大自由的 ...

  2. Java:多态(向上转型)

    先来看一段代码: class BaseClass{          public int book = 6;          public void base(){         System. ...

  3. SQL Server 【附】创建"商品管理数据库"、"学生选课数据库"的SQL语句

    附:(创建“商品管理数据库”的SQL语句) --建立"商品管理数据库"数据库-- create database 商品管理数据库 on(name='商品管理数据库_m', file ...

  4. Python中出现的异常

    简单的写几种我知道的关于Python中出现的异常含义,希望大神批评指正,我只是学软件开发的菜鸟,前面的路还很长,我会努力学习! 什么是异常? 异常既是一个事件,该事件会在程序执行过程中发生,影响了程序 ...

  5. Install Shield 打包教程

    我的是已经下载过打包工具InstallShield2013LimitedEdition,没有下载的只有下面那个灰色的的图标,不过没关系选中灰色的点确定直接跳到下载页面了.下载完成后再重新添加安装和部署 ...

  6. Netty

    首先值得注意的是netty的jar包版本问题,版本不同,运用的方式也不同.我这里用4.0版本. 对于小白来说,netty到底是什么,我就没必要在这里阐明了,因为百度上比我描述的更全面. 这里就直接开门 ...

  7. hive中分号问题

    分号是sql的结束符,在hql中亦如此,但是hive对分号的识别没有那么智能,如下: select concat(';','aa') from lhc limit 1; FAILED: Parse E ...

  8. C语言正则表达式详解 regcomp() regexec() regfree()详解

    标准的C和C++都不支持正则表达式,但有一些函数库可以辅助C/C++程序员完成这一功能,其中最著名的当数Philip Hazel的Perl-Compatible Regular Expression库 ...

  9. DATE 日期格式

    Oracle TO_DATE 日期格式 Oracle中TO_DATE格式2009-04-14 10:53TO_DATE格式(以时间:2007-11-02   13:45:25为例)           ...

  10. Java 对文件的读取操作

    package pack; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; ...