- 浏览: 1006727 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (675)
- ios (214)
- android-course (5)
- unity3d (7)
- cocos2d (36)
- html5 (3)
- game (5)
- android (42)
- java (57)
- php (12)
- 创业 (10)
- SEO (3)
- 架构 (2)
- 数据库 (3)
- 产品设计 (9)
- 操作系统 (10)
- Web前端 (11)
- 其他 (50)
- GAE (1)
- mac os (8)
- Open Source (2)
- 序列号 (10)
- C (2)
- database (2)
- 算法 (6)
- 设计模式 (1)
- photoshop (1)
- 3dmax (1)
- maya (1)
- opengl (3)
- 游戏设计 (1)
- 趋势 (1)
- cocos2d-x (4)
- shell (3)
- c++ (30)
- lua (5)
- flash (1)
- spring (3)
- mysql (4)
- Git (6)
- xmpp (1)
- cocos2dx (14)
- mac (2)
- 编程规范 (2)
- windows (1)
- linux (5)
- coocs2dx (1)
- ubuntu (2)
- aws (1)
- OPENGLES (1)
- 原画 (1)
最新评论
-
jlees:
Best mobile app testing tool pc ...
iOS + XCode 4 + GHUnit = Mobile TDD+Continuous testing -
ipanda:
楼主,能否给一个Micro CloudFoundry的虚机或者 ...
Cloud Foundry使用及开发向导 -
love_zongming:
谢谢分享。。
visio2007序列号 -
雨花台舞水:
你这才是枪文把
套在 360 黑匣子外面的黑盒子:你被技术型枪稿吓到了么? -
hugh.wang:
改天试试
Mac版魔兽争霸3 1.24e下载
要了解 Spring 的 AOP 就必须先了解的动态代理的原理,因为 AOP 就是基于动态代理实现的。动态代理还要从 JDK 本身说起。
在 Jdk 的 java.lang.reflect 包下有个 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 包下,感兴趣的话可以看看他的源码。
假如有这样一个接口,如下:
public interface SimpleProxy { public void simpleMethod1(); public void simpleMethod2(); }
代理来生成的类结构如下:
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 参数。整个代理就是这样实现的。
Spring AOP 如何实现
从前面代理的原理我们知道,代理的目的是调用目标方法时我们可以转而执行 InvocationHandler 类的 invoke 方法,所以如何在 InvocationHandler 上做文章就是 Spring 实现 Aop 的关键所在。
Spring 的 Aop 实现是遵守 Aop 联盟的约定。同时 Spring 又扩展了它,增加了如 Pointcut、Advisor 等一些接口使得更加灵活。
下面是 Jdk 动态代理的类图:
上图清楚的显示了 Spring 引用了 Aop Alliance 定义的接口。姑且不讨论 Spring 如何扩展 Aop Alliance,先看看 Spring 如何实现代理类的,要实现代理类在 Spring 的配置文件中通常是这样定一个 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>true</value></property> <property name="interceptorNames"> <list> <value>testInterceptor</value> <value>testInterceptor2</value> </list> </property> </bean>
配置上看到要设置被代理的接口,和接口的实现类也就是目标类,以及拦截器也就在执行目标方法之前被调用,这里 Spring 中定义的各种各样的拦截器,可以选择使用。
下面看看 Spring 如何完成了代理以及是如何调用拦截器的。
前面提到 Spring Aop 也是实现其自身的扩展点来完成这个特性的,从这个代理类可以看出它正是继承了 FactoryBean 的 ProxyFactoryBean,FactoryBean 之所以特别就在它可以让你自定义对象的创建方法。当然代理对象要通过 Proxy 类来动态生成。
下面是 Spring 创建的代理对象的时序图:
Spring 创建了代理对象后,当你调用目标对象上的方法时,将都会被代理到 InvocationHandler 类的 invoke 方法中执行,这在前面已经解释。在这里 JdkDynamicAopProxy 类实现了 InvocationHandler 接口。
下面再看看 Spring 是如何调用拦截器的,下面是这个过程的时序图:
发表评论
-
Java反射获取属性
2016-03-21 19:44 938import java.lang.reflect.Field ... -
JetBrains注册码计算(IntelliJ IDEA 15.0注册码激活)
2016-02-01 00:51 892安装前修改时间为2099年等很多年后的时间点,安装后选择免费 ... -
Memcached客户端简介
2014-05-22 11:56 739Memcached客户端性能评测报告 本次memcache ... -
IntelliJ IDEA 的 20 个代码自动完成的特性
2014-04-29 13:43 770在这篇文章中,我想向您展示 IntelliJ IDEA 中最 ... -
Openfire 性能优化
2013-07-26 00:04 1319Openfire 是一个XMPP协议的IM Server ... -
javamd5实例
2013-05-31 11:07 855import java.io.*; import java ... -
网络爬虫之网页更新的判断策略
2012-12-11 09:41 2058摘要:做搜索引擎的时候,网络爬虫(WebSpider)对 ... -
搭建Nexus
2012-12-05 00:43 6011. 首先下载Nexus 从官网htt ... -
从Maven私服获取依赖
2012-12-05 00:23 1039转自:http://blog.csdn.net/shei ... -
创建你的首个Maven项目
2012-12-03 23:56 897要创建你的首个项目,你需要使用Maven的Archet ... -
MyEclipse10.0(Mac)离线下线安装
2012-11-29 22:49 1059离线安装: http://downloads.myeclips ... -
cocosd-android原来是个山寨货
2012-06-13 09:25 9501、技术团队无优势:Cocos2D-Android版本与iPh ... -
正则表达式中问号等特殊字符的转义
2010-11-05 00:09 1594正则表达式中问号等特殊字符的转义 在.NET Framewor ... -
Spring 框架的设计理念与设计模式分析(2)
2010-10-29 14:33 1095如何创建 BeanFactory 工厂 正如图 ... -
Spring 框架的设计理念与设计模式分析(1)
2010-10-29 14:09 1012Spring 的骨骼架构 ... -
删除ie cookie
2010-10-26 11:33 1322Cookie[] cookies = request.g ... -
Spring with Tomcat 中文编码问题的解决方案
2010-10-26 09:55 1267由于各种原因,Java 应用中有关中文编码的问题总是层出不穷, ... -
MyEclipse 8.5 优化实例
2010-10-21 21:26 1657第一步: 取消自动validationvalidation ... -
cookie共享(单点登录)
2010-10-13 17:59 1103正常的cookie只能在一个应用中共享,即一个cooki ... -
spring2.5 freemarker配置
2010-10-12 14:49 1307<?xml version="1.0&q ...
相关推荐
最近使用了springAOP编程,文档里面包含了springAOP的代码示例及详细注释说明,使用的是注解配置模式
Spring之AOP配置文件详解.txt Spring之AOP配置文件详解.txt 帮助你更快张握Java的学习!
Spring 2.x aop配置详解 Spring 2.x aop配置详解 Spring 2.x aop配置详解 Spring 2.x aop配置详解 Spring 2.x aop配置详解 Spring 2.x aop配置详解
springAOP详解
Spring中 aop术语是很难理解的,这里有比较通俗的解释
spring aop详解,详细地讲述了spring中aop的实现,实现原理,实现过程。
spring ioc di aop详解
spring_AOP的MethodBeforeAdvice详
第22天 spring aop详解.docx
基于xml代码的SpringAOP实例详解,适合初步学习springAOP的开发人员了解该功能的使用。
spring-springMVC开发文档和AOP详解,便于学习运用框架知识
Spring框架系列(9) - Spring AOP实现原理详解之AOP切面的实现.doc
主要介绍了详解spring中aop不生效的几种解决办法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
Spring框架系列(11) - Spring AOP实现原理详解之Cglib代理实现.doc
Spring3.0 AOP 详解,包括:概念、原理、实现、及配置代码
(3) spring-aop.jar 这个jar文件包含在应用中使用Spring的AOP特性时所需的类。使用基于AOP的Spring特性,如声明型事务管理(Declarative Transaction Management),也要在应用里包含这个jar包。 (4) spring-...
Spring IOC aop 原理详解
AOP的配置方式有2种方式:xml配置和AspectJ注解方式。下面这篇文章主要给大家介绍了关于spring中aop的xml配置方法的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
Spring 中的Aop面向切面编程详解,具体实例。
spring 的aop的详解如:切面,连接点,通知,切入点,目标对象,代理对象及annotation方式的aop实现和xml方式的事务管理等