一、什么是AOP?
AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善。就是将交叉业务逻辑封装成切面,利用AOP的功能将切面织入到主业务逻辑中。所谓交叉业务逻辑是指,通用的、与主业务逻辑无关的代码若不使用AOP,则会出现代码纠缠,即交叉业务逻辑与主业务逻辑混合在一起。这样,会使主业务逻辑变的混杂不清。在代码执行过程中,动态嵌入其他代码,叫做面向切面编程。常见的使用场景:日志、事务、数据库操作等。
二、AOP关键性概念
代理对象=通知+目标
1、连接点:程序之间过程中明确的点,如方法的调用,异常的抛出
2、目标:被通知代理对象(完成具体执行的业务逻辑)
3、通知:某种特定的连接点上所执行的动作
4、代理:将通知应用到目标所创建的对象(代理=目标+通知)
//注:只有完整的代理对象才具备AOP特性,而AOP特性代码是写在通知中的(公共代码,例如:日志)
AOP特性:专一
6、切入点:多个连接点的集合,将通知应用到那些连接点 注:切入点相当于是一个匹配条件,只有满足条的连接点才会通知应用到目标上
7、迭代器:通知+切入点(相当于必须满足切入点条件才会应用通知分部)
三、AOP的实现方式
通知类型 | 说明 |
前置通知(MethodBeforeAdvice) | 目标方法执行之前调用 |
后置通知(AfterReturningAdvice) | 目标方法执行完成之后调用 |
环绕通知(MethodInterceptor) | 目标方法执行前后都会调用方法,且能增强结果 |
异常处理通知(ThrowsAdvice) | 目标方法出现异常调用 |
四、AOP代码实现示例
1、创建接口和实现类
package com.zking.spring02.biz;
public interface IBookBiz {
// 购书
public boolean buy(String userName, String bookName, Double price);
// 发表书评
public void comment(String userName, String comments);
}
package com.zking.spring02.biz;
import com.zking.spring02.advice.PriceException;
public class BookBizImpl implements IBookBiz {
public BookBizImpl() {
super();
}
public boolean buy(String userName, String bookName, Double price) {
// 通过控制台的输出方式模拟购书
if (null == price || price <= 0) {
throw new PriceException("book price exception");
}
System.out.println(userName + " buy " + bookName + ", spend " + price);
return true;
}
public void comment(String userName, String comments) {
// 通过控制台的输出方式模拟发表书评
System.out.println(userName + " say:" + comments);
}
}
2、前置通知
2.1创建前置通知类BeforeAdvice,包含前置通知方法before
package com.zking.spring02.advice;
import org.springframework.aop.MethodBeforeAdvice;
import java.lang.reflect.Method;
import java.util.Arrays;
/**
* 前置通知,用于目标方法被调用之前进行日志收集
*/
public cla