作用:
基于开闭原则,在不改变原有系统核心业务代码的基础上,动态增加一些扩张功能
应用场景:
日志处理:例如之前的智能柜系统,在登录接口或开箱接口调用时需要打印并存储请求信息,例如ip等
事务处理:spring的事务处理就是基于aop开发的
权限处理:某些接口在执行前需要进行token权限校验,可以使用拦截器实现权限校验,也可以使用aop实现
底层实现:
JDK动态代理模式:
如果目标对象(被代理对象)有实现接口,则底层默认采用“JDK动态代理机制”为目标对象创建“代理对象”
<Subject.java
//类似 目标接口 abstract class Subject { public abstract void Request(); }
RealSubject .java
//类似 目标对象 public class RealSubject extends Subject { @Override public void Request() { System.out.println("七个葫芦娃"); } }
Proxy .java
//类似 代理对象 -- 保存一个代理对象实体,使代理对象可以调用目标对象; //在执行目标对象之前或之后执行其他逻辑,这样就实现了AOP public class Proxy extends Subject { RealSubject realSubject; @Override public void Request() { if(realSubject == null){ realSubject = new RealSubject(); } //执行扩展逻辑 realSubject.Request(); } }
测试
public class TestMain { public static void main(String[] args) { Proxy proxy = new Proxy(); proxy.Request(); } }