探秘AOP实现原理
可以这么说,AOP是基于动态代理实现的。
那么,这个过程是怎样的?
首先,我们有这样的一个Service类,它是被作为切面的一个类:
public class Service implements User {
public void addUser(){
System.err.println("模拟增加用户");
}
}
它实现了User接口,因为我们要使用JDK动态代理来实现这个过程,所以必须要实现这样一个接口。
然后,我们生成一个代理对象:
var service=(User)Proxy.newProxyInstance(Service.class.getClassLoader(),
new Class[]{User.class}, new Handler(new Service()));
这里需要实现一个handler:
public class Handler implements InvocationHandler {
private User target;
public Handler(User target) {
this.target=target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.err.println("模拟日志记录");
return method.invoke(target,args);
}
}
这个handler的作用是负责方法调用前的逻辑处理,
我们运行一下:
service.addUser();
可以看到会在addUser方法调用前执行日志记录,那么我们在Service类中增加一个方法:
public void delUser(){
System.err.println("模拟删除用户");
}
也可以看到日志记录是正常工作的,AOP的原理就是这样。