# 面向切面编程AOP

# 描述

AOP是一种思想,它让我们可以专心的做事,省掉繁琐复杂的前后准备工作。

# AOP的原理

将复杂的需求分解出不同方面,将公共功能提取出来集中解决。

而Spring就是通过代理模式实现模块代码的切割,在不改变原程序的基础上对代码进行增强处理,增加新的功能。

面向切面编程是软件编程思想发展到一定阶段的产物,是对面向对象编程的有益补充。AOP一般适用于具有横切逻辑的场合,如访问控制、事务管理、性能检测等。

简单来说:不改变原程序的基础上位代码段增加新的功能,对代码段进行增强处理。这种编程思想来源于设计模式中的代理模式。

支持Jar包和XML配置

spring-aop-3.2.13.RELEASE.jar

aopalliance-1.0.jar

aspectjweaver-1.6.9.jar

# 使用SpirngAOP实现日志输出

这里用一个让每个方法都增加logger日志输出的例子来进行梳理。

首先编写AOP增强类

before前置增强

afterReturning后置增强。

JoinPoint被切入的方法信息对象。

Spring的XML配置

首先声明增强类bean,然后编写aop:config配置

定义切入点pointcut,execution是切入点表达式。

定义aop增强类的方法配置。

before是方法前执行,after-returning是方法后执行。

# execution切入点表达式

execution支持模糊匹配

格式 说明
public * addNewUser(entity.User) 匹配所有类型的返回值
public void * (entity.User) 匹配所有方法名
public void addNewUser(..) 匹配所有参数个数和类型
* com.service..(..) 匹配com.service包下所有类的所有方法
* com.service...(..) 匹配com.service包下和子包下所有类的所有方法

# 异常抛出增强

# 描述

异常抛出增强的特点是在目标方法抛出异常时织入增强处理。可以为各功能模块提供统一的、可插拔的异常处理方案。

# 关键代码

在增强类中定义方法,参数为JoinPoint jpRuntimeException e

public test(){
    public void afterThrowing(JoinPoint jp , RuntimeException e){
        System.out.println("异常抛出增强:" + e);
    }
}
1
2
3
4
5

在XML中的aspect元素下定义

<aop:after-throwing method="增强类方法名" pointcut-ref="切入点id" throwing="e" />
1

# 说明

使用<aop:after-throwing>元素可以定义异常抛出增强。

如果需要获取抛出的异常,可以为增强方法声明RuntimeException参数。

并在<aop:after-throwing>中的throwing属性指定该参数名称。Spring会为其注入从目标方法抛出的异常实例。

# 最终增强

# 描述

最终增强的特点是无论方法抛出异常还是正常退出,该增强都会被执行,类似于异常处理机制的finally。

# 关键代码

<aop:after>元素

# 环绕增强

# 描述

目标方法前后都可以织入增强处理。

功能最强大的增强处理。

可获取或修改目标方法的参数、返回值、可对它进行异常处理,甚至可以决定目标方法是否执行。

# 关键代码

<aop:around>元素

# 示例

环绕增强类

需要增强的类和方法

Spring的XML配置

Test测试类

效果

最近更新: 2019/10/17 上午4:20:42