Spring AOP 本质(5)
版权声明:原创作品,如需转载,请与作者联系。否则将追究法律责任。 |
Spring AOP 本质(5)
Spring 的AOP核心技术还是动态代理,Spring的代理实现方式有两种,默认使用CGLIB,也可以选择使用JDK的代理,这一切对开发人员来说是透明的,可以不关心这些。
但是,Spring实在是太强了,太吸引人了,以至于不得不研读其底层的API实现。
Spring代理生成的过程还是和JDK有一定区别的,经过研读分析Spring AOP底层源码,画出了其原理图。并且为了对比JDK的动态代理的实现,也给出JDK动态代理原理图。
![]() 下面,给出个JDK实现动态代理的例子,Spring的例子在AOP本质系列中比比皆是,故此不再给出。
/** * Created by IntelliJ IDEA.<br> * <b>User</b>: leizhimin<br> * <b>Date</b>: 2008-5-9 14:16:18<br> * <b>Note</b>: 目标抽象接口 */ public interface ITarget { public void doSomething(); } /** * Created by IntelliJ IDEA.<br> * <b>User</b>: leizhimin<br> * <b>Date</b>: 2008-5-9 14:17:03<br> * <b>Note</b>: 目标类 */ 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.<br> * <b>User</b>: leizhimin<br> * <b>Date</b>: 2008-5-9 14:23:07<br> * <b>Note</b>: 代理处理器实现 */ 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.<br> * <b>User</b>: leizhimin<br> * <b>Date</b>: 2008-5-9 14:27:20<br> * <b>Note</b>: 客户端 */ public class Test { public static void main(String args[]) { //创建目标对象 Target target = new Target(); //创建代理实例调用处理程序(相当于SpringAOP中切面) MyInvocationHandler myInvocationHandler = new MyInvocationHandler(target); //通过Proxy生成一个代理对象obj,obj可以宣称实现了目标对象所实现的接口ITarget ITarget proxyTarget = (ITarget) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), myInvocationHandler); //从代理对象上调用目标对象的方法 proxyTarget.doSomething(); } } 运行结果:
>>>代理处理器start... >>>正在调用Targer.doSomething()方法! >>>代理处理器end... Process finished with exit code 0 呵呵,周末愉快!!
本文出自 “熔 岩” 博客,转载请与作者联系! 本文出自 51CTO.COM技术博客 |




leizhimin
博客统计信息
热门文章
最新评论
友情链接