以下内容为个人学习笔记(多引荐自别人优秀见解和内容,同时结合自己的理解)
1.什么是aop
aop(Aspect Oriented Programming)即面向切面编程,面向切面编程是面向对象编程的一种延续或补充。一般程序设计过程中,编写的代码都是从上至下的顺序执行,也就是面对对象只允许你定义从上到下的关系,这就导致了很多代码的重复,例如事务管理、日志功能都是在业务代码上多出来的于业务无关的功能代码。而aop通过“切面”编程的方式,将重复的代码封装起来,在需要的时候再“切入”执行。
正如Avanade公司的高级方案构架师Adam Magee所说,AOP的核心思想就是“将应用程序中的商业逻辑同对其提供支持的通用服务进行分离。”
2.spring AOP原理
aop的原理是动态代理。主要有两种实现方式,第一种是当代理类有实现接口时,使用jdk动态代理实现;第二种是当代理类没有实现类时使用CGLIB(Code Generation Library)实现。
第一种 jdk动态代理实现
要了解这种实现方式可以先去了解jdk动态代理。
jdk动态代理实现主要是去创建接口实现类的代理对象,在代理对象中增强类的方法。
jdk动态代理实现AOP的基本过程:
- 创建接口及接口实现类
public interface User {
String getUserName(String id);
boolean addUser(String id);
}
public class UserImpl implements User {
@Override
public String getUserName(String id) {
return "返回username";
}
@Override
public boolean addUser(String id) {
return false;
}
}
- 调用jdk中java.lang.reflect包下的动态代理类proxy,该类提供了newProxyInstance方法实现生成接口的代理对象
- 编写接口代理对象,实现实现类的增强逻辑
public class UserProxy {
public static void main(String[] args) {
Class[] interfaces = {User.class};
// 创建接口实现类实例传递给InvocationHandler实现类实现"切面"
UserImpl user = new UserImpl();
// 创建接口实现接口实现类的代理对象,使用proxy中的newInstanceProxy方法
Proxy.newProxyInstance(UserProxy.class.getClassLoader(),interfaces, new UserInvocationHandler(user));
}
}
- 编写invocationHandler实现类,实现增强逻辑
// 继承InvocationHandler,重写invoke方法,编写接口实现类增强逻辑
public class UserInvocationHandler implements InvocationHandler {
// 被代理接口实现类proxyObject
private Object proxyObject;
// 第一步,通过构造函数获取被代理接口实现类
public UserInvocationHandler(Object proxyObject){
this.proxyObject = proxyObject;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 前置执行(在方法执行之前)
System.out.println("方法执行之前执行该逻辑:"+method.getName()+"该方法的参数"+ Arrays.toString(args));
// 被增强的方法执行
method.invoke(proxyObject,args);
// 后置执行
System.out.println("方法执行之后执行该逻辑:"+proxyObject);
return null;
}
}
第二种 使用CGLIB(Code Generation Library)实现(后面补)
详情可以参考别人的优秀博文
3.spring AOP源码略析(后面补)
详情可以参考别人的优秀博文