Spring Aop动态代理实现原理是由jdk动态代理和cglib动态字节码生成技术实现的。他的织入器是Spring提供的动态代理对象ProxyFactory; (使用jdk动态代理必须要有接口定义 类,cglib 只需要普通类即可)
1.静态代理模式
/**
* 静态代理模式
*/
public class StaticProxyTest {
//声明一个接口
interface Itest {
public void method();
}
//定义接口实现类
static class TestImpl implements Itest{
@Override
public void method() {
System.out.println("i am impl");
}
}
//声明一个代理对象内含目标对象的接口引用
static class ProxyTest implements Itest{
private Itest itest;
ProxyTest(Itest itest){
this.itest = itest;
}
@Override
public void method() {
System.out.println("方法执行前处理逻辑");
itest.method();
System.out.println("方法执行后处理逻辑");
}
}
public static void main(String[] args) {
Itest itest = new TestImpl();
ProxyTest proxyTest = new ProxyTest(itest);
proxyTest.method();
}
}
运行结果:
方法执行前处理逻辑
i am impl
方法执行后处理逻辑
2.jdk 动态代理模式
定义接口类及接口实现目标类
public interface IRequestCtr {
public String getRequest();
}
public class RequestCtrImpl implements IRequestCtr {
@Override
public String getRequest() {
System.out.println("运行方法");
return "jia";
}
}
定义InvocationHandler实现类
public class InverCtrHandler implements InvocationHandler {
private Object target;
public InverCtrHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("代理前");
method.invoke(target,args);
System.out.println("代理后");
return null;
}
}
测试类
public class ProxyTest {
public static void main(String[] args) {
IRequestCtr reqProxy = (IRequestCtr)Proxy.newProxyInstance(ProxyTest.class.getClassLoader()
, new Class[]{IRequestCtr.class}
, new InverCtrHandler(new RequestCtrImpl()));
reqProxy.getRequest();
System.out.println(reqProxy.getClass().getName());
}
}
运行结果:
代理前
运行方法
代理后
com.sun.proxy.$Proxy0
3.cglib 动态生成字节码方式生成目标对象的子类
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyTest {
public static void main(String[] args) {
//cglib代理
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(RequestCtrImpl.class);
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object target, Method method, Object[] params, MethodProxy methodProxy) throws Throwable {
System.out.println("cglib 代理运行前");
Object result = methodProxy.invokeSuper(target, params);
System.out.println("cglib 代理运行后");
return result;
}
});
Object o = enhancer.create();
RequestCtrImpl o1 = (RequestCtrImpl) o;
System.out.println(o1.getRequest());
System.out.println(o);
}
com.common.test.RequestCtrImpl$$EnhancerByCGLIB$$1706dfbb@53b32d7