# 面向切面编程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 jp
和RuntimeException e
public test(){
public void afterThrowing(JoinPoint jp , RuntimeException e){
System.out.println("异常抛出增强:" + e);
}
}
2
3
4
5
在XML中的aspect元素下定义
<aop:after-throwing method="增强类方法名" pointcut-ref="切入点id" throwing="e" />
# 说明
使用<aop:after-throwing>
元素可以定义异常抛出增强。
如果需要获取抛出的异常,可以为增强方法声明RuntimeException
参数。
并在<aop:after-throwing>
中的throwing
属性指定该参数名称。Spring
会为其注入从目标方法抛出的异常实例。
# 最终增强
# 描述
最终增强的特点是无论方法抛出异常还是正常退出,该增强都会被执行,类似于异常处理机制的finally。
# 关键代码
<aop:after>
元素
# 环绕增强
# 描述
目标方法前后都可以织入增强处理。
功能最强大的增强处理。
可获取或修改目标方法的参数、返回值、可对它进行异常处理,甚至可以决定目标方法是否执行。
# 关键代码
<aop:around>
元素
# 示例
环绕增强类

需要增强的类和方法

Spring的XML配置

Test测试类

效果

← Spring基础