Spring AOP的底层是基于JDK和CGLIB代理技术来实现的,要理解Spring AOP,需要先对JDK和CGLIB有一定的认识和理解。
一. JDK动态代理
先看一段Demo示例,首先定义一个接口:
public interface DemoInterface {
public void service();
}
该接口的实现:
public class DemoImpl implements DemoInterface {
@Override
public void service() {
System.out.println("do service");
}
}
定义一个InvocationHandler的实现类:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class DemoInvocationHandler implements InvocationHandler {
private Object obj;
public DemoInvocationHandler(Object obj) {
this.obj = obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Start.");
Object result = method.invoke(obj, args);
System.out.println("End.");
return result;
}
}
看看效果:
import java.lang.reflect.Proxy;
public class Main {
public static void main(String[] args) {
DemoImpl demoImpl = new DemoImpl();
DemoInterface demoInterface = (DemoInterface) Proxy.newProxyInstance(demoImpl.getClass()
.getClassLoader(), demoImpl.getClass().getInterfaces(),
new DemoInvocationHandler(demoImpl));
demoInterface.service();
System.out.println(demoInterface.getClass());
}
}
控制台输出:
可见这个代理类已经按我们的设计工作了,最后一个输出是代理类的Class Name,可以看到是class com.sun.proxy. Proxy0,这个就是