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. java闭包

    闭包就是在一个外部类A中声明了一个内部类B,然后这个内部类可以访问他自己B的作用域和外部类A的作用域.然后现在用另外一个类C创建了一个内部类B,那么这个内部类B可以访问C的作用域. 如果没有闭包,那B ...

  2. C# List集合Group by查询

    C# List集合Group by查询 //根据企业ID.类型.配置ID进行分组: var groupList = chRCheckConfirmList .GroupBy(x => new { ...

  3. win10 重装应用商店

    管理员模式打开powershell 命令窗口,输入以下重装应用商店的命令.亲测有效,我刚安装回来了. Get-AppXPackage *WindowsStore* -AllUsers | Foreac ...

  4. iOS开发中获取文本的宽高的方式

    /** 计算单行文字的size @parms  文本 @parms  字体 @return  字体的CGSize */ + (CGSize)sizeWithText:(NSString *)text ...

  5. php实现只保留mysql中最新1000条记录

    这篇文章主要介绍了php实现只保留mysql中最新1000条记录的方法和相关示例及数据库结构,十分的全面,有需要的小伙伴可以参考下. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 1 ...

  6. Android使用ViewPager做轮播

    ViewPager.html div.oembedall-githubrepos { border: 1px solid #DDD; list-style-type: none; margin: 0 ...

  7. 重走java--Step 3

    java基础(三)之枚举用法用法一:常量 public enum Color {    RED,GREEN,RED,YELLOW;}用法二:枚举中自定义方法/** * 枚举中自定义方法 */publi ...

  8. .NET Core Web 应用部署到 Docker 中运行

    环境介绍 : 虚拟机:VirtualBox 5.1.6 系 统:Ubuntu 16.04.1 LTS 系统准备完成后可以使用 sudo apt-get udpate 和 sudo apt-get up ...

  9. C# 实现一个可取消的多线程操作 示例

    private void button1_Click(object sender, EventArgs e) { //定义一个为可取消资源标志 CancellationTokenSource cts ...

  10. sqllite

    public static void tt()        {            int ID = 0; while(true)            {                stri ...