Spring AOP 本质系列之动态代理

来源:百度文库 编辑:神马文学网 时间:2024/04/28 19:46:20
Spring 的AOP核心技术还是动态代理,Spring的代理实现方式有两种,默认使用CGLIB,也可以选择使用JDK的代理,这一切对开发人员来说是透明的,可以不关心这些。
但是,Spring实在是太强了,太吸引人了,以至于不得不研读其底层的API实现。
Spring代理生成的过程还是和JDK有一定区别的,经过研读分析Spring AOP底层源码,画出了其原理图。并且为了对比JDK的动态代理的实现,也给出JDK动态代理原理图。

下面,给出个JDK实现动态代理的例子,Spring的例子在AOP本质系列中比比皆是,故此不再给出。
/**
* Created by IntelliJ IDEA.

* User: leizhimin

* Date: 2008-5-9 14:16:18

* Note: 目标抽象接口
*/
public interface ITarget {
public void doSomething();
}
/**
* Created by IntelliJ IDEA.

* User: leizhimin

* Date: 2008-5-9 14:17:03

* Note: 目标类
*/
public class Target implements ITarget {
public void doSomething() {
System.out.println(">>>正在调用Targer.doSomething()方法!");
}
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
* Created by IntelliJ IDEA.

* User: leizhimin

* Date: 2008-5-9 14:23:07

* Note: 代理处理器实现
*/
public class MyInvocationHandler implements InvocationHandler {
private Target target;
public MyInvocationHandler(Object obj) {
target = (Target) obj;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(">>>代理处理器start...");
Object result = method.invoke(target, args);
System.out.println(">>>代理处理器end...");
return result;
}
}
import java.lang.reflect.Proxy;
/**
* Created by IntelliJ IDEA.

* User: leizhimin

* Date: 2008-5-9 14:27:20

* Note: 客户端
*/
public class Test {
public static void main(String args[]) {
//创建目标对象
Target target = new Target();
//创建代理实例调用处理程序(相当于SpringAOP中切面)
MyInvocationHandler myInvocationHandler = new MyInvocationHandler(target);
//通过Proxy生成一个代理对象obj,obj可以宣称实现了目标对象所实现的接口ITarget
ITargetproxyTarget = (ITarget)Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(), myInvocationHandler);
//从代理对象上调用目标对象的方法
proxyTarget.doSomething();
}
}
运行结果:
>>>代理处理器start...
>>>正在调用Targer.doSomething()方法!
>>>代理处理器end...
Process finished with exit code 0