AOP 的全称是“Aspect Oriented Programming”,即面向切面编程,它将业务逻辑的各个部分进行隔离,使开发人员在编写业务逻辑时可以专心于核心业务,从而提高了开发效率。
面向切面编程(AOP)和面向对象编程(OOP)类似,也是一种编程模式。
AOP 采取横向抽取机制,取代了传统纵向继承体系的重复性代码,其应用主要体现在事务处理、日志管理、权限控制、异常处理等方面。
目前最流行的 AOP 框架有两个,分别为 Spring AOP 和 AspectJ。
- Spring AOP 使用纯 Java 实现,不需要专门的编译过程和类加载器,在运行期间通过代理方式向目标类植入增强的代码。
- AspectJ 是一个基于 Java 语言的 AOP 框架,从 Spring 2.0 开始,Spring AOP 引入了对 AspectJ 的支持。AspectJ 扩展了 Java 语言,提供了一个专门的编译器,在编译时提供横向代码的植入。
Spring AOP 是基于 AOP 编程模式的一个框架,它的使用有效减少了系统间的重复代码,达到了模块间的松耦合目的。
在面向切面编程的思想里面,把功能分为核心业务功能,和周边功能。周边功能在Spring的面向切面编程AOP思想里,被定义为切面,
- 核心业务,比如登陆,增加数据,删除数据都叫核心业务
- 周边功能,比如性能统计,日志,事务管理等等
核心业务功能和切面功能分别独立进行开发,然后把切面功能和核心业务功能 "编织" 在一起,
//常见术语
Joinpoint(连接点) 指那些被拦截到的点,在 Spring 中,可以被动态代理拦截目标类的方法。
Pointcut(切入点) 指要对哪些 Joinpoint 进行拦截,即被拦截的连接点。
Advice(通知) 指拦截到 Joinpoint 之后要做的事情,即对切入点增强的内容。
Target(目标) 指代理的目标对象。
Weaving(植入) 指把增强代码应用到目标上,生成代理对象的过程。
Proxy(代理) 指生成的代理对象。
Aspect(切面) 切入点和通知的结合。
一、简单小项目
1、业务类
2、日志类
JointPoint是程序运行过程中可识别的点,这个点可以用来作为AOP切入点。JointPoint对象则包含了和切入相关的很多信息。比如切入点的对象,方法,属性等。我们可以通过反射的方式获取这些点的状态和信息,用于追踪tracing和记录logging应用信息。
pointcut 是一种程序结构和规则,它用于选取join point并收集这些point的上下文信息。
pointcut通常包含了一系列的Joint Point,我们可以通过pointcut来同时操作jointpoint。单从概念上,可以把Pointcut当做jointpoint的集合。
java.lang.Object[] getArgs():获取连接点方法运行时的入参列表;
Signature getSignature() :获取连接点的方法签名对象;
java.lang.Object getTarget() :获取连接点所在的目标对象;
java.lang.Object getThis() :获取代理对象本身;
3、applicationContext.xml
aop 在 xml 中的相关配置
<aop:config> <aop:aspect ref="myAspect"> <!-- 配置切入点,通知最后增强哪些方法 --> <aop:pointcut expression="execution ( * com.mengma.dao.*.* (..))" id="myPointCut" /> <!--前置通知,关联通知 Advice和切入点PointCut --> <aop:before method="myBefore" pointeut-ref="myPointCut" /> <!--后置通知,在方法返回之后执行,就可以获得返回值returning 属性 --> <aop:after-returning method="myAfterReturning" pointcut-ref="myPointCut" returning="returnVal" /> <!--环绕通知 --> <aop:around method="myAround" pointcut-ref="myPointCut" /> <!--抛出通知:用于处理程序发生异常,可以接收当前方法产生的异常 --> <!-- *注意:如果程序没有异常,则不会执行增强 --> <!-- * throwing属性:用于设置通知第二个参数的名称,类型Throwable --> <aop:after-throwing method="myAfterThrowing" pointcut-ref="myPointCut" throwing="e" /> <!--最终通知:无论程序发生任何事情,都将执行 --> <aop:after method="myAfter" pointcut-ref="myPointCut" /> </aop:aspect> </aop:config>
我们需要用到的如下
4、测试
二、注意报错:
1、发现了以某某开头的无效内容
调整aop:pointcut 与 aop:aspect 的位置
2、java.lang.IllegalArgumentException: Pointcut is not well-formed: expecting 'name pattern' at character position 46
分开后就好了
3、 java.lang.IllegalArgumentException:
找不到,注意要指到类