- 浏览: 3122651 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (372)
- diy (4)
- linux (19)
- 杂项 (30)
- Swing (21)
- Java2D (21)
- Java3D (5)
- JavaIO (9)
- Java通讯 (5)
- Java设计模式 (3)
- Java多媒体 (0)
- Java算法 (7)
- Spring&EJB (29)
- Javaoffice (4)
- web前端 (23)
- javascript (1)
- php基础 (1)
- eclipse (3)
- 网站相关 (3)
- Apache (4)
- seo (12)
- db (28)
- server (3)
- api (4)
- 异常 (12)
- 计算机网络词汇表 (3)
- 随想录 (52)
- 收藏 (17)
- 犹太人的智慧 (3)
- 多线程 (1)
- jfreechart (7)
- Test (1)
- SorLib (30)
- ruby on rails (1)
最新评论
-
houyutao:
二三四都是错的空字符串也被匹配,*应该改成+
Java中判断字符串是否为数字的五种方法 -
mingyun:
但是 java.util.ArrayList 实现了 remo ...
java.lang.UnsupportedOperationException 解决方案 -
mingyun:
1.因为 Arrays.asList 返回的是 Arrays内 ...
java.lang.UnsupportedOperationException 解决方案 -
leolu007:
用java8新特性String testStr = " ...
java.lang.UnsupportedOperationException 解决方案 -
zhaohuaxishiwzw:
我之前所在的项目就是日本一家证券公司的项目。完全使用的是j2e ...
抛弃EJB(EJB2.0,EJB3.0,EJB4.0)
关键词:Spring,AOP,Proxy,代理,拦截器
上一章:Spring框架的设计理念与设计模式(6)-Ioc容器及BeanFactory工厂 http://javapub.iteye.com/blog/751635
下一章:Spring框架的设计理念与设计模式(8)-代理模式 http://javapub.iteye.com/blog/751652
动态代理的实现原理
要了解Spring的AOP就必须先了解的动态代理的原理,因为AOP就是基于动态代理实现的。动态代理还要从JDK本身说起。
在Jdk的java.lang.reflect包下有个Proxy类,它正是构造代理类的入口。这个类的结构入下:
从上图发现最后面四个是公有方法。而最后一个方法newProxyInstance就是创建代理对象的方法。这个方法的源码如下:
清单6.Proxy.newProxyInstance
这个方法需要三个参数:ClassLoader,用于加载代理类的Loader类,通常这个Loader和被代理的类是同一个Loader类。 Interfaces,是要被代理的那些那些接口。InvocationHandler,就是用于执行 除了被代理接口中方法之外的用户自定义的操作,他也是用户需要代理的最终目的。用户调用目标方法都被代理到InvocationHandler类中定义的唯一方法invoke中。这在后面再详解。
下面还是看看Proxy如何产生代理类的过程,他构造出来的代理类到底是什么样子?下面揭晓啦。
其实从上图中可以发现正在构造代理类的是在ProxyGenerator的generateProxyClass的方法中。ProxyGenerator类在sun.misc包下,感兴趣的话可以看看他的源码。
假如有这样一个接口,如下:
清单7.SimpleProxy类
代理来生成的类结构如下:
清单 8.$Proxy2类
这个类中的方法里面将会是调用InvocationHandler的invoke方法,而每个方法也将对应一个属性变量,这个属性变量m也将传给invoke方法中的Method参数。整个代理就是这样实现的。
从前面代理的原理我们知道,代理的目的是调用目标方法时我们可以转而执行InvocationHandler类的invoke方法,所以如何在InvocationHandler上做文章就是Spring实现Aop的关键所在。
Spring的Aop实现是遵守Aop联盟的约定。同时Spring又扩展了它,增加了如Pointcut、Advisor等一些接口使得更加灵活。
下面是Jdk动态代理的类图:
上图清楚的显示了Spring引用了Aop Alliance定义的接口。姑且不讨论Spring如何扩展Aop Alliance,先看看Spring如何实现代理类的,要实现代理类在Spring的配置文件中通常是这样定一个Bean的 ,如下:
清单9.配置代理类Bean
配置上看到要设置被代理的接口,和接口的实现类也就是目标类,以及拦截器也就在执行目标方法之前被调用,这里Spring中定义的各种各样的拦截器,可以选择使用。
下面看看Spring如何完成了代理以及是如何调用拦截器的。
前面提到Spring Aop也是实现其自身的扩展点来完成这个特性的,从这个代理类可以看出它正是继承了Factory Bean的ProxyFactoryBean,FactoryBean之所以特别就在它可以让你自定义对象的创建 方法。当然代理对象要通过Proxy类来动态生成。
下面是Spring创建的代理对象的时序图:
Spring创建了代理对象后,当你调用目标对象上的方法时,将都会被代理到InvocationHandler类的invoke方法中执行,这在前面已经解释。在这里JdkDynamicAopProxy类实现了InvocationHandler接 口。
下面再看看Spring是如何调用拦截器的,下面是这个过程的时序图:
以上所说的都是Jdk动态代理,Spring还支持一种CGLIB类代理,感兴趣自己看吧。
目录--Spring框架的设计理念与设计模式
Spring框架的设计理念与设计模式(1)-Spring的架构 http://javapub.iteye.com/blog/751539
Spring框架的设计理念与设计模式(2)-Spring的设计理念 http://javapub.iteye.com/blog/751545
Spring框架的设计理念与设计模式(3)-Bean组件 http://javapub.iteye.com/blog/751550
Spring框架的设计理念与设计模式(4)-Context组件 http://javapub.iteye.com/blog/751625
Spring框架的设计理念与设计模式(5)-Core组件 http://javapub.iteye.com/blog/751627
Spring框架的设计理念与设计模式(6)-Ioc容器及BeanFactory工厂 http://javapub.iteye.com/blog/751635
Spring框架的设计理念与设计模式(7)-Spring中AOP特性与实现 http://javapub.iteye.com/blog/751642
Spring框架的设计理念与设计模式(8)-代理模式 http://javapub.iteye.com/blog/751652
Spring框架的设计理念与设计模式(9)-策略模式 http://javapub.iteye.com/blog/751653
上一章:Spring框架的设计理念与设计模式(6)-Ioc容器及BeanFactory工厂 http://javapub.iteye.com/blog/751635
下一章:Spring框架的设计理念与设计模式(8)-代理模式 http://javapub.iteye.com/blog/751652
动态代理的实现原理
要了解Spring的AOP就必须先了解的动态代理的原理,因为AOP就是基于动态代理实现的。动态代理还要从JDK本身说起。
在Jdk的java.lang.reflect包下有个Proxy类,它正是构造代理类的入口。这个类的结构入下:
从上图发现最后面四个是公有方法。而最后一个方法newProxyInstance就是创建代理对象的方法。这个方法的源码如下:
清单6.Proxy.newProxyInstance
public static Object newProxyInstance(ClassLoader loader, Class> [] interfaces, InvocationHandler h) throws IllegalArgumentException { if (h == null) { throw new NullPointerException(); } Class cl = getProxyClass (loader, interfaces); try { Constructor cons = cl.getConstructor(constructorParams); return (Object) cons.newInstance(new Object[] { h }); } catch (NoSuchMethodException e) { throw new InternalError(e.toString()); } catch (IllegalAccessException e) { throw new InternalError(e.toString()); } catch (InstantiationException e) { throw new InternalError(e.toString()); } catch (InvocationTargetException e) { throw new InternalError(e.toString()); } }
这个方法需要三个参数:ClassLoader,用于加载代理类的Loader类,通常这个Loader和被代理的类是同一个Loader类。 Interfaces,是要被代理的那些那些接口。InvocationHandler,就是用于执行 除了被代理接口中方法之外的用户自定义的操作,他也是用户需要代理的最终目的。用户调用目标方法都被代理到InvocationHandler类中定义的唯一方法invoke中。这在后面再详解。
下面还是看看Proxy如何产生代理类的过程,他构造出来的代理类到底是什么样子?下面揭晓啦。
其实从上图中可以发现正在构造代理类的是在ProxyGenerator的generateProxyClass的方法中。ProxyGenerator类在sun.misc包下,感兴趣的话可以看看他的源码。
假如有这样一个接口,如下:
清单7.SimpleProxy类
public interface SimpleProxy { public void simpleMethod1(); public void simpleMethod2(); }
代理来生成的类结构如下:
清单 8.$Proxy2类
public class $Proxy2 extends java.lang.reflect.Proxy implements SimpleProxy{ java.lang.reflect.Method m0; java.lang.reflect.Method m1; java.lang.reflect.Method m2; java.lang.reflect.Method m3; java.lang.reflect.Method m4; int hashCode(); boolean equals(java.lang.Object); java.lang.String toString(); void simpleMethod1(); void simpleMethod2(); }
这个类中的方法里面将会是调用InvocationHandler的invoke方法,而每个方法也将对应一个属性变量,这个属性变量m也将传给invoke方法中的Method参数。整个代理就是这样实现的。
从前面代理的原理我们知道,代理的目的是调用目标方法时我们可以转而执行InvocationHandler类的invoke方法,所以如何在InvocationHandler上做文章就是Spring实现Aop的关键所在。
Spring的Aop实现是遵守Aop联盟的约定。同时Spring又扩展了它,增加了如Pointcut、Advisor等一些接口使得更加灵活。
下面是Jdk动态代理的类图:
上图清楚的显示了Spring引用了Aop Alliance定义的接口。姑且不讨论Spring如何扩展Aop Alliance,先看看Spring如何实现代理类的,要实现代理类在Spring的配置文件中通常是这样定一个Bean的 ,如下:
清单9.配置代理类Bean
<bean id="testBeanSingleton" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="proxyInterfaces"> <value> org.springframework.aop.framework.PrototypeTargetTests$TestBean value> <property> <property name="target"><ref local="testBeanTarget">ref> property> <property name="singleton"><value>truevalue>property> <property name="interceptorNames"> <list> <value>testInterceptorvalue> <value>testInterceptor2value> <list> <property> <bean>
配置上看到要设置被代理的接口,和接口的实现类也就是目标类,以及拦截器也就在执行目标方法之前被调用,这里Spring中定义的各种各样的拦截器,可以选择使用。
下面看看Spring如何完成了代理以及是如何调用拦截器的。
前面提到Spring Aop也是实现其自身的扩展点来完成这个特性的,从这个代理类可以看出它正是继承了Factory Bean的ProxyFactoryBean,FactoryBean之所以特别就在它可以让你自定义对象的创建 方法。当然代理对象要通过Proxy类来动态生成。
下面是Spring创建的代理对象的时序图:
Spring创建了代理对象后,当你调用目标对象上的方法时,将都会被代理到InvocationHandler类的invoke方法中执行,这在前面已经解释。在这里JdkDynamicAopProxy类实现了InvocationHandler接 口。
下面再看看Spring是如何调用拦截器的,下面是这个过程的时序图:
以上所说的都是Jdk动态代理,Spring还支持一种CGLIB类代理,感兴趣自己看吧。
目录--Spring框架的设计理念与设计模式
Spring框架的设计理念与设计模式(1)-Spring的架构 http://javapub.iteye.com/blog/751539
Spring框架的设计理念与设计模式(2)-Spring的设计理念 http://javapub.iteye.com/blog/751545
Spring框架的设计理念与设计模式(3)-Bean组件 http://javapub.iteye.com/blog/751550
Spring框架的设计理念与设计模式(4)-Context组件 http://javapub.iteye.com/blog/751625
Spring框架的设计理念与设计模式(5)-Core组件 http://javapub.iteye.com/blog/751627
Spring框架的设计理念与设计模式(6)-Ioc容器及BeanFactory工厂 http://javapub.iteye.com/blog/751635
Spring框架的设计理念与设计模式(7)-Spring中AOP特性与实现 http://javapub.iteye.com/blog/751642
Spring框架的设计理念与设计模式(8)-代理模式 http://javapub.iteye.com/blog/751652
Spring框架的设计理念与设计模式(9)-策略模式 http://javapub.iteye.com/blog/751653
发表评论
-
Spring,Hibernate,ResultSet和事务
2012-03-21 15:30 2971今天研究了一天的关于Spring,Hibernate,Resu ... -
Spring 注入 log4j
2012-01-12 17:21 6450如果打算将Log4j注入Spring的applicationC ... -
Spring 使用RMI
2011-03-02 15:46 7039Spring使用RMI非常简单,甚至比直接使用RMI还简单。 ... -
Spring DaoMethodAfterAdvice使用例子
2011-02-10 19:08 1314该拦截器会在bean的方法执行后被执行 import j ... -
Spring MethodBeforeAdvice使用例子
2011-02-10 19:05 14426MethodBeforeAdvice该拦截器会在调用dean的 ... -
Spring ThrowsAdvice使用例子
2011-02-10 19:01 9486ThrowsAdvice用于拦截异常 import ja ... -
Spring 消息注册发布的例子
2011-01-19 16:26 1484消息注册发布模式是我们常用的设计模式,Spring也实现了这个 ... -
FileSystemResource 参数为什么必须是绝对路径
2011-01-19 09:22 4597在使用FileSystemResource时,发现FileSy ... -
Spring的价值
2010-11-08 09:59 16291. Spring是一个非侵入性(non-invasive)框 ... -
Spring事务管理例子
2010-09-26 17:18 5889关于spring事务管理以及异常处理的帖子,本论坛争论颇多,各 ... -
Spring和iBatis整合的例子
2010-09-26 16:43 11074OR Mapping的思想相信不用多说大家都明白了,在这里我选 ... -
抛弃EJB(EJB2.0,EJB3.0,EJB4.0)
2010-09-25 17:28 10027关键词:EJB,JEEE,Spring,OO, ... -
J2EE架构图
2010-09-25 11:19 4794以下是J2EE架构图: -
J2EE的核心API与组件(没了EJB,J2EE还剩什么呢)
2010-09-25 10:56 1780J2EE是一种利用Java 2平台来简化企业解决方案的开发、部 ... -
Spring中加载xml配置文件的六种方式
2010-08-31 15:05 41486因为目前正在从事一个项目,项目中一个需求就是所有的功能都是插件 ... -
Spring框架的设计理念与设计模式(9)-策略模式
2010-08-31 13:34 2560关键词:Spring,设计模式,策略模式 上一章:Spring ... -
Spring框架的设计理念与设计模式(8)-代理模式
2010-08-31 13:32 2401关键词:Spring,设计模式,工厂模式,代理模式 上一章:S ... -
Spring框架的设计理念与设计模式(6)-Ioc容器及BeanFactory工厂
2010-08-31 13:20 4793关键词:Spring,Ioc,Bean,Context,Bea ... -
Spring框架的设计理念与设计模式(5)-Core组件
2010-08-31 13:10 2186关键词:Spring,Core,组件, ... -
Spring框架的设计理念与设计模式(4)-Context组件
2010-08-31 13:08 3340关键词:Context,组件,Spri ...
相关推荐
### Spring框架的设计理念与设计模式分析 #### Spring框架的核心组件及其作用 Spring框架以其轻量级、可扩展性以及灵活性闻名于世,是现代Java应用开发的重要基石之一。本篇文章旨在深入探讨Spring框架的设计理念...
### Spring框架的设计理念与设计模式分析 #### 一、Spring框架概述 Spring作为一个现代软件开发领域内备受推崇的框架,其强大的功能与灵活性使得它在众多框架中脱颖而出。本文旨在深入探讨Spring框架的设计理念...
### Spring框架的设计理念与设计模式解析 #### 一、Spring框架的发展历程与背景 Spring框架是由Rod Johnson在2002年开始开发的,最初源于他对Java EE标准框架中存在问题的深刻反思。Rod Johnson在其著作《Expert ...
### Spring框架的设计理念和设计模式分析 #### 一、Spring框架概述 Spring框架自问世以来,因其灵活性、可扩展性和强大的社区支持而迅速成为企业级Java应用开发的标准框架之一。Spring框架的核心价值在于其轻量级...
### Spring框架的核心设计理念及其设计模式解析 #### 一、Spring框架概述 Spring作为一个现代软件开发领域内备受推崇的框架,自2004年正式发布以来,已经在全球范围内获得了广泛的应用和支持。它由Rod Johnson创建...
### Spring框架的设计理念与设计模式分析 #### 一、Spring框架概述 Spring作为一个顶级的Java开发框架,其设计理念和架构模式对于理解和应用该框架至关重要。本文将深入探讨Spring框架的核心设计理念,以及它如何...
### Spring框架的设计理念与设计模式分析 #### 一、Spring框架概述 Spring作为一个现代软件开发领域内备受推崇的框架,其设计理念与设计模式一直是开发者关注的焦点。Spring框架以其轻量级、模块化和可扩展性著称...
Spring Boot AOP(面向切面编程)是一种强大的设计模式,它允许我们在不修改现有代码的情况下,插入额外的功能或监控代码。在Spring框架中,AOP主要用于日志记录、事务管理、性能统计等场景。本示例是关于如何在...
### Spring框架的设计理念与设计模式分析 #### 一、Spring框架概述 Spring作为一个现代软件开发领域内备受推崇的框架,其设计理念与设计模式一直是开发者关注的焦点。Spring框架旨在简化企业级应用程序的开发过程...
此外,Spring框架的成功也证明了设计模式在实际开发中的重要性和有效性。 总结来说,Spring框架的设计理念和核心组件之间的协作为我们提供了一个高效、灵活且易于扩展的企业级开发框架模型。通过对这些核心概念的...
Spring还广泛运用了设计模式,例如工厂模式用于Bean的创建,代理模式实现AOP,单例模式管理Bean的实例,以及观察者模式支持事件驱动的编程。这些设计模式的使用使得Spring具有高度的灵活性和可扩展性。 Spring的...
### Spring框架的设计理念与设计模式解析 #### 一、Spring框架的起源与发展 Spring框架的创始人Rod Johnson在2002年的著作《Expert One-to-One J2EE Design and Development》中,对当时Java EE框架存在的问题进行...